什么是线性一致性?

标签: 分布式

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

线性一致性(Linearizability)又叫原子一致性(Atomic Consistency)这是现实中能实现的最高级的一致性级别,当然也是分布式系统的最高追求。

然而要理解线性一致性(Linearizability),则必须先要理解顺序一致性(Sequential Consistency)。对于顺序一致性不是很理解的同学,可以翻看我之前的文章。

我们这里就直接给出顺序一致性的两个约束:

线性一致性在顺序一致性的基础上增加了一个约束:

于是,线性一致性的约束变为了三个,即:

有了新增的这一个约束之后,我们就可以发现满足顺序一致性的下图(这就是我们在讨论顺序一致性时用过的图)不满足线性一致性。

满足顺序一致性的事件

因为根据线性一致性新增的约束,B1的开始时间晚于A1的结束时间,那么在全局历史中,A1要在B1之前。但是B1却没有读到A1的操作结果,这显然是相悖的。

同样的,A2要在B2之前,两者的结果是相悖的;C1要在B1之前,C1读到了A1的结果但B1却没有,这两个结果也是相悖的。

于是上图中的事件顺序无法同时满足线性一致性的三个约束。

在时序图中,越往下代表时间越晚。通过时序图我们可以清楚地知道各个节点中事件在全局的先后顺序。

然而我们要明确,时序图实际是全局上帝视角。在计算机系统看来,每一个节点都只知道自身时间的先后顺序(例如A1在A2之前),但是却不知道节点间的先后顺序(例如A1到底是在B2之前还是B2之后)。

但是线性一致性要求节点间事件满足全局先后顺序的约束,这就要求分布式系统必须协调出一个全局同步的时钟。这一全局时钟不要求绝对精准,只要求能区分出事件的先后顺序即可。但即便如此,这也是一个成本很高的工作。因此,线性一致性新增加的约束是一个很强的约束

这就是为什么我们说线性一致性是分布式系统的最高追求。因为,它极为严格。

全局锁就是一个常用的全局同步时钟。全局锁将全局时间分割为锁存在前、锁存在期间、锁释放后三段。这三段的先后关系是绝对成立的。基于此,便可以实现事件先后顺序的区分。

如下图中,假设我们为B1事件增加全局的锁,则A1、A2、C1事件发生在锁存在前,一定在在B1事件之前;C2时间发生在锁释放后,一定在B1事件之后。这样,便确定了B1事件在全局中的位置为晚于A1、A2、C1,且早于C2。

全局锁的作用

线性一致性通过“事件A的开始时间晚于事件B的结束时间”这样的描述增加了对节点间先后事件的限制,但没有对并发事件进行限制。下图中,A1和C1是并发的。事件C1无论读出的是x=5还是x=0都不违反线性一致性约束,因为这两个事件是并发的。

事件的并发示意图

可什么样的系统能做到线性一致性呢?

为了实现线性一致性,可以将数据的变更和同步看作一个整体,不能允许外界读取一个已经变更但尚未完全同步的数据。

最简单的,我们可以给每个操作都增加锁,从而使得全局串行化,保证系统满足线性一致性要求,如下图所示。

系统内部节点同步示意图

但全局串行化对系统并发性能的损耗太大,因此很少被实际使用。在具体实施过程中,存在许多效率更高的满足线性一致性的算法,两阶段提交算法、三阶段提交算法。

对于上述这些算法,我们就不再展开讲了。感兴趣的读者可以阅读《分布式系统原理与工程实践》一书。

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

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

书中对上述算法的原理和使用进行了明确的剖析,并且对上述这些算法满足线性一致性进行了证明。对大家体系化地掌握这些知识很有帮助。

书籍部分目录

另外这本书对分布式系统相关的理论、实践、工程知识均进行了详细的介绍,层层递进,有助于大家建立完整的分布式系统知识体系。涉及一致性、共识、Paxos、分布式事务、服务治理、微服务、幂等、消息系统、Zookeeper等。并且还发行了繁体版。

另外,在学习分布式系统时,因为涉及到的理论、框架很多。所以大家更要理清知识脉络,否则容易学得越多越混乱。


好了,我是程序员易哥。

这回就说这么多!

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

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

作者书籍推荐