Lamport逻辑时钟

Lamport逻辑时钟的英文标准名称是 Lamport Timestamp 或者 Lamport Logical Clock。它是由美国计算机科学家 Leslie Lamport 在1978年提出的一种分布式系统中用于区分事件发生顺序的时间机制。它不依赖于物理时钟,而是根据节点间的信息传递来定义事件的先后关系。

解决的问题

分布式系统中每个节点都维护自己独立的时钟。虽然存在像NTP(网络时间协议)的算法来同步各个节点的时间,但误差依然存在。原因是不同进程中的时钟有一定程度的时钟偏移,即使在某个时间点完全同步,时钟也会由于不同的原因而漂移:功率波动、温度变化以及托管此类进程的机器之间的硬件差异。这种误差是那些依赖精确的事件因果关系的系统所不能接受的。

原理

同一个节点内部发生的事件可以通过节点内部时钟来确定时序,逻辑时钟只关注节点之间交互的事件,并确定它们发生的先后(因果)顺序。节点之间交互的事件包含两种:发送事件和接收事件。每个节点维护一个递增的本地计数器,作为逻辑时钟。每个发生的事件对应一个值。时钟初始值为0。

  • 如果事件在节点内发生,时钟加1。
  • 如果事件属于发送事件,时钟加1,并在消息中带上该时间戳。
  • 如果事件属于接收事件,时钟值 = Max (本地时钟值,消息中的时间戳) + 1

例子A

Lamport逻辑时钟可以保证因果关系的正确性,即如果事件A先于事件B发生,那么C(A) < C(B)。上图中,有因果关系的事件,如B2->C1,它们的时钟值分别是C(B2) = 3,C(C1) = 4,满足C(B2) < C(C1)。

Lamport逻辑时钟不能保证绝对时序的正确性,即如果C(A) < C(B),并不能说明A先于B发生。上图中,C(A2) < C(B2),但不能说明A2在B2之前发生,因为A2和B2不构成因果关系。所以Lamport逻辑时钟只能给出事件的偏序(partial order)关系。

当时钟值相等时,如果假设好节点的顺序作为事件发生的顺序,则可以得出事件的全序关系。上图中,假设节点先后顺序是:节点A -> 节点B -> 节点C,则全序关系是:A1->A2->B1->B2->B3->C1->B4->C2。同样,它不能正确反映所有事件真实的发生顺序,只保证有因果关系的事件的时序。

例子B

假设节点A,B,C之间要同步复制数据,每个节点收到数据更新请求后,都要将更新同步到其他两个节点上。如果节点A和节点B分别收到对同一条数据记录的更新请求,并分别将更新同步到节点C(通过A1事件和B1事件)。当节点C收到更新请求C1和C2时,它们的源事件的逻辑时钟都是1,它们之间没有因果关系,节点C无法判断这两个更新请求的先后顺序,导致无法确定这个更新是否合理。要解决这个问题,可以使用逻辑时钟的加强版,向量时钟。

参考