向量時鐘

向量時鐘(Vector Clock)[8, 9]是一種在分佈式環境中爲各種操作或事件產生偏序值的技術,它可以檢測操作或事件的並行衝突,用來保持系統的一致性。

向量時鐘方法在分佈式系統中用於保證操作的有序性和數據的一致性。向量時鐘通常可以被認爲是一組來自不同節點的時鐘值Vi[1]、Vi[2]、…、Vi[n]。在分佈式環境中,第i個節點維護某一數據的時鐘時,根據這些值可以知道其他節點或副本的狀態,例如Vi[0]是第i個節點所瞭解的第0個節點上的時鐘值,而Vi[n]是第i個節點所瞭解的第n個節點上的時鐘值。時鐘值代表了節點上數據的版本信息,該值可以是來自節點本地時間的時間戳或者是根據某一規則生成有序數字。

以3副本系統爲例,該系統包含節點0、節點1和節點2。某一時刻的狀態可由下圖來表示。

這裏寫圖片描述

該圖表示當前時刻各節點的向量時鐘爲:

節點0:V0(4,2,0)

節點1:V1(1,4,0)

節點2:V2(0,0,1)

在上圖中,Vi代表第i個節點上的時鐘信息,Vi[j]表示第i個節點所瞭解的第j個節點的時鐘信息。以第2行爲例,該行爲V1節點的向量時鐘(1,4,0),其中”1”表示V1節點所瞭解的V0節點上的時鐘值;”0”表示V1節點所瞭解的V2節點上的時鐘值;”4”表示V1節點自身所維護的時鐘值。

下面具體描述向量時鐘在分佈式系統中的運維規則。

規則1:

初始時,我們將每個節點的值設置爲0。每當有數據更新發生,該節點所維護的時鐘值將增長一定的步數d,d的值通常由系統提前設置好。

該規則表明,如果操作a在操作b之前完成,那麼a的向量時鐘值大於b向量時鐘值。

向量時鐘根據以下兩個規則進行更新。

規則2:

在節點i的數據更新之前,我們對節點i所維護的向量Vi進行更新:

Vi[i]= Vi[i]+d(d > 0)

該規則表明,當Vi[i]處理事件時,其所維護的向量時鐘對應的自身數據版本的時鐘值將進行更新。

規則3:

當節點i向節點j發送更新消息時,將攜帶自身所瞭解的其他節點的向量時鐘信息。節點j將根據接收到的向量與自身所瞭解的向量時鐘信息進行比對,然後進行更新:

Vj[k] = max{Vi[k], Vj[k]}

在合併時,節點j的向量時鐘每一維的值取節點i與節點j向量時鐘該維度值的較大者。

兩個向量時鐘是否存在偏序關係,通過以下規則進行比較:

對於n維向量來說,Vi > Vj,如果任意k(0≤k≤n 1)均有Vi[k] > Vj[k]。

如果Vi既不大於Vj且Vj也不大於Vi,這說明在並行操作中發生了衝突,這時需要採用衝突解決方法進行處理,比如合併。

如上所示,向量時鐘主要用來解決不同副本更新操作所產生的數據一致性問題,副本並不保留客戶的向量時鐘,但客戶有時需要保存所交互數據的向量時鐘。如在單調讀一致性模型中,用戶需要保存上次讀取到的數據的向量時鐘,下次讀取到的數據所維護的向量時鐘則要求比上一個向量時鐘大(即比較新的數據)。

相對於其他方法,向量時鐘的主要優勢在於:

節點之間不需要同步時鐘,即不需要全局時鐘。

不需要在所有節點上存儲、維護一段數據的版本數。

下面我們通過一個例子來體會向量時鐘如何維護數據版本的一致性。

A、B、C、D四個人計劃下週去爬長城。A首先提議週三去,此時B給D發郵件建議週四去,他倆通過郵件聯繫後決定週四去比較好。之後C與D通電話後決定週二去。然後,A詢問B、C、D三人是否同意週三去,C回覆說已經商量好了週二去,而B則回覆已經決定週四去,D又聯繫不上,這時A得到不同的回覆。如果他們決定以最新的決定爲準,而A、B、C沒有記錄商量的時間,因此無法確定什麼時候去爬長城。

