在分布式系统中想要做到把异步的操作变成同步的操作极其苦难,这涉及到很多原因,例如全世界的世界都是在并发一个数据,如何保证对个分区数据是为一个单体副本,而不是多个数据版本。前面的博文中提到了目前很多 NoSQL 采用的 Quorum 协议来做的,要求 W + R > N 来实现保证一致性,这种一致性保证在完全异步的世界里完全是靠着的存储数据版本概率,或者把数据版本冲突交给了客户端来解决,没有在服务端提供优化的解决方案给业务层应用。

目前分布式系统数据操作一致性,无能采用是完全同步复制还是异步复制,都不能友好解决数据从主节点写入到从节点的时间延迟问题,这和 DNS 一样,我曾经在开发一个电子发卡系统时就遇到类似的问题:二维码过期问题登录系统伪造凭证 的问题。


可线性化和可串行化

可线性化和可串行化有着明显的区别,可串行化是 ACID 中事务最强的隔离级别的实现,而可线性化针对的是内存寄存器中存储的值,在并行操作的时候能不能将操作顺序变为可线性的展示,能读取最新最后一次操作的值,最常见应用是各个编程语言提供的 CAS 操作包。在 Java 中,CAS 操作通常是通过 java.util.concurrent.atomic 包中的类来实现,比如 AtomicBoolean、AtomicInteger、AtomicLong 等。这些类提供了一些原子操作方法,比如 compareAndSet()、getAndSet() 等。

CAS 是 "Compare and Swap" 的缩写,是一种常见的原子操作,通常用于并发编程中的线程同步和互斥操作。CAS 操作包括三个参数:内存地址(或者指向内存地址的指针)、旧的预期值和新的值。CAS 操作会比较当前内存地址中的值和旧的预期值是否相等,如果相等,就将内存地址中的值修改为新的值,否则不做任何操作。

可线性化是一个更严格的一致性模型,要求操作必须像在单机上执行的那样,以确定的顺序执行;而可串行化则是一个更宽松的一致性模型,只要求事务按照某种顺序依次执行即可。在实际应用中,可线性化和可串行化都有着广泛的应用。例如,在数据库系统中,事务必须是可串行化的,以确保数据的一致性和正确性;而在分布式系统中,网络操作必须是可线性化的,以确保操作的正确性和可靠性。但是分布式系统为了高可用性,提供了多个副本,想要达到多个副本表现出来只有一个数据副本很难做到。

在上图这个例子使用了 quorum 协议的实现,3 个数据副本存在组成一个分布式集群,当一条记录内写入到系统中,3 个请求达到服务器端时延迟不一样,此时在集群采用 quorum 协议满足了弱一致性条件,但是不满足可线性条件,在复制数据副本的过程中这段数据如果有不同用户读取数据可能会出现时间倒流情况。


其他资料

便宜 VPS vultr
最后修改:2023 年 07 月 05 日
如果觉得我的文章对你有用,请随意赞赏 🌹 谢谢 !