向量时钟算法

简介

向量时钟是一种一致性协议,是在分布式环境下各种操作或事件产生偏序关系的一种技术,它可以检测操作或事件的并行冲突,用来保持系统的一致性。
优点:
向量时钟的主要优势在于,节点之间不需要同步时钟,即不需要全局时钟。不需要在所有节点上存储、维护一段数据的版本数。

算法运行流程

首先明确一下符号的含义:

向量时钟实例
Vi代表第i个节点上的时钟信息,Vi[j]表示第i个节点所了解的第j个节点的时钟信息。以第2行为例,该行为V1节点的向量时钟(1,4,0),其中"1"表示V1节点所了解的V0节点上的时钟值;"0"表示V1节点所了解的V2节点上的时钟值;"4"表示V1节点自身所维护的时钟值。可以把这个看成二维vector。i = j的时候永远是同步的。
向量时钟算法_第1张图片
下面具体描述向量时钟在分布式系统中的运维规则。

规则1:

初始时,我们将每个节点的值设置为0。每当有数据更新发生,该节点所维护的时钟值将增长一定的步数d,d的值通常由系统提前设置好。该规则表明,如果操作a在操作b之前完成,那么a的向量时钟值大于b向量时钟值。d通常是1,比较方便。

向量时钟根据以下两个规则进行更新。

规则2:

在节点i的数据更新之前,我们对节点i所维护的向量Vi进行更新:

Vi[i]= Vi[i]+d(d > 0)

该规则表明,当Vi[i]处理事件时,其所维护的向量时钟对应的自身数据版本的时钟值将进行更新。

规则3:

当节点i向节点j发送更新消息时,将携带自身所了解的其他节点的向量时钟信息。节点j将根据接收到的向量与自身所了解的向量时钟信息进行比对,然后进行更新:这个的原理是如果他的值越大,代表他离现在越近,数据越新。放到表格里就是纵向去比。

Vj[k] = max{Vi[k], Vj[k]}

在合并时,节点j的向量时钟每一维的值取节点i与节点j向量时钟该维度值的较大者。两个向量时钟是否存在偏序关系,通过以下规则进行比较:对于n维向量来说,Vi > Vj,如果任意k(0≤k≤n 1)均有Vi[k] > Vj[k]。

实战分析

A、B、C、D四个人计划下周去爬长城。A首先提议周三去,此时B给D发邮件建议周四去,他俩通过邮件联系后决定周四去比较好。之后C与D通电话后决定周二去。然后,A询问B、C、D三人是否同意周三去,C回复说已经商量好了周二去,而B则回复已经决定周四去,D又联系不上,这时A得到不同的回复。如果他们决定以最新的决定为准,而A、B、C没有记录商量的时间,因此无法确定什么时候去爬长城。

(1)

在初始状态下,将四个人(四个节点)根据规则1将自身所维护的向量时钟清零,如下所示:

X Y Z W
A 0 0 0 0
B 0 0 0 0
C 0 0 0 0
D 0 0 0 0

(2)A提议周三出去,所以Ai [X] = 0+1 = 1

A首先根据规则2对自身所维护的时钟值进行更新,同时将该向量时钟发往其他节点。B、C、D节点在接收到A所发来的时钟向量后发现它们所知晓的A节点向量时钟版本已经过时,因此同样进行更新。更新后的向量时钟状态如下所示:

X Y Z W
A 1 0 0 0
B 1 0 0 0
C 1 0 0 0
D 1 0 0 0

(3)B和D通过邮件进行协商

B觉得周四去比较好,那么此时B首先根据规则2更新向量时钟版本(B(1,1,0,0)),然后将向量时钟信息发送给D(D(1,0,0,0))。D通过与B进行版本比对,发现B的数据较新,那么D根据规则3对向量时钟更新,如下所示。PS:谁先更新谁是老大。

X Y Z W
A 1 0 0 0
B 1 1 0 0
C 1 0 0 0
D 1 1 0 0

4)C和D进行电话协商

C觉得周二去比较好,那么此时C首先更新自身向量时钟版本(C(1, 0, 1, 0)),然后打电话通知D(D(1, 1, 0, 0))。D根据规则3对向量时钟进行更新。

此时系统的向量时钟如下所示:

X Y Z W
A 1 0 0 0
B 1 1 0 0
C 1 0 1 0
D 1 1 1 0

最终,通过对各个节点的向量时钟进行比对,发现D的向量时钟与其他节点相比具有偏序关系。因此该系统将决定"周二"一起去爬山。

在实际情况中,D在接收到B和C的更新消息后,根据规则3更新了自身的向量时钟。这导致了D的向量时钟在所有维度上都不小于其他节点的向量时钟,形成了偏序关系。这种偏序关系表示D的数据版本相对于其他节点来说是较新的,因此系统最终选择以D的决定为准。
向量时钟算法_第2张图片

你可能感兴趣的:(#,大数据计算基础,算法,大数据,分布式事务处理)