什么是顺序一致性?

标签: 分布式

保留所有版权,请引用而不是转载本文(原文地址 https://yeecode.top/blog/113/ )。

在学习分布式系统时,我们需要清晰理解“一致性(Consistency)”这一概念。

分布式系统中的“一致性(Consistency)”是说数据副本存放在分布式系统中的不同节点上,如果用户修改了系统中的数据,则在一定时间后,用户能从系统中读取到修改后的数据。

或者换一种说法,用户在分布式系统的某个节点上进行了变更操作,则在一定时间后,用户能从系统的任意节点上读取到这个变更结果。[^1]

而一致性有强弱之分,这就是总要强调“经过一定时间后”的原因。

那这个时间到底要多长呢?在这个时间之前读取又会得到怎样的结果呢?回答这个问题便涉及到一致性的强弱概念。也正是根据一致性强弱的不同,我们把一致性分为了很多类。

而其中,顺序一致性(Sequential Consistency)是非常重要且基础的一类。

线性一致性就是以顺序一致性为基础定义的。 顺序一致性在1979年提出,线性一致性则是1987年在顺序一致性的基础上增加了约束得来的。

顺序一致性(Sequential Consistency)提出了两个约束:

我们可以根据这两个约束来判断一个系统是否满足顺序一致性:如果在系统中找不到任何一个符合上述两个约束的全局事件历史,则说明该系统一定不满足顺序一致性;如果能找到一个符合上述两个约束的全局事件历史,这说明系统在这段过程内是满足顺序一致性的。

这个约束描述起来可能稍有拗口,我们通过示例来解释说明。

假设分布式系统存在A、B、C三个节点,初始值x=0、y=0,各个节点上发生的事件如图所示。

不满足顺序一致性的事件

B2读出y=3意味着在全局历史中A2在B2之前(记作A2-B2),B3读出x=0意味着全局历史中B3在A1之前(记作A2-B2,且B3-A1),而节点A的历史决定了A1在A2之前(记作B3-A1-A2-B2),节点B的历史决定了B2在B3之前(记作B3-A1-A2-B2,且B2-B3)。显然不存在一个全局历史能够将A1、A2、B2、B3排列起来,且满足上面的各个排序要求。

而下图所示的事件是满足顺序一致性的。

满足顺序一致性的事件

在上图中,我们能够找到满足以上约束的全局历史,例如:

这样的全局历史还可以找出很多,这意味着目前的这些片段是满足顺序一致性的。而如果一个系统的工作中,其全部事件都能满足顺序一致性,那这个系统就满足顺序一致性。

可见,明确顺序一致性的两个约束是十分重要的。基于这两个约束,我们就可以判断一个分布式系统是否满足顺序一致性。

在后面的文章中,我们会在顺序一致性的基础上,介绍线性一致性。这也是一个十分常用的一致性。

关于更多一致性的内容,以及分布式系统的知识,大家可以参照下面的书籍。

分布式系统原理与工程实践

《分布式系统原理与工程实践》

书籍对常用的一致性进行了详细的介绍,还介绍了一致性相关算法等。对大家体系化地掌握这些知识很有帮助。

书籍部分目录

这本书对分布式系统相关的理论、实践、工程知识均进行了详细的介绍,层层递进,有助于大家建立完整的分布式系统知识体系。当然,书中也对各种“一致性”级别也进行分析,还分析了Paxos算法、Zookeeper等。并且还发行了繁体版


好了,我是程序员易哥。

这回就说这么多!

可以关注我!等我下回接着说!

可以访问个人知乎阅读更多文章:易哥(https://www.zhihu.com/people/yeecode),欢迎关注。

作者书籍推荐