在分佈式系統中,數據複製通常是爲了加強系統的可用性或提升性能,可是數據一致性跟系統性能每每是矛盾的,對於數據複製的一致性問題沒有最好的解決方法。除非放寬對一致性的要求才能獲取特定場景下面的有效解決方法。那麼放寬一致性的標準是什麼?爲此,Yu 和 Vahdat 提出了一種用於衡量不一致性以及表述系統中可以容忍哪些不一致性的模型:持續一致性。分佈式
在上一篇文章《分佈式系統:一致性模型》中能夠發現,在數據複製的場景中,數據一致性跟系統性能是矛盾,對數據一致性的要求越高,系統的總體性能越低。對於數據複製的一致性問題沒有最好的解決方法。目前實際應用的一致性模型大部分都是經過放寬一致性的要求來提高性能,例如因果一致性放棄了對無因果關係的事件的順序的一致性,減小了一致性所要付出的代價。 平常生活中,一我的是否近視,近視多少度是有統一的標準能夠依據的,不然醫生無法作出判斷。一樣的,做爲系統的設計者面對一致性問題的時候也須要有一個標準,在性能和一致性之間作出權衡,那麼如今問題來了:衡量不一致性的標準是什麼? 爲了解決上面的問題,Yu 和 Vahdat 提出了一種用於衡量不一致性以及表述系統中可以容忍哪些不一致性的模型:持續一致性。post
持續一致性定義了不一致性的三個獨立座標軸:數值誤差、順序誤差、新舊誤差(不一致性的三個衡量標準),這些誤差構成了持續一致性的範圍:性能
上面的概念比較難理解,下面舉一個簡單的例子進行分析。lua
在解釋不一致性的誤差以前,須要定義一下什麼是非一致性。首先,Yu 和 Vahdat 引入一致性單元的概念,**一致性單元表示的是在一致性模型中度量的數據單元。**例如單個股票的價格能夠定義爲一個一致性單元,也能夠把多個股票的價格做爲一個一致性單元,這取決於應用場景。設計
對於每一個一致性單元,持續一致性能夠用三維向量定義爲:一致性 = (數值誤差,順序誤差,新舊誤差)。當全部誤差都爲 0 時,就達到了線性一致性的要求。3d
在給出一致性單元的定義以後,下面對一致性的誤差給出更具體的定義。cdn
在上面的示例中,能夠看到兩個副本上有包含 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 的數據在副本間是不一致的,由於數據傳輸過程當中有延遲,因此新舊誤差在除了線性一致性模型以外一致性模型都是存在的。
經過上面的分析能夠發現,限制順序誤差能夠經過控制單個副本的暫存更新數量完成,可是要限制數值誤差和新舊誤差則須要依賴全部副本的協調。
持續一致性模型給出了一種用於衡量不一致性以及表述系統中可以容忍哪些不一致性的標準,包括順序誤差、數值誤差、新舊誤差。持續一致性就像是一把尺子,給出了度量分佈式系統中不一致性的標準和方法。它的最大特色是從副本的視角出發給出了一致性衡量的方法,而不是籠統從整個系統去討論一致性,具備更強的可操做性。