分布式系統中的時鍾:邏輯時鍾與向量時鍾


  • 邏輯時鍾Lamport's Logical Clocks

 

為了同步logical clocks,Lamport 定義了一個關系叫做happens-before.記作 -> 

a->b意味着所有的進程都agree事件a發生在事件b之前。

在兩種情況下,可以很容易的得到這個關系:

1 如果事件a和事件b是同一個進程中的並且事件a發生在事件b前面,那么a->b

2 如果進程A發送一條消息m給進程B,a代表進程A發送消息m的事件,b代表進程B接收消息m的事件,那么a->b(由於消息的傳遞需要時間)

 

happens-before 關系滿足傳遞性:即(a->b && b->c)->(a->c)

如果事件a和事件b發生在不同的進程,並且這兩個進程沒有傳遞消息,那么既不能推到a->b也不能推到b->a,這樣的兩個事件叫做並發事件

 

現在需要定義一個事件的函數C,使得[a->b]->[C(a)<C(b)],並且由於是作為一種對時間的衡量,所以C也必須是只增不減的。

 

Lamport 算法

 

三個機器上各自跑着一個進程,分別為P1,P2,P3,由於不同的機器上的quartz crystal不一樣,所以不同的機器上的時鍾速率可能是不同的,例如當P1所在

的機器tick了6次,P2所在的機器tick了8次。

 

圖中,P1給P2發送了消息m1,m1上附帶了發送m1時的時鍾6,隨后P2收到了m1,根據P2接收到m1時的時鍾,認為傳輸消息花了16-6=10個tick

隨后,P3給P2發送消息m3,m3附帶的發送時鍾是60,由於P2的時鍾走的比P3的慢,所以接收到m3時,本機的時鍾56比發送時鍾60小。這是不合理的,需要調整時鍾,

 

如圖中,將P2的56調整為61,即m3的發送時鍾加1

 

Lamport logical clocks的實現:

每個進程Pi維護一個本地計數器Ci,相當於logical clocks,按照以下的規則更新Ci

1 每次執行一個事件(例如通過網絡發送消息,或者將消息交給應用層,或者其它的一些內部事件)之前,將Ci加1

2 當Pi發送消息m給Pj的時候,在消息m上附着上Ci

3 當接收進程Pj接收到Pi的發送的消息時,更新自己的Cj = max{Cj,Ci}

 

  • 向量時鍾Vector Clocks

 

Lamport logical clocks可以保證(a->b)->( C(a)<C(b) ),但是不能保證( C(a)<C(b) )->(a->b)

也就是說,Lamport logical clocks的問題是:事件a和事件b實際發生的先后順序不能僅僅通過比較C(a)和C(b)來決定。

 這是因為Lamport logical clocks沒有capture causality(因果關系),而causality可以通過Vector Clocks來capture。向量時鍾實際是一組版本號(版本號=邏輯時鍾),假設數據需要存放3

份,需要3台db存儲(用A,B,C表示),那么向量維度就是3,每個db有一個版本號,從0開始,這樣就形成了一個向量版本 [A:0, B:0, C:0];

初始狀態下,所有機器都是 [A:0, B:0, C:0]

      DB_A——> [A:0, B:0, C:0]

      DB_B——> [A:0, B:0, C:0]

      DB_C——> [A:0, B:0, C:0]

這樣既可以保證(a->b)->( C(a)<C(b) ),又能保證( C(a)<C(b) )->(a->b)。


用VC(a)來表示事件a的Vector Clock,有如下性質:VC(a) < VC(b)可以推出事件a causally 發生在事件b之前(也就是事件a發生在事件b之前)。

為每個進程Pi維護一個向量VC,也就是Pi的Vector Clock,這個向量VC有如下屬性:

1 VCi[i] 是到目前為止進程Pi上發生的事件的個數

2 VCi[k] 是進程Pi知道的進程Pk發生的事件的個數(即Pi對Pj的知識)

 

每個進程的VC可以通過以下規則進行維護(和Lamport logical clocks算法類似): 

1 進程Pi每次執行一個事件之前,將VCi[i]加1

2 當Pi發送消息m給Pj的時候,在消息m上附着上VCi(進程Pi的向量時鍾)

3 當接收進程Pj接收到Pi的發送的消息時,更新自己的VCj[k] = max{VCj[k],VCi[k]} ,對於所有的k

 

以上兩種都是分布式時鍾的表示方式,在很多地方都可以用到。比如全序多播(totally ordered multicasting)中對向量時鍾添加約束條件則成為一種比較好的一致性達成方式。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM