研究了下Lamport clock时钟,但是具体怎么应用例子还是没搞清楚,先暂时这样。

Lamport clock 是一种逻辑时钟。

什么是逻辑时钟? 相对于物理时钟来说,逻辑时钟更稳定。因为物理时钟可能会不准,例如有个节点的时间不准了,会导致顺序错乱,在分布式系统里,例如两个事件,a在b之前发生,a在节点1,b在节点2.如果通过节点1的物理时间快了,回导致a,b事件的顺序错乱,例如通过时间戳排序时。

在分布式的系统里,会有多个节点,如何让产生的id有序,例如每个节点发出的消息,怎么排序?

  • 用机器的时间
    • 可能会有时钟不准问题
  • 用一个id生成器的节点,每个节点请求这个节点来获取id
    • 单节点,不能fault-tolerant
    • 写入流量高时会有性能问题
  • 用UUID
    • 可以全局唯一,但是不能排序
  • Preallocated blocks of ID
    • 每个节点分配一个id范围,例如节点a负责1-1000的id,节点b生成1001-2000范围的id。 还是全局无序的,节点内是有序的
  • 逻辑时钟,例如lamport clock

Lamport clock 通过 一种算法,让分布式系统里发生的事件,可以知道顺序。

网络延迟,时钟偏差,异步通讯,很难决定事件的顺序。

为了解决这个问题,引入了逻辑时钟来保证时间的顺序。

1978年,Leslie Lamport 正式化了 逻辑时钟的概念,引入了happend-before 关系,用来决定是否一个事件因果的影响了另一个事件

用来给事件分配时间戳的,来确保事件的一致性顺序。

每个进程维护了一个计数器,每次有本地事件的时候,就会+1.

发送消息的时候,会把这个计数器的值一起带过去。 发送消息一般指什么。

接收的那个进程就更新时间戳成 收到的时间戳和自己的时间戳,里选择最大的一个,生成一个新的事件。

如果 时间戳 t1 < t2,说明 t1可能在t2之前。 但t1>t2时不能确定因果关系,因为可能有并发

例如两个节点 a节点插入了数据1,比节点插入了数据2。 两个事件没有关系?怎么用lamport lock? 要b节点,根据数据1插入了数据2,才有happend-before关系

如果需要稳定性全序,需要用(node,id) 这样作为时间戳。

例子

TODO

Lamport的局限性