天天看點

分布式系統:持續一緻性

在分布式系統中,資料複制一般是為了增強系統的可用性或提高性能,但是資料一緻性跟系統性能往往是沖突的,對于資料複制的一緻性問題沒有最好的解決方法。除非放寬對一緻性的要求才能擷取特定場景下面的有效解決方法。那麼放寬一緻性的标準是什麼?為此,Yu 和 Vahdat 提出了一種用于衡量不一緻性以及表述系統中能夠容忍哪些不一緻性的模型:持續一緻性。

什麼是持續一緻性

在上一篇文章《

分布式系統:一緻性模型

》中可以發現,在資料複制的場景中,資料一緻性跟系統性能是沖突,對資料一緻性的要求越高,系統的整體性能越低。對于資料複制的一緻性問題沒有最好的解決方法。目前實際應用的一緻性模型大部分都是通過放寬一緻性的要求來提升性能,例如因果一緻性放棄了對無因果關系的事件的順序的一緻性,減少了一緻性所要付出的代價。

日常生活中,一個人是否近視,近視多少度是有統一的标準可以依據的,否則醫生沒法做出判斷。同樣的,作為系統的設計者面對一緻性問題的時候也需要有一個标準,在性能和一緻性之間做出權衡,那麼現在問題來了:衡量不一緻性的标準是什麼?

為了解決上面的問題,Yu 和 Vahdat 提出了一種用于衡量不一緻性以及表述系統中能夠容忍哪些不一緻性的模型:持續一緻性。

持續一緻性定義了不一緻性的三個獨立坐标軸:數值偏差、順序偏差、新舊偏差(不一緻性的三個衡量标準),這些偏差構成了持續一緻性的範圍:

  • 數值偏差限制了一個副本有多少未看到的其他副本寫操作的權重(權重主要用于衡量不同寫操作的重要性,當假設所有寫操作權重相等時,權重即寫操作的數量;當寫操作的對象是數值時,可以用數值的內插補點作為權重),用于衡量目前副本值跟全局最終值之間的偏差。可以簡單了解為未全局更新的寫操作數量。例如在股票市場的價格記錄的複制場景中,應用可以指定兩個副本間的價格偏差不能超過 0.02 美元,這就是這個系統能夠容忍的最大數值偏差。
  • 順序偏差限制了一個副本中暫存寫操作的數量,用于衡量暫存的寫操作在本地副本的順序與最終送出的寫操作全局最終順序之間的差異。順序偏差相對來說比較難了解,首先當允許副本間有差異的時候,那麼必定有一個時刻副本會暫存一些寫操作,這些寫操作在全局送出之後才會成為永久更新,但是這些寫操作不一定都能送出成功,它可能會復原,這意味着副本暫存寫操作的順序跟最終送出的順序不一定一緻。然而暫存的寫操作有哪些會復原導緻順序不一緻無法預測,是以為了友善起見,直接取暫存寫操作的數量作為順序偏差,因為這是順序偏差的上限。這就是順序偏差的計算規則的由來。舉個例子,如果要計算兩階段分布式事務的順序偏差,那麼它的順序偏差就是準備階段寫操作的數量。
  • 新舊偏差限制了副本間同步寫操作的延遲時間,即消息延遲。例如在天氣預報的資料更新場景中,天氣資料的更新不能超過 4 個小時的延遲,這段時間就是天氣預報系統能夠容忍的新舊偏差。

上面的概念比較難了解,下面舉一個簡單的例子進行分析。

一緻性的衡量标準

一緻性單元

在解釋不一緻性的偏差之前,需要定義一下什麼是非一緻性。首先,Yu 和 Vahdat 引入一緻性單元的概念,一緻性單元表示的是在一緻性模型中度量的資料單元。例如單個股票的價格可以定義為一個一緻性單元,也可以把多個股票的價格作為一個一緻性單元,這取決于應用場景。

對于每個一緻性單元,持續一緻性可以用三維向量定義為:一緻性 = (數值偏差,順序偏差,新舊偏差)。當所有偏差都為 0 時,就達到了線性一緻性的要求。

