共识和一致性与时间和事件顺序 | 青训营笔记

181 阅读3分钟

这是我参与「第五届青训营」伴学笔记创作活动的第 10 天

本节重点

了解什么是一致性,了解时间和事件顺序,了解什么是 Lamport 逻辑时钟。

共识和一致性

前面学习了有关共识的一些知识,下面是一些关于一致性的知识。

一致性分为两类最终一致性和线性一致性。具体解释如下图:

image.png

时间和事件顺序

最后介绍了一个系统模型 —— 时间和事件顺序,最早由 1978 年 Leslie Lamport 发表的论文提及,包括大名鼎鼎的 Paxos 算法也是 Lamport 的杰作之一。

这篇论文讲了啥?

首先为时间顺序定义了一个概念,叫做 "happened before" —— 如果 a 和 b 是在相同节点上的两个事件,a 发生在 b 之前,则定义:a -> b;如果事件 a 表示某个节点发送某条信息,b 是另一个节点接收这条信息,则有 a -> b。

显然,如果 a -> b 并 b -> c,则有 a -> c。

当且仅当 a (x)-> b 且 b (x)-> a 时,称两个事件并发的。

推到可由下图得出:

image.png

Lamport 逻辑时钟

逻辑时钟是为了区分现实中的物理时钟提出来的概念,一般情况下我们提到的时间都是指物理时间,但实际上很多应用中,只要所有机器有相同的时间就够了,这个时间不一定要跟实际时间相同。更进一步,如果两个节点之间不进行交互,那么它们的时间甚至都不需要同步。因此问题的关键点在于节点间的交互要在事件的发生顺序上达成一致,而不是对于时间达成一致。逻辑时钟指的是分布式系统中用于区分事件的发生顺序的时间机制。

分布式系统中按是否存在节点交互可分为三类事件,一类发生于节点内部,二是发送事件,三是接收事件。注意:以下文章中提及的时间戳如无特别说明,都指的是Lamport 逻辑时钟的时间戳,不是物理时钟的时间戳。

Lamport 逻辑时钟的定义:

Clock Condition. 对于任意事件a, b:如果a -> b,那么C(a) < C(b), 反之不然, 因为有可能是并发事件;

C1. 如果 a 和 b 都是进程Pi里的事件,并且 a 在 b 之前,那么Ci(a) < Ci(b);

C2. 如果 a 是进程 Pi 里关于某消息的发送事件,b 是另一进程Pj 里关于该消息的接收事件,那么Ci(a) < Cj(b).

原理如下:

15489326333600.jpg

其好处就是:它能为每个分布式事物,定义一个逻辑时间戳,可以让我们更好地了解和解决分布式数据库当中隔离性和一致性的问题。

本节小结

本节学习了一致性、时间与事件顺序和 Lamport 逻辑时钟,并通过 Lamport 逻辑时钟更好地了解和解决了分布式数据库中的一些问题~