跳到主要内容

Lamport Clock

Motivation

解決在分散式系統中,因為clock drift的關係,無法依賴physical clock來決定event的先後順序,需要一套演算法來決定系統中event的先後順序(total ordering)。

Partial Ordering

Partial ordering的定義如下:

Strict partial orders

Total Ordering

Partial ordering 加上一個額外的條件:

Logical Clock

既然沒辦法依靠physical clock,那只好設計一個clock,並且滿足以下條件:

  • 如果 event a happened before event b (a -> b),則 C(a)<C(b)C(a) < C(b) (C是 clock function)

要滿足以上條件,必須滿足兩個sub condition:

  • 如果 event a, b 由同一個 processiprocess_i產生,而且 ab之前,則 Ci(a)<Ci(b)C_i(a) < C_i(b)
  • 如果 event a 是由 PiP_i 送給 PjP_j 接收 (接收的event 為 b),則 Ci(a)<Cj(b)C_i(a) < C_j(b)

以上條件滿足Partial ordering,我們可以藉由加上限制來滿足total orderinga=>ba => b (=> means total ordering) if and only if:

  • Ci(a)<Cj(b)C_i(a) < C_j(b) or (Ci(a)=Cj(b)C_i(a) = C_j(b) Pi,PjP_i, P_j are total ordering)

Lamport Clock

Lamport 提出一個作法,可以滿足以上的條件,演算法非常單純:

  1. 每次有新的event,PiP_i 都會增加Clock的值
  2. 假設 TmT_m (timestamp m) Ci(a)C_i(a)的值,收到 event的process 要把 clock value增加到大於 TmT_m

第一個做法保證 Ci(a)<Ci(b)C_i(a) < C_i(b),而第二個做法保證了 Ci(a)<Cj(b)C_i(a) < C_j(b),所以是滿足了strong clock condition: C(a)<C(b)C(a) < C(b)

Constraints

Lamport clockCP演算法,概念上是每個node都要維護一樣的順序,存在著一個distributed state matchine,因此不能有node存在不一樣的狀態,因此每個node都必須要收到通知,因此如果有一個node掛了,整個系統就不能在接受新的state transition