向量时钟

向量时钟(Vector Clock)[8, 9]是一种在分布式环境中为各种操作或事件产生偏序值的技术,它可以检测操作或事件的并行冲突,用来保持系统的一致性。

向量时钟方法在分布式系统中用于保证操作的有序性和数据的一致性。向量时钟通常可以被认为是一组来自不同节点的时钟值Vi[1]、Vi[2]、…、Vi[n]。在分布式环境中,第i个节点维护某一数据的时钟时,根据这些值可以知道其他节点或副本的状态,例如Vi[0]是第i个节点所了解的第0个节点上的时钟值,而Vi[n]是第i个节点所了解的第n个节点上的时钟值。时钟值代表了节点上数据的版本信息,该值可以是来自节点本地时间的时间戳或者是根据某一规则生成有序数字。

以3副本系统为例,该系统包含节点0、节点1和节点2。某一时刻的状态可由下图来表示。

这里写图片描述

该图表示当前时刻各节点的向量时钟为:

节点0:V0(4,2,0)

节点1:V1(1,4,0)

节点2:V2(0,0,1)

在上图中,Vi代表第i个节点上的时钟信息,Vi[j]表示第i个节点所了解的第j个节点的时钟信息。以第2行为例,该行为V1节点的向量时钟(1,4,0),其中”1”表示V1节点所了解的V0节点上的时钟值;”0”表示V1节点所了解的V2节点上的时钟值;”4”表示V1节点自身所维护的时钟值。

下面具体描述向量时钟在分布式系统中的运维规则。

规则1:

初始时,我们将每个节点的值设置为0。每当有数据更新发生,该节点所维护的时钟值将增长一定的步数d,d的值通常由系统提前设置好。

该规则表明,如果操作a在操作b之前完成,那么a的向量时钟值大于b向量时钟值。

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

规则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]。

如果Vi既不大于Vj且Vj也不大于Vi,这说明在并行操作中发生了冲突,这时需要采用冲突解决方法进行处理,比如合并。

如上所示,向量时钟主要用来解决不同副本更新操作所产生的数据一致性问题,副本并不保留客户的向量时钟,但客户有时需要保存所交互数据的向量时钟。如在单调读一致性模型中,用户需要保存上次读取到的数据的向量时钟,下次读取到的数据所维护的向量时钟则要求比上一个向量时钟大(即比较新的数据)。

相对于其他方法,向量时钟的主要优势在于:

节点之间不需要同步时钟,即不需要全局时钟。

不需要在所有节点上存储、维护一段数据的版本数。

下面我们通过一个例子来体会向量时钟如何维护数据版本的一致性。

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

下面我们使用向量时钟来”保证数据的一致性”:为每个决定附带一个向量时钟值,并通过时钟值的更新来维护数据的版本。在本例中我们设置步长d的值为1,初始值为0。

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

A(0,0,0,0)

B(0,0,0,0)

C(0,0,0,0)

D(0,0,0,0)

(2)A提议周三出去

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

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对向量时钟更新,如下所示。

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对向量时钟进行更新。

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

A(1,0,0,0)

B(1,1,0,0)

C(1,0,1,0)

D(1,1,1,0)

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

下面我们用图示来描述上述过程,如下图所示。

这里写图片描述

该方法中数据版本可能出现冲突,即不能确定向量时钟的偏序关系。如图2-5所示,假如C在决定周三爬山后并没有将该决定告诉其他人,那么系统在此刻将不能确定某一数据向量时钟的绝对偏序关系。比较简单的冲突解决方案是随机选择一个数据的版本返回给用户。而在Dynamo中系统将数据的不一致性冲突交给客户端来解决。当用户查询某一数据的最新版本时,若发生数据冲突,系统将把所有版本的数据返回给客户端,交由客户端进行处理。

该方法的主要缺点就是向量时钟值的大小与参与的用户有关,在分布式系统中参与的用户很多,随着时间的推移,向量时钟值会增长到很大。一些系统中为向量时钟记录时间戳,某一时间根据记录的时间对向量时钟值进行裁剪,删除最早记录的字段。

向量时钟在实现中有两个主要问题:如何确定持有向量时钟值的用户,如何防止向量时钟值随着时间不断增长。

2.5 小结

本章介绍了关于海量数据存储以及NoSQL数据库中的数据一致性理论。CAP理论为NoSQL数据管理系统的基石,该理论告诉我们强一致性、可用性和分区容错性不能同时满足。在进行系统设计的时候必须在这三者之间做出权衡,需根据不同的应用和环境进行系统设计。

为了提高系统的效率,在大多数的系统中采用的是”最终一致性策略”,而放弃了CAP理论中的”强一致性”要求。BASE模型正是这一方面应用的典型理论代表,该方法通过牺牲一致性和孤立性来提高可用性和系统性能,其中BASE分别代表:基本可用、软状态和最终一致性。

在数据一致性的最终实现上,不同的系统采用不同的策略,包括:Quorum的NWR策略、两阶段提交协议、Paxos、时间戳、向量时钟等,本章只列举了其中的一部分,现实中还有更多的实现。但是这些系统或者模型均以CAP理论为基石,并依据不同的情况作出权衡,例如Paxos具有较强的一致性,但是系统延迟较大。此外,很多系统中采用多种策略的结合,例如,NWR策略经常与向量时钟一同使用,用以解决数据的一致性问题。

  • 1
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值