分布式系統 向量時鐘

2021-09-11 14:23:35 字數 2610 閱讀 2657

注意:

首先我們來回顧一下 lamport 邏輯時鐘演算法,它提供了一種判斷分布式系統中事件全序關係的方法:如果 a -> b,那麼 c(a) < c(b),但是 c(a) < c(b) 並不能說明 a -> b。也就是說c(a) < c(b) 是 a -> b 的必要不充分條件,我們不能通過 lamport 時間戳對事件 a、b 的因果關係進行判斷。下面我們舉乙個例子來說明。

假設有三個程序在發訊息,ts(mi)表示訊息mi的傳送時間戳,tr(mi)表示訊息mi的接受時間戳,顯然 ts(mi) < tr(mi),但是這個能說明什麼呢?

我們可以發現在程序 p2 中,tr(m1) < ts(m3),說明 m3 是在 m1 被接收之後傳送的,也就是說 m3 的傳送跟 m1 的接收有關係。難道通過 lamport 時間戳就能區分事件的因果的關係了嗎?答案是 no,我們仔細看可以發現,雖然 tr(m1) < ts(m2),但實際上 m2 的傳送跟 m1 並沒有關係。

綜上所述,我們可以發現 lamport 邏輯時鐘演算法中每個程序只擁有自己的本地時間,沒有其他程序的時間,導致無法描述事件的因果關係。如果每個程序都能夠知道其他所有程序的時間,是否就能夠得到事件的因果關係了呢?為此,有人提出了向量時鐘演算法,在 lamport 邏輯時鐘的基礎上進行了改良,提出了一種在分布式系統中描述事件因果關係的演算法。

可能有人會有疑問:向量時鐘到底有什麼用呢?舉乙個常見的工程應用:資料衝突檢測。分布式系統中資料一般存在多個副本,多個副本可能被同時更新,這會引起副本間資料不一致,此時衝突檢測就非常重要。**基於向量時鐘我們可以獲得任意兩個事件的順序關係,結果要麼是有因果關係(先後順序),要麼是沒有因果關係(同時發生)。**通過向量時鐘,我們能夠識別到如果兩個資料更新操作是同時發生的關係,那麼說明出現了資料衝突。後面我們會詳細說明相關的實現。

通過上面的分析我們知道向量時鐘演算法是**在 lamport 邏輯時鐘的基礎上進行了改良,用於在分布式系統中描述事件因果關係的演算法。**那麼為什麼叫向量時鐘呢?前面我們知道如果每個程序都能夠知道其他所有程序的時間,就能夠通過計算得到事件的因果關係。向量時鐘演算法利用了向量這種資料結構將全域性各個程序的邏輯時間戳廣播給各個程序:每個程序傳送事件時都會將當前程序已知的所有程序時間寫入到乙個向量中,附帶在訊息中。這就是向量時鐘命名的由來。

假設分布式系統中有 n 個程序,每個程序都有乙個本地的向量時間戳 ti,向量時鐘演算法實現如下:

對於程序 i 來說,ti[i] 是程序 i 本地的邏輯時間

當程序 i 當有新的事件發生時,ti[i] = ti[i] + 1

當程序 i 傳送訊息時將它的向量時間戳(mt=ti)附帶在訊息中。

接受訊息的程序 j 更新本地的向量時間戳:tj[k] = max(tj[k], mt[k]) for k = 1 to n。(mt即訊息中附帶的向量時間戳)

下圖是向量時鐘的示例:

那麼如何利用向量時鐘判斷事件的因果關係呢?我們知道分布式系統中的事件要麼是有因果關係(先後順序),要麼是沒有因果關係(同時發生),下面我們來看一下如何利用向量時鐘判斷時間的因果關係。

假設有事件 a、b 分別在節點 p、q 上發生,向量時鐘分別為 ta、tb,如果 tb[q] > ta[q] 並且 tb[p] >= ta[p],則a發生於b之前,記作 a -> b,此時說明事件 a、b 有因果關係; 反之,如果 tb[q] > ta[q] 並且 tb[p] < ta[p],則認為a、b同時發生,記作 a <-> b。例如上圖中節點 b 上的第 4 個事件 (a:2,b:4,c:1) 與節點 c 上的第 2 個事件 (b:3,c:2) 沒有因果關係,屬於同時發生事件。

前面我們提到向量時鐘可以用來檢測分布式系統中多副本更新的資料衝突問題,注意是檢測(發現問題),它並不能解決問題。資料衝突的解決是另乙個課題,這裡不展開了。

亞馬遜的 dynamo 是乙個分布式key/value儲存系統,為了高可用,即使在出現網路分割槽或者機器宕機時依然可讀可寫。當網路分割槽恢復之後,多個副本同步資料一定會出現資料不一致的情況,那麼如何檢測資料衝突呢?參考向量時鐘(vector clock)的思想,dynamo 中使用了版本向量(version vector)來檢測資料衝突,下面我們來看看演算法的實現。

client 端寫入資料,該請求被 sx 處理並建立相應的 vector ([sx, 1]),記為資料 d1

第 2 次請求也被 sx 處理,資料修改為 d2,vector 修改為([sx, 2])

第 3、4 次請求分別被 sy、sz 處理,client 端先讀取到 d2,然後 d3、d4 被寫入 sy、sz

第 5 次更新時 client 端讀取到 d2、d3 和 d4 3個資料版本,通過類似向量時鐘判斷同時發生關係的方法可判斷 d3、d4 是同時發生的事件,因此存在資料衝突,最終通過一定方法解決資料衝突並寫入 d5

注意,向量時鐘和版本向量並不是同乙個東西,版本向量借鑑了向量時鐘中利用向量來判斷事件的因果關係的思想,用於檢測資料衝突。向量時鐘還有其他的應用,例如強制因果通訊(enforcing causal communication),這裡不展開了,有興趣的讀者自行谷歌。

向量時鐘演算法利用了向量這種資料結構將全域性各個程序的邏輯時間戳廣播給各個程序,通過向量時間戳就能夠比較任意兩個事件的因果關係(先後關係或者同時發生關係)。向量時鐘被用於解決資料衝突檢測、強制因果通訊等需要判斷事件因果關係的問題。

分布式系統學習(一)邏輯時鐘與向量時鐘

目的 由於分布式系統中各個機器之間的系統時間同步差異,導致無法用物理時鐘準確衡量事件的先後順序。因此,提出了邏輯時鐘這一概念,用來定義分布式系統中所有事件的發生順序 背景偏序與全序關係,這在大學的線性代數課程中有相關概念。簡單的講,對於乙個數字集合,如果能夠定義兩兩之間的先後關係,則該集合為全序關係...

邏輯時鐘 分布式物理時鐘邏輯時鐘和向量時鐘

在分布式系統中,多個節點都有可能修改資料,由於網路等的原因,第乙個修改的時間節點發起的寫入請求並不一定能最先到達實際寫入節點,為了資料的一致性,各個節點對同一資料產生的update create的值要達到一致性,一般情況下就需要對各個節點的請求資料更新時間進行比對,將最後更新的資料更新到資料系統中 ...

分布式系統時鐘同步方案

一 問題產生 時間是乙個絕對量,而實體計算機的時間是相對量 1 物理天地本身導致的時間不一致,地球自轉 閏年 閏秒 2 現實的不能絕對一致性,a機器時間同步至b機器,網路傳輸時間是不確定性的,ab存在絕對不一致性 如上圖,computer a在2144 tick點執行分布式任務 create out...