分佈式系統:向量時鐘

Lamport時鐘存在的問題

使用Lamport時間戳,只是比較事件\(a\)\(b\)各自的時鐘值\(C\{a\}\)\(C\{b\}\),沒法說明它們之間的關係。也就是說,\(C\{a\}<C\{b\}\)不能說明事件\(a\)在事件\(b\)以前發生。好比下面的事件\(C4\)\(A3\)\(C\{A3\}<C\{C4\}\),可是在時間上事件\(A3\)\(C4\)以後發生。
imagehtml

因此,Lamport時間戳的問題在於它不能捕獲事件的因果關係,爲了解決這個問題,有大神提出了向量時鐘。分佈式

向量時鐘

Vector clock是在Lamport時間戳基礎上演進的另外一種邏輯時鐘方法,它經過vector結構不但記錄本節點的Lamport時間戳,同時也記錄了其餘節點的Lamport時間戳。即,當系統有\(N\)個進程時,則存在\(N\)個邏輯時鐘向量,一個進程對應一個時鐘。具體以下:post

  • 初始時全部時鐘都爲0;
  • 每一次處理內完內部事件,將本進程對應的邏輯時鐘+1;
  • 每一次發送一個消息的時候,須要將本身的向量時鐘和消息一塊兒發送;
  • 每一次接收到一個消息,須要將本身的邏輯時鐘+1,同時更新每個邏輯時鐘,更新規則爲取本地邏輯時鐘和收到的邏輯時鐘的最大值。

假設分佈式系統有A、B和C這3個進程,根據上述規則其各自對應的邏輯時鐘隨着時間演化狀況如圖所示,其數值變化規則遵循上述規則,時間線之間的邊表明進程間發送的消息。標爲cause的陰影部分表明致使[A:2,B:4,C:1]事件的緣由,標爲effect的陰影部分則表明[A:2,B:4,C:1]事件影響到的後續事件,而無陰影部分覆蓋的事件則是和[ A:2,B:4,C:1]事件無邏輯上因果關係的事件。spa

事件關係判斷方法:翻譯

  • 正常狀況下,向量時鐘V1上的各個時間份量若是所有都小於等於V2上各個時間份量,則認爲V1比V2早。舉個例子說明,好比事件[A:1,B:2,C:1]以及[A:4,B:5,C5],經過和[A:2,B:4,C:1]對應位置比較可知其因果關係爲:[A:1,B:2,C:1]爲[A:2,B:4,C:1]之因,[A:4,B:5,C5] 爲[A:2,B:4,C:1]之果。
  • 向量時鐘V1上的各個時間份量有的比V2上的時間份量大,有的比其小,則認爲是同時發生。好比事件[A:2,B:4,C:1]與事件[ ,B:3,C:3]。

向量時鐘的應用——衝突檢測

可能有人會有疑問:向量時鐘到底有什麼用呢?舉一個常見的工程應用:數據衝突檢測。分佈式系統中數據通常存在多個副本,多個副本可能被同時更新,這會引發副本間數據不一致,此時衝突檢測就很是重要。基於向量時鐘咱們能夠得到任意兩個事件的順序關係,結果要麼是有因果關係(前後順序),要麼是沒有因果關係(同時發生)。經過向量時鐘,咱們可以識別到若是兩個數據更新操做是同時發生的關係,那麼說明出現了數據衝突。注意是檢測(發現問題),它並不能解決數據衝突。code

下面咱們舉個向量時鐘應用的例子,以一個例子來講明如何使用時鐘向量,來維護一個分佈式系統的一致性。htm

Alice, Ben, Cathy, Dave四我的準備下周聚餐,在時間安排上協調出現了問題。首先,Alice提出Wednesday聚餐,那麼對提出這個提議的Alice來講,此時她的時鐘向量就是這樣的:blog

date = Wednesday
vclock = Alice:1

她將這個消息廣播給其餘三我的:進程

image

Ben在收到提議以後,提出本身的提議Tuesday,此時ben的時鐘向量就是:事件

date = Tuesday
vclock = Alice:1, Ben:1

而後將消息發送給Dave:

image

Dave收到以後,回覆Ben表示贊成Tuesday,此時Dave的時鐘向量是:

date = Tuesday
vclock = Alice:1, Ben:1, Dave:1

如今Cathy參與進來,建議Thursday,此時Cathy的時鐘向量是:

date = Thursday
vclock = Alice:1, Cathy:1

而後將提議發送給了Dave:

image

Dave此時就有了兩份有衝突的數據(衝突的緣由是Ben和Cathy「同時」修改了最初Alice的數據):

date = Tuesday
vclock = Alice:1, Ben:1, Dave:1

date = Thursday
vclock = Alice:1, Cathy:1

根據時鐘向量的關係判斷規則,Dave發現了衝突,由於當前的向量時鐘和新接收到的向量時鐘上的各個邏輯時鐘並非所有小於或大於。幸運的是,Dave是個有理性的人,選擇了Thursday(前面是發現衝突,這裏至關於解決衝突,實際系統中解決衝突的方法不一樣,解決衝突不是向量時鐘的內容)。Dave解決衝突並回復給Cathy,此時Dave的向量時鐘爲:

date = Thursday
vclock = Alice:1, Ben:1, Cathy:1, Dave:2

image

至此,當Alice問Ben和Cathy最新的決定,會收到來自Ben的:

date = Tuesday
vclock = Alice:1, Ben:1, Dave:1

和來自Cathy的:

date = Thursday
vclock = Alice:1, Ben:1, Cathy:1, Dave:2

image

這樣,Alice她能夠說Dava與Cathy一致修改了本身和Ben的提議,並將Cathy的消息給Ben,Ben就知道它的提議已經被修改。

image

如今,它們愉快的達成了一致。對於整個協商的過程,能夠看到衝突的根源在於Ben和Cathy都「同時」修改了Alice的數據,Dave解決了數據衝突(不一樣問題,解決數據衝突的方法不一樣),最後它們達成一致。

參考文檔:
Vector clock
Dynamo: Amazon’s Highly Available Key-value Store
分佈式系統:向量時鐘(部份內容翻譯自上文)
Why Vector Clocks Are Hard
時鐘向量在一致性問題中的應用(部份內容翻譯自上文)
Timestamps in Message-Passing Systems That Preserve the Partial Ordering

公衆號:

相關文章
相關標籤/搜索