【时钟】分布式时钟HLC|Logical Time|Vector Clock|True Time
目录
简略
分布式系统中不同于单机系统不能使用NTP(网络时间协议(Network Time Protocol))来获取时间,所以我们需要一个特别的方式来获取分布式系统中的时间,mvcc也是使用time保证读写相互不影响
Logical Time
使用 接收到的消息内的时间和自己的时间中最新的那个。
各个节点发送消息时附带自己的时间Ci,对方收到之后和自己的时间Cj 比对,选择大的时间更新为自己的时间Cj = max{Cj,Ci}.
Vector Clock
接收到的消息有所有节点的“时间戳”集合,每个时间戳都比本地的集合对应节点的大,就用对方的,都比本地的节点小就用自己的,不是全部都大或者都小就裁决。
VectorClock一个集合内包含所有节点的“时间戳”:{Node1:0,Node2:2,Node3:3.......}(这个时间戳并不是物理意义上的时间而是由程序赋予的逻辑计数(count)),收发消息时比对和更新自身VectorClock:
a:本机:{0,0,1} 消息:{0,1,2}。消息的每个节点的count都大于等于本机的,那么舍弃本机,同步消息
b:本机:{0,1,2} 消息:{0,1,1}。消息的每个节点的count都小于等于本机的,那么舍弃消息,保留本机
c:本机:{0,3,1} 消息:{0,1,2}。出现冲突,有的大,有的小,无法判断出来到底谁是最新版本。就要进行冲突仲裁。
True Time
需要专用硬件支持
Google Spanner里面,通过引入True Time来解决了分布式时间问题。Spanner通过使用GPS + Atomic Clock来对集群的机器进行校时,精度误差范围能控制在ms级别. 需要专用硬件支持
Hybrid Logic Clock(HLC/混合逻辑时钟)
HLC存储两部分信息:本地时钟(物理部分)l,计数器(逻辑部分)c
本地时钟部分l=集群节点的本地时钟的最大值(每次进行事务通信时更新这部分信息)
计数器部分c=每次事件或者消息通信时++(累加),类似逻辑时钟里每次事件都++(累加)。
HLC比较大小时,先用比较l部分,如果l相等再看c是否为零。
详细
摘抄自:分布式系统中的时间 - https://www.jianshu.com/p/18f063573aae
Logical Ti
浙公网安备 33010602011771号