圖解分佈式系統CAP定理

CAP定理是分佈式系統的基礎理論。其中

C代表一致性(Consistency),A代表可用性(Avalability),P代表分區容錯性(Partition tolerance)。

CAP定理說的是,在一個分佈式系統中,不可能同時滿足一致性、可用性和分區容錯性這三個條件。為了說明CAP定理為什麼成立,我們先要搞清楚其中這三個條件的具體含義。

圖解分佈式系統CAP定理

為了便於解釋,我們以一個非常簡單的分佈式系統作為例子。這個系統由兩臺服務器組成,分別為G1和G2。在這兩臺服務器上,記錄著同一個變量值v。該變量的初始值是v0。G1和G2之間可以通過網絡進行通信。同時,它們也可以和一個客戶端之間進行通信。我們的系統看起來是這樣的:

圖解分佈式系統CAP定理

客戶端可以對任意一臺服務器發送讀寫請求。當服務器收到請求後,它會對變量v進行更新,並將更新後的結果返回給客戶端。讀的過程是這樣的

圖解分佈式系統CAP定理

而寫的過程是這樣的:

圖解分佈式系統CAP定理

現在我們有了一個分佈式系統,下面我們就在這個系統上解釋一致性、可靠性和分區容錯性的具體含義。

一致性

如果一個讀請求發生在一次寫請求之後,那麼該讀請求返回的值必須是這次寫請求的值,或者是更晚的寫請求的值。

這意味著,在一個滿足一致性的系統中,客戶端向任意一個服務器寫入數據,得到的返回值至少是這次寫入的值,或者是由更晚一些的其它寫操作產生的更新的值。

對於一個不一致的系統,它的讀寫過程是這樣的:

圖解分佈式系統CAP定理

這裡,客戶端向G1發送寫請求,並得到響應。但是當它向G2讀取時,讀到的依然是初始值v0。

而在一個一致性系統中,讀寫過程是這樣的:

圖解分佈式系統CAP定理

在這個系統中,G1在發送響應之前,先將自己的值同步給G2。當客戶端向G2讀取數據時,得到的就是最新的值v1。

可用性

系統中正常工作的結點必須響應每一個請求。

也就是說,如果客戶端發送請求給一個服務器,並且該服務器沒有掛掉,那麼它就必須響應客戶端的這個請求,而不能將其忽略掉。

分區容錯性

網絡中可以丟失任意多的消息。

也就是說,G1發給G2的消息可以在網絡中被丟掉。如果結點間所有的消息都被丟掉時,那麼我們的系統就會變成這樣:

圖解分佈式系統CAP定理

分區容錯性要求系統必須在網絡被任意分割的情況下還能夠正常工作。

CAP定理的證明

下面我們來證明,一個分佈式系統不可能同時滿足上面定義的一致性、可用性和分區容錯性三個條件。

我們使用反正法,即假設存在這樣一個系統可以同時滿足這三個條件。

如果是這樣的話,我們就將這個系統中的結點間的網絡斷開,

圖解分佈式系統CAP定理

然後客戶端向G1發送寫請求,G1中值被更新為v1。由於系統滿足可用性,所以G1必須響應寫請求,客戶端認為寫成功。同時,由於系統是分區隔斷的,所以G1不能將v1值同步給G2。

圖解分佈式系統CAP定理

接著,客戶端向G2發送讀請求。同樣,由於系統滿足可用性,所以G2必須響應。但是由於G2無法同步G1的值,所以G2只能返回v0。

圖解分佈式系統CAP定理

因此,在客戶端向G1寫入v1後,客戶端從G2讀出的值仍然是v0,這就造成了不一致性。這與我們最初的假設是衝突的。那麼只能說明我們的假設是不成立的,也就是不存在一個系統可以同時滿足一致性、可用性和分區容錯性。

這就是CAP定理。

如果大家對這個話題感興趣,可以在評論區留言共同討論。


分享到:


相關文章: