談談分布式系統的一致性

2021-09-08 23:00:24 字數 3171 閱讀 1453

一致性(consistency)一直是分布式系統裡乙個很重要的話題。

在儲存系統中,為了避免資料丟失,我們都會對資料進行持久化。

對資料進行持久化可以避免宕機帶來的資料丟失問題,但是不能解決單機永久性故障的問題。儲存系統作為基礎設施,在單機上持久化是遠遠不夠的,我們需要將資料複製到多台機器上以提公升系統的可用性和可靠性。

一旦資料被複製到多個節點,那麼就產生了一致性的問題。

系統需要定義一組協議來規定使用者讀寫多副本的行為,這組協議稱之為一致性模型(consistency model)。在分布式系統領域,談論一致性時通常談論的都是一致性模型。

不同的一致性模型對系統的行為和表現有不同的約束。

strict consistency

strict consistency是最強的一致性模型,要求任何讀取操作都能讀取到最新的值,換句話說,要求任何寫入操作立即同步給所有程序。在分布式系統中,資料的同步是需要時間的,因此在分布式系統下無法嚴格實現strict consistency。除非讓所有的讀寫操作都只在乙個程序的乙個執行緒中執行或者,讀寫操作被鎖保護起來。(根據cap的原理,這個一致性模型在沒有犧牲可用性的前提下是不能得到滿足的。 效能也是不可接受的:所有的寫操作需要同步到所有節點之後再返回給客戶端。)

strict consistency如上圖所示,在時間軸上,一旦有進行寫入了x=1,其他程序立即能讀到x=1的值。

sequential consistency

sequential consistency是比strict consistency弱一些的一致性模型,要求:

程序內,對同乙個變數的讀寫保持順序

程序間,「看到」的變數的變更順序是一致的(不要求和「物理時間」下的順序保持一致)

以consistency model中的例子舉例,「看到」以下幾種資料的變更順序都是滿足sequential consistency的:

(程序間的事件的順序可以參看《time, clocks, and the ordering of events in a distributed system》)

linearizable consistency

linearizable consistency比sequential consistency更嚴格一些:

程序內,對同乙個變數的讀寫操作保持順序

程序間,「看到」的變數的變更順序和全域性「物理時鐘」下的順序是一致的

即linearizable consistency是sequential consistency的特例,除了滿足所有程序讀到的變更順序是相同,還要求這個順序和全域性時鐘下的順序是一致的。

和全域性時鐘下的順序保持一致容易理解,即事件的順序和它們在客觀的物理時間下發生的時間順序是一致的。但是如果事件是併發發生的,如何滿足這個順序要求:

如上圖,p0的write x=1操作和p1的read x=0/1有重疊的部分,那麼之間的先後關係是怎樣的?

對於併發的情況linearizable consistency並不要求他們之間有確定的順序,即認為p0的write x=1先於p1的read x=0/1或者p1的read x=0/1先於p0的write x=1都是合理的,但是p0~p3程序看到的這兩個操作的順序必須是確定的、一致的。

上圖的例子中,滿足以下情況的序列都是滿足linearizable consistency的:

以上三種一致性模型:strict consistency、linearizable consistency、sequential consistency都是強一致模型

causal consistency

causal consistency是一種弱一致性模型,僅要求有因果關係的操作順序性得到保證,非因果關係的操作順序性沒有要求。

具體如下:

本地順序:統一程序中,事件的執行順序即為本地的因果順序

異地順序:如果讀操作返回的是寫操作的值,那麼該寫操作一定在讀操作之前

閉包傳遞:如果a->b,b->c,那麼a->c

比causal consistency更弱的一致性模型還有eventual consistency(最終一致),比如mysql的非同步複製。

eventual consistency:儲存系統保證如果沒有新的寫操作,那麼最終,所有的讀操作都能讀到一致的資料,這裡強調對乙個資料項的修改最終會收斂。

本文簡單的描述了分布式系統中一致性問題的由來,並介紹了幾種一致性模型。其中,strict consistency要求最為嚴格,是現實環境中難以滿足的一種一致性模型,除非犧牲可用性。linearizable consistency略弱於strict consistency,不要求寫入操作立即可見,但是要求寫入操作保持和全域性時鐘下的順序一致。sequential consistency則更弱一些,不要求寫入操作保持和全域性時鐘下的順序一致,但是要求所有程序看到的寫入操作的順序是一致的。strict consistency、linearizable consistency、sequential consistency都被認為是強一致的模型。

eventual consistency是最終一致,只要求在沒有新寫入的情況下,最終所有資料達成一致,常見於一些非同步複製的系統。

螞蟻中介軟體團隊是服務於整個螞蟻金服集團的核心技術團隊,打造了世界領先的金融級分布式架構的基礎中介軟體平台。我們是隸屬於螞蟻中介軟體的通訊中介軟體團隊,致力於打造金融級的分布式訊息中介軟體。

分布式一致性

分布式一致性是指在分布式環境中對某個副本資料進行更新操作時,必須確保其他副本也會更新,避免不同副本資料不一致。分布式系統乙個重要的問題時解決資料複製,一是為了增加系統的可用性防止單點故障,二是提高系統可用性,通過負載聚恆,使分布在不同位置的資料副本能夠提供服務。理想狀態下,當然希望分布式系統能夠實現...

分布式一致性

分布式系統的乙個重要問題是資料的複製。對資料的複製一般有兩個原因 資料複製的主要難題是保持各個副本的一致性。即在更新乙個副本時,必須確保同時更新其他的副本,否則資料的各個副本將不再相同。一致性模型實質上是程序和資料儲存之間的乙個約定。正常情況下,乙個資料項上執行讀操作時,它期待該操作返回的是該資料在...

分布式一致性方案

首先,先說一下。老外提出了乙個快取更新套路,名為 cache aside pattern 其中就指出 不是的。假設這會有兩個請求,乙個請求a做查詢操作,乙個請求b做更新操作,那麼會有如下情形產生 快取剛好失效 請求a查詢資料庫,得乙個舊值 請求b將新值寫入資料庫 請求b刪除快取 請求a將查到的舊值寫...