分布式系統中的數據同步

jopen 10年前發布 | 45K 次閱讀 數據同步

許多人在日常工作中都會用到分布式系統,它的好處就是它所提供的穩定性,容錯性以及伸縮性使我們能更容易地構建出穩定,高效的應用。然而分布式系統的使用非常具有挑戰性,包括數據同步以及理解沖突的意義。

分布式系統中的數據同步本身就是一項非常巨大的挑戰。如果光看物理時間戳的話我們無法確定哪個版本的數據才是最新的,因為你無法確保所有的實體的物 理時鐘都是完美同步的。比如說,兩臺同步的服務器將時間戳寫入到同一個系統中。如果一臺服務器慢了哪怕只有幾毫秒,很快它就無法得知事件的真實順序了。為 了解決這一問題,我們可以采用基于事件的邏輯時鐘而不是真實時間來構建出部分有序的集合。

你可以認為邏輯時鐘就是標明系統中的事件的版本的一種方式。通過查看這些有序的集合,我們就能同步系統中的數據,因為我們可以知道哪些數據是最新的,并且可以識別出哪些事件是并發的。

我承認當我第一次聽說“向量時鐘”或者”Lamport時間戳”這個概念時,我發現它們其實是一些我無法理解的荒唐的數學算法。或許更重要的是,出于恐懼,我在逃避去學習它們。所幸的是,我發現它們其實要比我想像的簡單得多。我們來一窺它底層的奧秘并看看它是如何工作的。

Lamport時間戳

Lamport時間戳由Leslie Lamport于21世紀初所發明,是這兩者中較簡單的一個了。系統中的每個實體都有一個自己的計數器,在處理事件前它會對將該值遞增,當它需要和其它實 體進行同步的時候也會把這個時間戳帶上。再強調一次,這里的時間戳并不是物理時間戳(比如說今天下午1點),而是一些數字,它們只要當和同一系統中的其它 時間戳進行比較時才有意義。

假設我們有一個包含三個節點的分布式系統,每個節點都獨立地處理事件:

在這個時候,節點1和節點3已經處理了事件A和事件B,并把它們對應的Lamport時間戳增加到了1。但是它們還沒有和節點2進行同步,所以我們先繼續往下走:

現在節點1和節點3已經同步了,節點1還把自己的時間戳同步了過去,將節點2的時間戳增加到1。我們再往前走一步:

節點3已經處理了2個事件(D和E),并和其它兩個節點進行了同步。注意到節點2的Lamport時間戳增加到了3,因為事件E的時間戳已經是3了,所以它直接跳過了2,選擇了一個更高的值。

現在我們的節點已經完全同步了,不過這些時間戳能說明什么呢?Lamport證明這個理論的過程“非常深奧”,因此我們這里不會介紹這個算法的細節了,不過我們知道在Lamport的因果關系中,事件B在D之前到達,E發生在F之前,而F發生在G之前。

不幸的是,由于我們沒有存儲其它節點的狀態,因此有些事情我們是無法知道的。比如說,我們無法得知C是在B之前或者之后發生的,或者說它們是并發的。要想知道這些信息,我們得用到向量時鐘。

向量時鐘

Colin Fidge和Freiedemann Mattern在1988年分別提出了向量時鐘的概念,和Lamport時間戳相比,它能提供能詳細的信息,也被應用于Riak等系統之中。和 Lamport中每個實體分別存儲自己的時間戳不同的是,它存儲的是時間戳的向量,向量的大小等于系統中實體的數量。每個實體都清楚自己在向量中的位置, 以及最后一次同步時它的兄弟節點的時鐘。你可以把它看作是這個實體對系統的其它部分的認知的一項記錄。

記住,同步事件里面包含發送者的向量時鐘。算法通過比較這些時鐘,可以更好地確定事件的出現順序。它會按照下面的規則來比較向量時鐘里的每個元素:

  • 如果事件X的所有時間戳都小于或等于事件Y的時間戳,則X事件在Y事件之前發生,它們不是并發的:

  • 如果事件X的所有時間戳都大于或于Y的,那么Y在X之前到來,它們也不是并發的:

  • 如果X的某些時間戳早于Y的,某些又晚于Y,那么這兩個事件就認為是并發的,我們無法區分它們的順序:

了解了這些規則,我們再來看一下前面那個Lamport時間戳的例子,這次我們用的是向量時鐘:

使用Lamport時間戳,我們無法確定是否C在B之前發生,但根據向量時鐘的最后一條規則,現在我們知道它們實際上是并發的事件。這說明它們是幾乎在同一個時間發生的。

向量時鐘并非萬能的,比如說,他們無法對所有的事件進行排序,因為我們只做到了部分有序——正如前例中的那樣,我們只是知道這些事件在同一個時間點發生。因此可以由此檢測出并發的寫操作,但也正因如此,它們的順序是無法確定的。

結論

希望現在你能對分布式系統的同步存在的一些獨特的挑戰能有一個更深入的理解,至少你知道了解決這些問題的一種方式。

在這里更有趣的一點收獲就是,你沒費多大勁就了解到了你所使用的系統中的最復雜的一部分。當然了,你可能永遠也不會自己去寫一個向量時鐘系統,但這 并不重要。重要的是我故意去逃避的那部分難以理解的東西恰恰影響到了我的碼農之路。攻克一些難關,深入地理解它們,我相信你一定會學到一些東西的。

原創文章轉載請注明出處:分布式系統中的數據同步

英文原文鏈接

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!