为什么需要向量时钟
Lamport 逻辑时钟算法中每个进程只拥有自己的本地时间,没有其他进程的时间,导致无法描述事件的因果关系。如果每个进程都能够知道其他所有进程的时间,是否就能够得到事件的因果关系了呢?为此,有人提出了向量时钟算法。
向量时钟的原理
用VC(a)来表示事件a的Vector Clock,有如下性质:VC(a) < VC(b)可以推出事件a causally 发生在事件b之前(也就是事件a发生在事件b之前)。
假设有N个进程,每个进程Pi维护一个向量VC,也就是Pi的Vector Clock,这个向量VC有如下属性:
VCi[i] 是到目前为止进程Pi上发生的事件的个数
VCi[k] 是进程Pi知道的进程Pk发生的事件的个数(即Pi对Pj的知识)
利用向量时钟判断因果关系
分布式系统中的事件要么是有因果关系(先后顺序),
要么是没有因果关系(同时发生)。向量时钟V1上的各个时间分量如果全部都小于等于V2上各个时间分量,则认为V1比V2早。向量时钟V1上的各个时间分量有的比V2上的时间分量大,有的比其小,则认为是同时发生。
向量时钟的应用——冲突检测
基于向量时钟我们可以获得任意两个事件的顺序关系,结果要么是有因果关系(先后顺序),要么是没有因果关系(同时发生)。通过向量时钟,我们能够识别到如果两个数据更新操作是同时发生的关系,那么说明出现了数据冲突。注意是检测(发现问题),它并不能解决数据冲突。