分布式系統全域性時鐘事件排序演算法

2021-10-20 19:35:20 字數 2069 閱讀 5205

首先更精確的定義我們的系統,假設系統由一系列程序組成,每個程序包含一系列事件。根據應用在計算機上執行乙個子程式或者單個機器指令都可以是乙個事件,假設乙個程序的事件形成乙個序列,其中a發生於b之前。如果a發生在b之前,換言之,單個程序被定義為具有先驗總排序的一組事件

1.如果a和b是同一程序的事件,並且a出現在b之前,則有關係 a->b

2.如果a是乙個傳送訊息程序,b是另乙個程序接收相同訊息,則有關係 a->b

3.如果存在關係 a->b && b->c,然後a->c。如果事件a未發生於事件b之前,並且事件b未發生於事件a之前,則兩個不同事件a和b被認為是併發的

系統中任意事件發生於它自身之前似乎沒有什麼物理意義,因此,->是對系統中所有事件集的反自身排序

時空圖: 橫向表示空間,縱向表示時間(沿波浪線方向遞增),點代表事件(p1,p2,q1,r1...),豎線表示過程,波浪線表示訊息

a->b 即沿著程序和訊息從a點向前移動到b(e.g. q1 -> r4); 或者描述為事件a與事件b互為因果關係。如果兩個事件都不會因為因果關係而影響另乙個事件,則會同時發生(併發)。例如事件p3和q3就是併發執行,在事件p4之前,程序p不知道程序q在q3處做什麼,直到它在p4處接收到訊息。

從狹義相對論的不變時空公式來理解,這個定義似乎很自然。相對論中事件的順序是根據可以傳送的訊息來定義的,但是,我們採取了更實用的方法,只考慮實際傳送的訊息--通過確實發生的那些事件來判斷系統是否正確執行

從抽象觀點開始,引入系統時鐘的概念,其中時鐘只是一種為事件分配數字的方式,數字被認為是事件發生的時間。為每乙個程序pi定義時鐘ci,並將數字ci分配給程序pi的任意事件a。整個系統的時鐘由函式c表示,函式c為系統中任意事件b分配數字c,其中c=cj,如果b是程序pj中的事件。到此我們沒有假設數字ci與物理時間的關係,因此我們可以將時鐘ci視為邏輯時鐘而不是物理時鐘,它可以由沒有實際定時機制的計數器實現

基於事件發生的順序,考慮定義系統時鐘條件(強):如果事件a發生在事件b之前,則a應該在比b更早的時間發生。正式描述為: 對於任意事件 a,b: if a-> b then c< c; 不期望該條件反向成立,如果反向亦成立,那麼兩個併發事件發生必須保證同一時間(太苛刻)

ir1每乙個程序pi在兩個連續的事件之間保持ci遞增

ir2(a)如果事件a通過程序pi傳送訊息m,訊息m包含傳送時間戳tm=ci; (b)一旦接收到訊息m,程序pj設定cj大於或等於它自身代表的值,設定時間戳大於tm

我們可以使用滿足時鐘條件的時鐘系統來對所有系統事件集合進行總排序。考慮由共享單個資源的固定程序集合組成的系統,一次只能有乙個程序使用該資源,因此程序必須自行同步以避免衝突。我們希望找到一種演算法將資源授予滿足以下三個條件的程序:

(1) 已授予資源的程序必須先將其釋放,然後才能將其授予其他程序

(2) 必須按照它們不同請求順序授予資源

(3) 如果被授予資源的每個程序最終都會釋放它,那麼每乙個請求最終都會被授予資源

演算法由以下五個規則定義,方便起見假定每個規則的action形成單個事件

1.程序pi將訊息tm:pi傳送到其他程序請求資源,同時將訊息put到它的請求佇列,tm是這個訊息的時間戳

2.當程序pj接收到請求訊息tm:pi,將它放入請求佇列同時傳送訊息通知到pi

3.為了釋放資源,程序pi從它的請求佇列移除tm:pi請求資源訊息,並且傳送pi釋放請求資源訊息給所有其他程序

4.當程序pj接收到pi釋放資源訊息,它將從自身的請求佇列中移除tm:pi請求資源訊息

5.當滿足以下兩個條件時,程序pi被授予資源 在其請求佇列中存在tm:pi請求資源訊息,該訊息在其佇列中的任何其他請求訊息之前(通過關係=>排序)pi已經從其他程序接收乙個時間戳在tm之後的訊息

分布式系統 向量時鐘

注意 首先我們來回顧一下 lamport 邏輯時鐘演算法,它提供了一種判斷分布式系統中事件全序關係的方法 如果 a b,那麼 c a c b 但是 c a c b 並不能說明 a b。也就是說c a c b 是 a b 的必要不充分條件,我們不能通過 lamport 時間戳對事件 a b 的因果關係...

分布式系統時鐘同步方案

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

分布式系統 Raft演算法

什麼是拜占庭將軍問題?在很久很久以前,拜占庭是東羅馬帝國的首都。那個時候羅馬帝國國土遼闊,為了防禦目的,因此每個軍隊都分隔很遠,將軍與將軍之間只能靠信使傳遞訊息。在打仗的時候,拜占庭軍隊內所有將軍必需達成一致的共識,才能更好地贏得勝利。但是,在軍隊內有可能存有叛徒,擾亂將軍們的決定。這時候,在已知有...