BruceChen7 / gitblog

My blog
6 stars 1 forks source link

时钟 #19

Open BruceChen7 opened 4 years ago

BruceChen7 commented 4 years ago

资料来源

如何确定分布式系统中事件的发生顺序

首先,我们来观察一个「如何确定分布式系统中事件的发生顺序」的问题:

在这个分布式系统中,有三个独立的进程A、B、C:

要实现因果一致的系统,仅仅是依靠进程接收到时间发生的数据是不准确的

全局物理时钟

对于上面提到的两个问题,我们试图解决的一个天然想法是, 记录每个分布式进程中发生事件的原始时间戳, 并把它连同事件本身扩散到其他节点,这样其他节点的视角上就可以观察到完整的因果顺序了。

问题是:不同节点的物理时钟其实是不一致的,而且无法做到精确一致。

原因

全序和偏序 全序就是在偏序的基础上,要求全部元素都必须可以比较。举例来说:

现在我们回头看,寻求全局时钟为分布式节点中的时间做顺序标定的方式, 其实是在寻求一种全序关系来描述分布式中的事件顺序, 而且是严格对齐真实的物理时钟的全序关系。

我们的分布式系统,和相对论有很多相似之处:

逻辑时钟尝试用通过进程间创造通信以添加因果关系的方式来对分布式中的事件顺序做描述。

通过通信创造因果关系 这个设计对于刻画分布式系统中的事件顺序有多么重要。

Lamport Logical Clocks

首先我们需要明确一点: 逻辑时钟并不度量时间本身,仅区分事件发生的前后顺序

事件的分类

道理是显然的:如果事件e 导致了事件 j,那么一定e 发生在j的前面

Lamport时钟算法

实际上证明事件a发生在事件b之前,那么Ca < Cb,反之,则不成立。 因为a和b之间可能存在并发。

Lamport的逻辑时钟算法构建了一个全序(total ordering)时钟来描述事件顺序, 但是我们知道「happened before」是一个偏序关系, 用全序关系的一维计数器来描述「happened before」的话, 就会导致无法等价化描述的结果, lamport时钟的缺陷在于:如果两个事件并不相关,那么这个时钟给出的大小关系则没有意义, 这个缺陷其实恰好就是全序和偏序的不同点而已。

所以,要准确描述事件顺序,我们终究要寻求偏序方法

向量时钟

向量时钟,其实是对Lamport的时钟的一个延伸思考,算法结构一致,只是多传了一部分信息。

对每个进程,定义一个向量 VC,向量的长度是n, n是进程数目。具体的算法见图。

向量有序,则事件有序。(充要)向量平行,则事件并发(充要)。

下面图13是一个向量时钟算法的示意图:

image

和lamport时钟算法示意图一样:(红色点、蓝色点、黑灰色点..)图的右方部分,总结了这个算法对不同事件的操作:

不足

总结