分佈式系統:持續一致性

在分佈式系統中,數據複製通常是爲了加強系統的可用性或提升性能,可是數據一致性跟系統性能每每是矛盾的,對於數據複製的一致性問題沒有最好的解決方法。除非放寬對一致性的要求才能獲取特定場景下面的有效解決方法。那麼放寬一致性的標準是什麼?爲此,Yu 和 Vahdat 提出了一種用於衡量不一致性以及表述系統中可以容忍哪些不一致性的模型:持續一致性。分佈式

什麼是持續一致性

在上一篇文章《分佈式系統:一致性模型》中能夠發現,在數據複製的場景中,數據一致性跟系統性能是矛盾,對數據一致性的要求越高,系統的總體性能越低。對於數據複製的一致性問題沒有最好的解決方法。目前實際應用的一致性模型大部分都是經過放寬一致性的要求來提高性能,例如因果一致性放棄了對無因果關係的事件的順序的一致性,減小了一致性所要付出的代價。 平常生活中,一我的是否近視,近視多少度是有統一的標準能夠依據的,不然醫生無法作出判斷。一樣的,做爲系統的設計者面對一致性問題的時候也須要有一個標準,在性能和一致性之間作出權衡,那麼如今問題來了:衡量不一致性的標準是什麼? 爲了解決上面的問題,Yu 和 Vahdat 提出了一種用於衡量不一致性以及表述系統中可以容忍哪些不一致性的模型:持續一致性。post

持續一致性定義了不一致性的三個獨立座標軸:數值誤差、順序誤差、新舊誤差(不一致性的三個衡量標準),這些誤差構成了持續一致性的範圍:性能

  • **數值誤差限制了一個副本有多少未看到的其餘副本寫操做的權重(權重主要用於衡量不一樣寫操做的重要性,當假設全部寫操做權重相等時,權重即寫操做的數量;當寫操做的對象是數值時,能夠用數值的差值做爲權重),用於衡量當前副本值跟全局最終值之間的誤差。能夠簡單理解爲未全局更新的寫操做數量。**例如在股票市場的價格記錄的複製場景中,應用能夠指定兩個副本間的價格誤差不能超過 0.02 美圓,這就是這個系統可以容忍的最大數值誤差。
  • **順序誤差限制了一個副本中暫存寫操做的數量,用於衡量暫存的寫操做在本地副本的順序與最終提交的寫操做全局最終順序之間的差別。**順序誤差相對來講比較難理解,首先當容許副本間有差別的時候,那麼一定有一個時刻副本會暫存一些寫操做,這些寫操做在全局提交以後纔會成爲永久更新,可是這些寫操做不必定都能提交成功,它可能會回滾,這意味着副本暫存寫操做的順序跟最終提交的順序不必定一致。然而暫存的寫操做有哪些會回滾致使順序不一致沒法預測,所以爲了方便起見,直接取暫存寫操做的數量做爲順序誤差,由於這是順序誤差的上限。這就是順序誤差的計算規則的由來。舉個例子,若是要計算兩階段分佈式事務的順序誤差,那麼它的順序誤差就是準備階段寫操做的數量。
  • **新舊誤差限制了副本間同步寫操做的延遲時間,即消息延遲。**例如在天氣預報的數據更新場景中,天氣數據的更新不能超過 4 個小時的延遲,這段時間就是天氣預報系統可以容忍的新舊誤差。

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

一致性的衡量標準

一致性單元

在解釋不一致性的誤差以前,須要定義一下什麼是非一致性。首先,Yu 和 Vahdat 引入一致性單元的概念,**一致性單元表示的是在一致性模型中度量的數據單元。**例如單個股票的價格能夠定義爲一個一致性單元,也能夠把多個股票的價格做爲一個一致性單元,這取決於應用場景。設計

對於每一個一致性單元,持續一致性能夠用三維向量定義爲:一致性 = (數值誤差,順序誤差,新舊誤差)。當全部誤差都爲 0 時,就達到了線性一致性的要求。3d

在給出一致性單元的定義以後,下面對一致性的誤差給出更具體的定義。cdn

  • 數值誤差表示對於一個副本(一致性單元) 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。blog

接下來分析一下數值誤差,副本 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 的數據在副本間是不一致的,由於數據傳輸過程當中有延遲,因此新舊誤差在除了線性一致性模型以外一致性模型都是存在的。

經過上面的分析能夠發現,限制順序誤差能夠經過控制單個副本的暫存更新數量完成,可是要限制數值誤差和新舊誤差則須要依賴全部副本的協調。

總結

持續一致性模型給出了一種用於衡量不一致性以及表述系統中可以容忍哪些不一致性的標準,包括順序誤差、數值誤差、新舊誤差。持續一致性就像是一把尺子,給出了度量分佈式系統中不一致性的標準和方法。它的最大特色是從副本的視角出發給出了一致性衡量的方法,而不是籠統從整個系統去討論一致性,具備更強的可操做性。

參考資料

相關文章
相關標籤/搜索