分布式系中的一緻性
參考文章https://www.cnblogs.com/hzmark/p/consistency_model.html
一緻性一直是分布式系統中的一個重要的話題,在系統中,為了避免資料丢失,我們通常都會把處理好的資料進行持久化,但是在分布式系統中,一個資料可能被多個節點直接或間接地通路,這個時候,常常由于網絡問題,資料的同步往往會十分不理想,導緻得到的結果有偏差。
是以系統需要定義一組協定來規定使用者讀寫多副本的行為,這組協定稱之為一緻性模型(Consistency Model)。在分布式系統領域,談論一緻性時通常談論的都是一緻性模型。
不同的一緻性模型對系統的行為和表現有不同的限制。
下面是三個強一緻性的模型
1. Strict Consistency
Strict Consistency是最強的一緻性模型,要求任何讀取操作都能讀取到最新的值,換句話說,要求任何寫入操作立即同步給所有程序。在分布式系統中,資料的同步是需要時間的,是以在分布式系統下無法嚴格實作Strict Consistency。除非讓所有的讀寫操作都隻在一個程序的一個線程中執行或者,讀寫操作被鎖保護起來。(根據CAP的原理,這個一緻性模型在沒有犧牲可用性的前提下是不能得到滿足的。 性能也是不可接受的:所有的寫操作需要同步到所有節點之後再傳回給用戶端。)
2. Sequential Consistency
Sequential Consistency是比Strict Consistency弱一些的一緻性模型,要求:
程序内,對同一個變量的讀寫保持順序
程序間,“看到”的變量的變更順序是一緻的(不要求和“實體時間”下的順序保持一緻)
3. Linearizable Consistency
Linearizable Consistency比Sequential Consistency更嚴格一些:
程序内,對同一個變量的讀寫操作保持順序
程序間,“看到”的變量的變更順序和全局“實體時鐘”下的順序是一緻的
即Linearizable Consistency是Sequential Consistency的特例,除了滿足所有程序讀到的變更順序是相同,還要求這個順序和全局時鐘下的順序是一緻的。
和全局時鐘下的順序保持一緻容易了解,即事件的順序和它們在客觀的實體時間下發生的時間順序是一緻的。
Causal Consistency
Causal Consistency是一種弱一緻性模型,僅要求有因果關系的操作順序性得到保證,非因果關系的操作順序性沒有要求。
具體如下:
本地順序:統一程序中,事件的執行順序即為本地的因果順序
異地順序:如果讀操作傳回的是寫操作的值,那麼該寫操作一定在讀操作之前
閉包傳遞:如果a->b,b->c,那麼a->c
(Lamport在《Time, Clocks, and the Ordering of Events in a Distributed System》中描述的happen-before關系及其傳遞閉包)
騰訊朋友圈的例子
在infoq分享的騰訊朋友圈的設計中,他們在設計資料一緻性的時候,使用了因果一緻性這個模型。用于保證對同一條朋友圈的回複的一緻性,比如這樣的情況:
A發了朋友圈内容為梅裡雪山的圖檔。
B針對内容a回複了評論:“這裡是哪裡?”
C針對B的評論進行了回複:“這裡是梅裡雪山”
那麼,這條朋友圈的顯示中,顯然C針對B的評論,應該在B的評論之後,這是一個因果關系,而其他沒有因果關系的資料,可以允許不一緻。
微信的做法是:
每個資料中心,都自己生成唯一的、遞增的資料ID,確定能排重。在下圖的示例中,有三個資料中心,資料中心1生成的資料ID模1為0,資料中心1生成的資料ID模2為0,資料中心1生成的資料ID模3為0,這樣保證了三個資料中心的資料ID不會重複全局唯一。
每條評論都比本地看到所有全局ID大,這樣來確定因果關系。
比Causal Consistency更弱的一緻性模型還有Eventual Consistency(最終一緻),比如MySQL的異步複制。
Eventual Consistency:存儲系統保證如果沒有新的寫操作,那麼最終,所有的讀操作都能讀到一緻的資料,這裡強調對一個資料項的修改最終會收斂。
總結
本文簡單的描述了分布式系統中一緻性問題的由來,并介紹了幾種一緻性模型。
Strict Consistency要求最為嚴格,是現實環境中難以滿足的一種一緻性模型,除非犧牲可用性。
Linearizable Consistency略弱于Strict Consistency,不要求寫入操作立即可見,但是要求寫入操作保持和全局時鐘下的順序一緻。
Sequential Consistency則更弱一些,不要求寫入操作保持和全局時鐘下的順序一緻,但是要求所有程序看到的寫入操作的順序是一緻的。
Strict Consistency、Linearizable Consistency、Sequential Consistency都被認為是強一緻的模型。
Causal Consistency被認為是一種若一緻模型,它隻要求有因果關系的事件之間保持順序,詳細可以參看Lamport在《Time, Clocks, and the Ordering of Events in a Distributed System》中描述的happen-before關系及其傳遞閉包。
Eventual Consistency是最終一緻,隻要求在沒有新寫入的情況下,最終所有資料達成一緻,常見于一些異步複制的系統。