在給出一緻性單元的定義之後,下面對一緻性的偏差給出更具體的定義。

  • 數值偏差表示對于一個副本(一緻性單元) R,有多少其他副本的更新沒有應用到 R 上,并且這些更新的影響是什麼。
  • 順序偏差表示對于一個副本(一緻性單元) R,R 有多少暫存的更新操作
  • 新舊偏差表示對于一個副本(一緻性單元) R,R 有多長時間沒有更新資料

一緻性衡量的例子

分布式系統:持續一緻性
  • 标為灰色的操作表示已送出的更新,白色的操作為未送出的更新
  • <5,B> 表示對資料 B 執行操作時的向量時鐘的值為 5,可簡單了解為資料版本
  • 數值偏差定義為 n(w)
    • n = 副本 R 未看到的其他副本的更新數量
    • w = 偏差的權重 = 副本 R 一緻性單元中所有變量目前值與全局值的數值內插補點

在上面的示例中,可以看到兩個副本上有包含 x,y 的一緻性單元上。這兩個變量的初始值都為 0。注意,由于副本 A 最後的操作是 <23, A>,是以它的向量時鐘為 (24, 5)。(參考

向量時鐘

首先來分析順序偏差,副本 A 從副本 B 接受了 x+=2 的操作,并且送出為永久更新,注意此時副本 B 的 x+=2 的操作并未送出。副本 A 有三個暫存的寫操作:<10, A>、<14, A>、<23, A>,是以此時它的順序偏差為 3。而副本 B 有兩個暫存的寫操作,是以它的順序偏差為 2。

接下來分析一下數值偏差,副本 A 還沒有看到來自副本 B 的操作是 <16, B>,是以其數值偏差為 1,而權重的計算會稍微難了解一點,首先在這個例子中,由于一緻性單元的變量是數值對象,是以這裡權重可以定義為數值的差。在目前的圖示狀态中,假設所有值都會被送出為永久更新,一緻性單元的最終值為:x=3,y=5,而此時副本 A 的值為:x=3,y=4,副本 A 的數值偏差權重為:(3+5)-(3+4)=1。同理,副本 B 還沒有看到來自副本 A 的操作有:<10, A>、<14, A>、<23, A>,是以其數值偏差為 3,副本 B 的值為:x=2,y=1,其數值偏差權重為 (3+5)-(2+1)=5。綜上,數值偏差的計算比較直覺,就是副本的目前未看到其他副本的更新數量,而權重相對比較難了解,它反映的是目前副本一緻性單元的快照跟全局快照的數值內插補點。值得注意的是,權重的計算跟資料的類型息息相關,主要取決于系統中對于資料更新權重的定義,像數值類型就可以用內插補點來衡量,像字元類型就沒法用這種方式來計算,一種可行的方案就是認為權重都相等,此時權重就等于寫操作的數量。

最後分析一下新舊偏差,上面的例子中沒有展現出新舊偏差,但是前面已經舉了天氣預報的例子。實際上新舊偏差是相對好了解的,在分布式系統中消息傳遞是有延遲的,而這個延遲的時間就是我們所說的新舊偏差。有那麼一段時間對 X 的資料在副本間是不一緻的,因為資料傳輸過程中有延遲,是以新舊偏差在除了線性一緻性模型之外一緻性模型都是存在的。

通過上面的分析可以發現,限制順序偏差可以通過控制單個副本的暫存更新數量完成,但是要限制數值偏差和新舊偏差則需要依賴所有副本的協調。

總結

持續一緻性模型給出了一種用于衡量不一緻性以及表述系統中能夠容忍哪些不一緻性的标準,包括順序偏差、數值偏差、新舊偏差。持續一緻性就像是一把尺子,給出了度量分布式系統中不一緻性的标準和方法。它的最大特點是從副本的視角出發給出了一緻性衡量的方法,而不是籠統從整個系統去讨論一緻性,具有更強的可操作性。

參考資料

繼續閱讀