天天看點

分布式系統——一緻性

分布式系中的一緻性

參考文章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是最終一緻,隻要求在沒有新寫入的情況下,最終所有資料達成一緻,常見于一些異步複制的系統。

繼續閱讀