时间与顺序
物理时钟与逻辑时钟
- 分布式系统中每个节点记录时间不一样,即便设置NTP时间同步,节点间也存在毫秒级的偏差,由此产生了逻辑时钟,记录时间发生顺序
- 分布式系统中按是否存在节点交互可拆分三类事件,一类发生节点内部,二是发生事件,三是接受事件
- 逻辑时钟(Lamport timestamps, Vector clock)
3.1 逻辑时钟前进
3.1.1 每个事件对应一个逻辑时间戳,初始值为0
3.1.2 如果事件发生节点内发生,时间戳加1
3.1.3 如果事件属于发送事件,时间戳加1并在消息中带上该时间戳
3.1.4 如果事件属于接收事件,时间戳 = MAX(本地时间戳,消息中的时间戳) + 1
3.2 逻辑时钟比较(Lamport timestamps)
3.2.1 事件A,B时间戳a,b.如果a < b, 则存在 A->B
3.2.2 事件A,B时间戳b,b.如果a = b, 定义节点顺序 c, d, 如果 c < d. 则 A=>B
3.3 逻辑时钟比较(Vector clock)
3.3.1 假设事件a,b分别在P,Q发生,Vector clock分别为Ta, Tb 如果Tb[Q] > Pa[Q]并且 Tb[P] >= Ta[P]则 a发生b之前记为a->b
3.3.2 如果Tb[Q] > Ta[Q]并且Tb[P] < Ta[P] 则认为同时发生记为a<->b
3.4 使用(Version vector)
3.4.1 数据冲突
3.4.1.1 分布式系统数据中一般会存在多个副本,多个副本可能被同时刷新,这会引起副本数据不一致