分布式系列:Vector clock

  Lamport逻辑时钟的问题

  Lamport逻辑时钟的第一个问题在于,它的全序关系不是唯一确定的。因为当逻辑时钟的值一致的时候,需要选择进程的全序关系R,而选择的R具有任意性,比如可以比较进程编号,也可以比较进程运行服务器的ip地址。这样意味着R的不同,会导致事件顺序的不同。

  Lamport逻辑时钟的第二个问题在于,它的大小无法准确描述事件先后顺序。假设已知C(a) C(b),也无法得到任何结论。例如下图中57时刻的事件,尽管其逻辑时间小于61,但是实际上它是在61事件之后发生的。

  

图片描述

 

  Lamport逻辑时钟的第三个问题在于,它丢失了一些依赖细节。例如下图中,当进程p2接收到消息,把时钟改成3的时候,其实这个3是由p1的2产生的,这一依赖细节就完全消失了。

  

图片描述

 

  Vector clock的实现

  在Lamport逻辑时钟的基础上,人们又研究出了vector clock,vector clock本质上可以认为是Lamport逻辑时钟的数组,即Lamport逻辑时钟的向量,因此得名。

  按照维基百科的说法,vector clock是在以下两篇文章中各自独立出现的:

  《Timestamps in Message-Passing Systems That Preserve the Partial Ordering》

  《Virtual Time and Global States of Distributed Systems》

  Vector clock定义了一种happen before关系,当且仅当两个两个事件在所有的可能性中都具有因果关系时,它们才具有这种关系。假设VC(a)和VC(b)分别是a和b事件的vector clock值,如果VC(a) VC(b),那么a happen before b。

  假设一共n个进程,则每个进程i维护n维向量(长度为n的数组)VCi,VCi初始值都为0。其中VCi[j]代表进程i知道的进程j的最新时间。

  关于vector clock的实现,很多资料众说纷纭,这里我们只参考上述两篇文章。

  《Virtual Time and Global States of Distributed Systems》

  VC的更新规则如下:

  进程i执行任何事件之前,将VCi[i]的值+1

  进程i发送消息m时,将m的时间戳设置为VCi

  进程i接收消息m时,取得m的时间戳t,对VCi中的每个分量k,执行VCi[k]=max(VCi[k],t[k])

  文中示意图如下

  

图片描述

 

  这个和维基百科上的图片效果是一样的

  

图片描述

 

  这种情况下,对于VC(a)和VC(b),如果同时满足:

  对于每个分量x,都有VC(a)[x] = VC(b)[x]

  存在分量y,使得VC(a)[y] VC(b)[y]

  那么VC(a) VC(b)。

  《Timestamps in Message-Passing Systems That Preserve the Partial Ordering》中的异步模型

  VC的更新规则有所不同,主要体现在发送消息的进程所在的分量也要递增。例如下面的文章示意图中,发送事件a发生在[1,0,0],接收事件m发生在[2,2,0],注意向量的第一个分量也加1了。

  

图片描述

 

  这种情况下,假设事件a和b分别发生在进程i和j中,如果VC(a)[i] VC(b)[i],则说明a happen before b

  《Timestamps in Message-Passing Systems That Preserve the Partial Ordering》中的同步模型

  这时网络通信变成同步模型了,发送事件的时间和接收事件的时间变成一样了,文中图示如下:

  

图片描述

 

  这种情况下,假设事件a和b分别发生在进程i和j中,如果VC(a)[i] = VC(b)[i] 并且VC(a)[j] = VC(b)[j],则说明a happen before b

  同步模型我还没有理解,欢迎知道的同学请补充一下

  Vector clock的应用

  Dynamo中使用vector clock来进行冲突解决,由于Dynamo是多master结构,可以在多个节点进行写入操作,因此需要解决写入的冲突问题。通过vector clock,系统可以找到冲突的数据,进而让用户进行修正。

  

图片描述

 

  在后续文章中有可能进一步介绍Dynamo的相关知识

  Vector clock还有一种应用是获得系统的global state,合法的系统状态是系统的consistent cut,这个cut中的事件应该有并发上的要求。

  

图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值