分布式系统-向量时钟(Vector Clock)
Leslie Lamport的论文中《Time, Clocks and the Ordering of Events in a Distributed System》首次提出了逻辑时钟的概念,解决了分布式系统的事件全序关系,但是对于同时发生的事件无法定义,导致无法描述事件的因果关系。而Vector Clock是在Lamport时间戳基础上演进的另一种逻辑时钟方法,它通过vector结构不但记录本节点的Lamport时间戳,同时也记录了其他节点的Lamport时间戳,因此能够很好描述同时发生关系以及事件的因果关系。当系统有N个进程时,则存在N个逻辑时钟向量,一个进程对应一个时钟。
为什么需要向量时钟
我下面会举两个例子对这个问题进行说明,不过我们需要先回顾一下Lamport逻辑时钟算法,它提供了一种判断分布式系统中事件全序关系的方法:如果 a -> b,那么 C(a) < C(b),但是 C(a) < C(b) 并不能说明 a -> b。也就是说**C(a) < C(b) 是 a -> b 的必要不充分条件,我们不能通过 Lamport 时间戳对事件 a、b 的因果关系进行判断。**以下图为例
假设有三个进程在发消息,Ts(mi)表示消息mi的发送时间戳,Tr(mi)表示消息mi的接受时间戳,显然有Ts(mi)<Tr(mi),但是这个逻辑时钟无法直接对相应事件进行因果关系判断。
我们可以发现在进程P2中,Tr(m1)<Ts(m3),说明m3是在m1被接收之后发送的,也就是说m3的发送跟m1的接收有关系。但是我们可以观察Tr(m1)<Ts(m2),但实际上m2的发送和m1的接收没有因果关系。
再举一个例子:
在使用分布式数据库的时候,不同节点数据的一致性一向是一个经典且难以解决的问题,而这个问题的根源是难以实现一个全局统一的时钟。比如: