目的:
由於分布式系統中各個機器之間的系統時間同步差異,導致無法用物理時鐘準確衡量事件的先後順序。因此,提出了邏輯時鐘這一概念,用來定義分布式系統中所有事件的發生順序
背景偏序與全序關係,這在大學的線性代數課程中有相關概念。簡單的講,對於乙個數字集合,如果能夠定義兩兩之間的先後關係,則該集合為全序關係。如果該集合中分為多個子集,子集內部兩兩有先後關係,而子集之間沒有先後關係,則該集合為偏序關係。
邏輯時鐘
如上圖所示,根據邏輯時鐘的原理,我們可以定義這些事件集的乙個偏序關係。在這個偏序集中,存在因果關係的事件順序是正確的。如果要得到所有事件的乙個全序關係(邏輯時鐘時間戳序號相等的事件間先後關係),我們可以自己定義乙個規則,比如程序號小的排序在前,這樣就可以得到全部事件的乙個全序關係了。
注意:lamport邏輯時鐘只保證因果關係(偏序)的正確性,不保證絕對時序的正確性。
邏輯時鐘解決資源競爭問題
前提:對於任意的兩個程序pi和pj,它們之間傳遞的訊息是按照傳送順序被接收到的, 並且所有的訊息最終都會被接收到
具體實現流程不細講,大概是每個程序在申請資源前都會通知所有程序,從而有乙個全域性順序,按這個順序去獲取資源。2pc,paxos等協議其實多多少少都是基於這種思想實現的。
向量時鐘
邏輯時鐘定義的是乙個全序關係,沒辦法準確表示出併發關係(如c2和b4事件其實是併發的),有些場景下我們需要知道事件的併發關係。邏輯時鐘之所以沒辦法表示出併發關係,是因為每個程序只擁有自己的本地時間,沒有其他程序的時間。
假設有事件 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) 沒有因果關係,屬於同時發生事件。
簡單地講:b4事件發生時它看到它本身自己的邏輯時間戳是4,c的邏輯時間戳是1。c2事件發生時它看到自己的邏輯時間戳是2,而b的邏輯時間戳是3。則這兩個就是併發關係了。
向量時鐘做衝突檢測
通過向量時鐘可以知道兩個寫操作之間的併發關係,如果操作的是同一條資料,則證明發生了資料衝突
還需要物理時鐘嗎
邏輯時鐘只能對一整個分布式系統內部的事件做排序,對於外部的一些事件所引發的先後順序是無法感知的。
物理時鐘的使用是更加簡單的,如果能夠控制分布式系統內部各個機器之間的系統時間誤差,使用物理時鐘也能夠解決大部分問題
參考:lamport logical clock 學習
分布式系統:lamport 邏輯時鐘
分布式系統理論基礎 - 時間、時鐘和事件順序
分布式系統:向量時鐘
分布式系統 向量時鐘
注意 首先我們來回顧一下 lamport 邏輯時鐘演算法,它提供了一種判斷分布式系統中事件全序關係的方法 如果 a b,那麼 c a c b 但是 c a c b 並不能說明 a b。也就是說c a c b 是 a b 的必要不充分條件,我們不能通過 lamport 時間戳對事件 a b 的因果關係...
邏輯時鐘 分布式物理時鐘邏輯時鐘和向量時鐘
在分布式系統中,多個節點都有可能修改資料,由於網路等的原因,第乙個修改的時間節點發起的寫入請求並不一定能最先到達實際寫入節點,為了資料的一致性,各個節點對同一資料產生的update create的值要達到一致性,一般情況下就需要對各個節點的請求資料更新時間進行比對,將最後更新的資料更新到資料系統中 ...
分布式系統學習
分布式系統中節點分布情況在空間上是隨意分布的。系統中所有節點都是對等的,沒有主從之分。副本是分布式系統對資料和服務提供的一種冗餘方式,資料副本是指在不同節點上持久化同乙份資料,解決單點故障資料丟失的問題,服務副本是指多個節點提供同樣的服務,每個節點都有能力接受來自外部的請求並進行相應的處理。分布式系...