Lamport时钟存在的问题

使用Lamport时间戳,只是比较事件 a a a和 b b b各自的时钟值 C { a } C\{a\} C{a}和 C { b } C\{b\} C{b},无法说明它们之间的关系。也就是说, C { a } < C { b } C\{a\}<C\{b\} C{a}<C{b}不能说明事件 a a a在事件 b b b之前发生。比如下面的事件 C 4 C4 C4与 A 3 A3 A3, C { A 3 } < C { C 4 } C\{A3\}<C\{C4\} C{A3}<C{C4},但是在时间上事件 A 3 A3 A3在 C 4 C4 C4之后发生。

所以,Lamport时间戳的问题在于它不能捕获事件的因果关系,为了解决这个问题,有大神提出了向量时钟(Vector clock)。

向量时钟

Vector clock是在Lamport时间戳基础上演进的另一种逻辑时钟方法,它通过vector结构不但记录本节点的Lamport时间戳,同时也记录了其他节点的Lamport时间戳。即,当系统有 N N N个进程时,则存在 N N N个逻辑时钟向量,一个进程对应一个时钟。具体如下:

  • 初始时所有时钟都为0;
  • 每一次处理内完内部事件,将本进程对应的逻辑时钟+1;
  • 每一次发送一个消息的时候,需要将自己的向量时钟和消息一起发送;
  • 每一次接收到一个消息,需要将自己的逻辑时钟+1,同时更新每一个逻辑时钟,更新规则为取本地逻辑时钟和收到的逻辑时钟的最大值。

假设分布式系统有A、B和C这3个进程,根据上述规则其各自对应的逻辑时钟随着时间演化情况如图所示,其数值变化规则遵循上述规则,时间线之间的边代表进程间发送的消息。标为cause的阴影部分代表导致[A:2,B:4,C:1]事件的原因,标为effect的阴影部分则代表[A:2,B:4,C:1]事件影响到的后续事件,而无阴影部分覆盖的事件则是和[ A:2,B:4,C:1]事件无逻辑上因果关系的事件。

事件关系判断方法:

  • 正常情况下,向量时钟V1上的各个时间分量如果全部都小于等于V2上各个时间分量,则认为V1比V2早。举个例子说明,比如事件[A:1,B:2,C:1]以及[A:4,B:5,C5],通过和[A:2,B:4,C:1]对应位置比较可知其因果关系为:[A:1,B:2,C:1]为[A:2,B:4,C:1]之因,[A:4,B:5,C5] 为[A:2,B:4,C:1]之果。
  • 向量时钟V1上的各个时间分量有的比V2上的时间分量大,有的比其小,则认为是同时发生。比如事件[A:2,B:4,C:1]与事件[ ,B:3,C:3]。

向量时钟的应用——冲突检测

可能有人会有疑问:向量时钟到底有什么用呢?举一个常见的工程应用:数据冲突检测。分布式系统中数据一般存在多个副本,多个副本可能被同时更新,这会引起副本间数据不一致,此时冲突检测就非常重要。基于向量时钟我们可以获得任意两个事件的顺序关系,结果要么是有因果关系(先后顺序),要么是没有因果关系(同时发生)。通过向量时钟,我们能够识别到如果两个数据更新操作是同时发生的关系,那么说明出现了数据冲突。注意是检测(发现问题),它并不能解决数据冲突。

下面我们举个向量时钟应用的例子,以一个例子来说明如何使用时钟向量,来维护一个分布式系统的一致性。

Alice, Ben, Cathy, Dave四个人准备下周聚餐,在时间安排上协调出现了问题。首先,Alice提出Wednesday聚餐,那么对提出这个提议的Alice来说,此时她的时钟向量就是这样的:

date = Wednesday
vclock = Alice:1

她将这个消息广播给其他三个人:

Ben在收到提议之后,提出自己的提议Tuesday,此时ben的时钟向量就是:

date = Tuesday
vclock = Alice:1, Ben:1

然后将消息发送给Dave:

Dave收到之后,回复Ben表示同意Tuesday,此时Dave的时钟向量是:

date = Tuesday
vclock = Alice:1, Ben:1, Dave:1

现在Cathy参与进来,建议Thursday,此时Cathy的时钟向量是:

date = Thursday
vclock = Alice:1, Cathy:1

然后将提议发送给了Dave:

Dave此时就有了两份有冲突的数据(冲突的原因是Ben和Cathy“同时”修改了最初Alice的数据):

date = Tuesday
vclock = Alice:1, Ben:1, Dave:1

date = Thursday
vclock = Alice:1, Cathy:1

根据时钟向量的关系判断规则,Dave发现了冲突,因为当前的向量时钟和新接收到的向量时钟上的各个逻辑时钟并不是全部小于或大于。幸运的是,Dave是个有理性的人,选择了Thursday(前面是发现冲突,这里相当于解决冲突,实际系统中解决冲突的方法不同,解决冲突不是向量时钟的内容)。Dave解决冲突并回复给Cathy,此时Dave的向量时钟为:

date = Thursday
vclock = Alice:1, Ben:1, Cathy:1, Dave:2

至此,当Alice问Ben和Cathy最新的决定,会收到来自Ben的:

date = Tuesday
vclock = Alice:1, Ben:1, Dave:1

和来自Cathy的:

date = Thursday
vclock = Alice:1, Ben:1, Cathy:1, Dave:2

这样,Alice她可以说Dava与Cathy一致修改了自己和Ben的提议,并将Cathy的消息给Ben,Ben就知道它的提议已经被修改。

