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

2021-10-16 04:49:34 字數 2552 閱讀 3166

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

這類問題通常會出在常用的db或kv中介軟體中。

如上圖中,縱軸分別表示a\b\c三個節點,橫軸表示時間軸。a\b節點可以看做是請求寫入資料的節點,c節點可以看做是最終寫入資料的節點。

在3:00,a寫入發起將x寫入為0的請求,在3:01a告訴b把x寫入為1,在3:02a告訴b的寫入請求開始發起,b的寫入請求在3:03時間到達寫入節點c,寫入成功,但是a在3:00的時候發起的寫入請求到3:04才到c節點,這樣a先發起的請求最後更新到db或者kv中,這樣就出錯了。

這種方式可以簡單稱為物理時鐘,即分布式系統中所有的節點都遵循同樣的時間,即 「絕對」 時間,但是無論採用怎樣的時間同步機制,不但要保證時間同步機制始終生效,還要知道,這樣的絕對時間精度總有上限的。

上面的解釋是抄別的參考的專業描述,實際上簡單點描述就是,不同機器之間的時間是不同步的,即使再怎麼同步也會有那麼乙個時間差值,比如說1ms,1us等等。雖然有很多種ntp時鐘同步的方案,但是物理世界做到完整的時鐘一絲絲(這裡的一絲絲你可以認為完全逼近沒有差值)不差是不可能的,總歸是有差值在的,高併發情況下這樣可不行。

既然上面的有問題,然後lamport提出了邏輯時鐘,lamport 也是搞paxos made ******文章的作者,大佬就是大佬。

然後就寫了一篇**,time, clocks, and the ordering of events in a distributed system

闡述了這樣乙個觀點:邏輯時鐘和物理時鐘最大的區別是,它不再關心絕對的 「時間」 是多少,轉而關心事件之間的發生順序,即它們的發生先後這一依賴關係。所謂的邏輯時鐘就是,每個節點都維護乙個永遠遞增的版本號version,在傳送的時候把時間改為version就行了。每當有事件產生和傳送,版本號就自增 1;如果有寫入請求到達,發現版本號比現在版本號小的直接丟掉就行了,反之並更新當前的版本號為當前版本號和請求所攜帶的版本號二者的最大值。

最開始 a、b、c 三個節點的版本號都是 0;

在節點 a 產生了給 x 賦值 0 的事件,版本號更新為 1,這個事件被傳送給 c;

接著版本號為 2 的事件傳遞給了 b,b 的版本號就更新為自己的當前版本號(為 0)和接收事件的版本號(為 2)二者的最大值 2,由此觸發產生給 x 賦值 1 的事件並傳送給 c,這時的版本號為 3;

c 首先收到了版本號為 3 的事件,比當前版本號 0 要大,因此接納事件,賦值 x 為 1,並更新當前版本號為 3;

c 接著又收到了版本號為 1 的事件,比當前版本號 3 要小,因此丟棄該事件。

衝突問題

節點 b 先發生某請求,版本號更新為 1,接著產生資料變更事件,賦值 x 為 0,版本號為 2,此事件需要同步到 c;

接著 a 上產生賦值 x 為 1 的請求,版本號為 1,同步到 c;

b 傳送過來的同步事件被 c 接納,c 上版本號為 2,x 被賦值為 0;

a 傳送過來的同步請求被 c 丟棄,因為此時 c 的版本號已經是 2 了,大於 b 同步過來的版本號 1。

採用向量(vector)時鐘的方式時,前面提到的單純版本號,就會變成乙個版本號陣列,上面記錄了每乙個節點當前的版本號:

c 的初始版本號是 [a:0, b:0, c:0],它先收到了 x 賦值為 1 的事件,其版本號是 [a:2, b:1, c:0],這個版本號的每一維,都等於或大於初始版本號,因此,接納該事件;

之後收到了 x 賦值為 0 的事件,其版本號是 [a:1, b:0, c:0],這個版本號的每一維,都小於或等於當時的版本號,因此,丟棄該事件。

相應地,我們再來看看前面那個 「衝突識別」 的例子:

最後,就如同任何軟體上的解決方案都有兩面性一樣,向量時鐘也不是完美的,比方說,在節點數量巨大的情況下,你可以想象這個版本號的向量維度會非常高,那麼傳遞乙個簡單的資訊,得攜帶大得多的版本資訊這樣的 overhead。

後面的我就沒再重寫了,直接複製的。有興趣的可以看看原文,底下第二個參考資料。

time, clocks, and the ordering of events in a distributed system

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

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

邏輯時鐘 邏輯時鐘,又稱Lamport演算法

時間同步不需要絕對的精確時間,如果程序間沒有相互作用,就不需要時鐘同步並且程序所關心的不是說明時間做什麼工作,它們所關心的是事件發生的順序 時間戳 timestamp 在分布式系統中,每一台機器都設定乙個整型變數作為時鐘,當a發生時,用這個時鐘的值作為a的timestamp,記為c a 這樣有 if...

分布式系統 向量時鐘

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