下面我們使用向量時鐘來”保證數據的一致性”:爲每個決定附帶一個向量時鐘值,並通過時鐘值的更新來維護數據的版本。在本例中我們設置步長d的值爲1,初始值爲0。

(1)在初始狀態下,將四個人(四個節點)根據規則1將自身所維護的向量時鐘清零,如下所示:

A(0,0,0,0)

B(0,0,0,0)

C(0,0,0,0)

D(0,0,0,0)

(2)A提議週三出去

A首先根據規則2對自身所維護的時鐘值進行更新,同時將該向量時鐘發往其他節點。B、C、D節點在接收到A所發來的時鐘向量後發現它們所知曉的A節點向量時鐘版本已經過時,因此同樣進行更新。更新後的向量時鐘狀態如下所示:

A(1,0,0,0)

B(1,0,0,0)

C(1,0,0,0)

D(1,0,0,0)

(3)B和D通過郵件進行協商

B覺得週四去比較好,那麼此時B首先根據規則2更新向量時鐘版本(B(1,1,0,0)),然後將向量時鐘信息發送給D(D(1,0,0,0))。D通過與B進行版本比對,發現B的數據較新,那麼D根據規則3對向量時鐘更新,如下所示。

A(1,0,0,0)

B(1,1,0,0)

C(1,0,0,0)

D(1,1,0,0)

(4)C和D進行電話協商

C覺得週二去比較好,那麼此時C首先更新自身向量時鐘版本(C(1, 0, 1, 0)),然後打電話通知D(D(1, 1, 0, 0))。D根據規則3對向量時鐘進行更新。

此時系統的向量時鐘如下所示:

A(1,0,0,0)

B(1,1,0,0)

C(1,0,1,0)

D(1,1,1,0)

最終,通過對各個節點的向量時鐘進行比對,發現D的向量時鐘與其他節點相比具有偏序關係。因此該系統將決定”週二”一起去爬山。

下面我們用圖示來描述上述過程,如下圖所示。

這裏寫圖片描述

該方法中數據版本可能出現衝突,即不能確定向量時鐘的偏序關係。如圖2-5所示,假如C在決定週三爬山後並沒有將該決定告訴其他人,那麼系統在此刻將不能確定某一數據向量時鐘的絕對偏序關係。比較簡單的衝突解決方案是隨機選擇一個數據的版本返回給用戶。而在Dynamo中系統將數據的不一致性衝突交給客戶端來解決。當用戶查詢某一數據的最新版本時,若發生數據衝突,系統將把所有版本的數據返回給客戶端,交由客戶端進行處理。

該方法的主要缺點就是向量時鐘值的大小與參與的用戶有關,在分佈式系統中參與的用戶很多,隨着時間的推移,向量時鐘值會增長到很大。一些系統中爲向量時鐘記錄時間戳,某一時間根據記錄的時間對向量時鐘值進行裁剪,刪除最早記錄的字段。

向量時鐘在實現中有兩個主要問題:如何確定持有向量時鐘值的用戶,如何防止向量時鐘值隨着時間不斷增長。

2.5 小結

本章介紹了關於海量數據存儲以及NoSQL數據庫中的數據一致性理論。CAP理論爲NoSQL數據管理系統的基石,該理論告訴我們強一致性、可用性和分區容錯性不能同時滿足。在進行系統設計的時候必須在這三者之間做出權衡,需根據不同的應用和環境進行系統設計。

爲了提高系統的效率,在大多數的系統中採用的是”最終一致性策略”,而放棄了CAP理論中的”強一致性”要求。BASE模型正是這一方面應用的典型理論代表,該方法通過犧牲一致性和孤立性來提高可用性和系統性能,其中BASE分別代表:基本可用、軟狀態和最終一致性。

在數據一致性的最終實現上,不同的系統採用不同的策略,包括:Quorum的NWR策略、兩階段提交協議、Paxos、時間戳、向量時鐘等,本章只列舉了其中的一部分,現實中還有更多的實現。但是這些系統或者模型均以CAP理論爲基石,並依據不同的情況作出權衡,例如Paxos具有較強的一致性,但是系統延遲較大。此外,很多系統中採用多種策略的結合,例如,NWR策略經常與向量時鐘一同使用,用以解決數據的一致性問題。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章