现在,它们愉快的达成了一致。对于整个协商的过程,可以看到冲突的根源在于Ben和Cathy都“同时”修改了Alice的数据,Dave解决了数据冲突(不同问题,解决数据冲突的方法不同),最后它们达成一致。

参考文档:
Vector clock
Dynamo: Amazon’s Highly Available Key-value Store
分布式系统:向量时钟(部分内容翻译自上文)
Why Vector Clocks Are Hard
时钟向量在一致性问题中的应用(部分内容翻译自上文)
Timestamps in Message-Passing Systems That Preserve the Partial Ordering

分布式系统:向量时钟相关推荐

  1. Dynamo分布式系统——「RWN」协议解决多备份数据如何读写来保证数据一致性,而「向量时钟」来保证当读取到多个备份数据的时候,如何判断哪些数据是最新的这种情况...

    转自:http://blog.jqian.net/post/dynamo.html Dynamo是Amazon开发的一款高可用的分布式KV系统,已经在Amazon商店的后端存储有很成熟的应用.它的特点 ...

  2. NoSQL生态系统——一致性RWN协议,向量时钟,gossip协议监测故障

    13.5 一致性 在NoSQL中,通常有两个层次的一致性:第一种是强一致性,既集群中的所有机器状态同步保持一致.第二种是最终一致性,既可以允许短暂的数据不一致,但数据最终会保持一致.我们先来讲一下,在 ...

  3. Dynamo涉及的算法和协议——p2p架构,一致性hash容错+gossip协议获取集群状态+向量时钟同步数据...

    转自:http://www.letiantian.me/2014-06-16-dynamo-algorithm-protocol/ Dynamo是Amazon的一个分布式的键值系统,P2P架构,没有主 ...

  4. 【分布式系统】-时钟问题

    一.背景 分布式数据库系统中,为了解决不同集群.节点事件发生的先后顺序问题,时钟同步至关重要. 二.时钟同步方案 1. 物理时钟(PT) 物理时钟即机器本地的时钟,而由于设备硬件不同,本身存在偏差,一 ...

  5. 向量时钟算法简介——本质类似MVCC

    转自:http://blog.chinaunix.net/uid-27105712-id-5612512.html 一.使用背景 先说一下需要用到向量时钟的场景.我们在写数据时候,经常希望数据不要存储 ...

  6. 向量时钟Vector Clock in Riak

    Riak 是以 Erlang 编写的一个高度可扩展的分布式数据存储,Riak的实现是基于Amazon的Dynamo论文,Riak的设计目标之一就是高可用.Riak支持多节点构建的系统,每次读写请求不需 ...

  7. 向量时钟同步算法_如何让超级下载算法在不同CortexM内核下也能跑?

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是超级下载算法开发笔记(1)之执行在不同CM内核下. 文接上篇 <RT-UFL - 一个适用全平台i.MXRT的超级下载算法设计&g ...

  8. 向量时钟同步算法_Clifford论文系列多异步时钟设计的综合及脚本技术(1)

    最近写资料的空闲时间,想着看看clifford E. Cummings的经典论文,虽然年代较远,但是每一篇都值得好好研究.本系列不定期更新,计划看完以下论文. 本文英文链接http://www.dee ...

  9. 分布式系统-同步化-时钟同步-物理时钟与Lamport时间戳(逻辑时钟)

    1.概述 同步化是分布式系统中的一个重要概念,同步化主要解决的是排序问题.例如:多个线程不能同时操作一个变量,而是将多个线程使用锁或无锁结构进行同步,同步的目的就是将多个线程排序为一个操作时序对这个变 ...

最新文章

  1. 工程师在工作电脑存 64G 不雅文件,被公司开除后索赔 41 万,结果…
  2. undistortPoints()函数用法总结
  3. java rotatetransition_transition过渡,transform变换
  4. 怎么自学python语言-python应用:零基础Python应该怎样学习呢?
  5. c语言数据储存系统,编的学生成绩管理系统 从文件中读取保存数据总会多读入一组乱码数据...
  6. 让fedora18桌面显示图标
  7. fft重叠帧_关于FFT实时频谱的几个基本概念 | 科创仪表局
  8. 数据库(5)SQL约束
  9. kernel: TCP: time wait bucket table overflow
  10. php tp5 parent,[李景山php]每天TP5-20161225|thinkphp5-Console.php-2
  11. android mtk平台,android mtk平台默认输入法
  12. 大数据系统应包含哪些功能模块
  13. 开源wiki系统推荐wiki.js, github上16500+ star,是带数据库的
  14. 求职之测试开发技能准备
  15. 计算机基础中图文混排的重要性,浅谈项目教学在技校计算机应用基础中的应用.doc...
  16. c c 语言写的四六级词汇系统,2020年6月英语四级考试大纲词汇:C
  17. 整理了上千个 Python 工具库,涵盖24个大方向
  18. 利用INFOPATH2007VS2005开发MOSS工作流详解 --收藏
  19. 一般app测试的最佳方法
  20. Java实验报告误差分析怎么写_系统工程实验报告-031510131-郭文豪.doc

热门文章

  1. Nick英语入门班笔记
  2. 【洛谷】P1904 天际线
  3. PDF转图片的软件有哪些?这些PDF转图片软件值得一试
  4. 中小企业的四个数据存储方法和措施
  5. matlab for步长,matlab循环语句for怎么用
  6. 两个74HC595D驱动芯片控制三位数码管显示
  7. java 除以1000_练习:将从表读出来的时间戳除以1000(java读时间戳会多出3个000)用jackson包 实现...
  8. 【Kilav】 数据库复习资料 其一
  9. 格子玻尔兹曼方法(LBM)计算中的无量纲化转化(将物理参数转化为格子参数)
  10. MyEclipse中文汉化教程