[翻譯]CAP理論及其證明

CAP是所有分佈式系統的基礎理論,任何分佈式系統只能滿足以下三種狀態中的任意兩種。

  • 一致性(Consistency)
  • 可用性(Availability)
  • 分區容錯性(Partition tolerance)

何爲CAP理論?

CAP理論是指一個分佈式系統不能同時滿足一致性、可用性和分區容錯性。聽起來簡單,但一致性、可用性和分區容錯性分別是指啥?甚至分佈式系統是啥?

在這篇文章中,我們會引入一個簡單的分佈式系統來解釋清楚何爲可用性、一致性、和分區容錯性。更多信息可以參考Gilbert和Lynch的論文Perspectives on the CAP Theorem

分佈式系統

假設我們有這樣一個簡單的分佈式系統,它包含兩個服務G1和G2,這倆服務都保存着同一變量v,其初始值是v0。 G1和G2之間可以互相溝通,同時他們也可以和其他的客戶端溝通,如下圖所示:
在這裏插入圖片描述

客戶端可以讀取和修改任意一個服務端的值。當服務端收到請求,他會做相應處理後回覆客戶端。如果是寫請求執行過程如下圖所示:
在這裏插入圖片描述

如果是讀請求,執行過程如下圖:
在這裏插入圖片描述

現在我們已經建立了一個簡單的分佈式系統,接下來我們分別看下一致性、可用性和分區容錯性。

一致性

Gilbert和Lynch的論文中是這樣描述一致性的:

any read operation that begins after a write operation completes must return that value, or the result of a later write operation
在某個寫操作完成之後的任何讀操作都必須返回該寫操作寫入的值,或者再之後的寫操作寫入的值。

在一個一致性的系統中,如果一個客戶端寫入了某個值到任意一個服務端上,並且得到了服務端的確認,那麼客戶端再去讀的時候,不管是讀的哪個服務,都期望拿到寫入後的值或者是更新的值。

下圖所示是有個不保證一致性的系統:
在這裏插入圖片描述

客戶端向G1發送了寫請求將v的值從v0變更到v1,然後也得到了G1的寫入成功確認,但從G2讀到的數據還是舊的數據v0。

下圖是一個保證一致性的系統:
在這裏插入圖片描述

在這個系統中,當客戶端向G1寫入數據v1後,G1也會把數據同步到G2,當G1 G2都完成數據更新後,G1纔會告訴客戶端寫入成功。 之後不過是客戶端從G1讀還是從G2讀,讀到的都是最新的值v1。

可用性

Gilbert和Lynch的論文對可用性的描述如下:

every request received by a non-failing node in the system must result in a response
任何一個在線的節點收到的請求必須都做出相應。

在保證可用性的系統中,如果客戶端向某個沒有宕機的服務端發送了請求,服務端必須響應客戶端的請求,不能選擇忽略掉客戶端的請求。

分區容錯性

Gilbert和Lynch的論文對分區容錯性的描述如下:

the network will be allowed to lose arbitrarily many messages sent from one node to another
允許網絡丟失從一個服務節點到另外一個服務節點的任意信息

這就意味着在我們的分佈式系統中,G1發送給G2的信息可能會丟失,如果所有的信息都丟失了,我們的系統可能就會變成這樣。
在這裏插入圖片描述

爲了保證分區容錯性,我們的系統必須在任意個不通的網絡分區下正常工作。

證明

現在我們已經瞭解了什麼是一致性、可用性和分區容錯性,接下來我們證明下爲什麼一個分佈式系統不能同時滿足這三者。

假設存在一個同時滿足一致性、可用性和分區容錯性的分佈式系統。首先我們把這個系統分成兩個部分,如下圖:
在這裏插入圖片描述
接下來客戶端將G1中的v從v0改成v1,因爲要滿足可用性的要求,G1必須響應客戶端的寫入請求,但是因爲網絡的問題,G1沒法將數據同步到G2。Gilbert和Lynch將這個階段稱爲alpha1階段,如下圖:
在這裏插入圖片描述

再然後,假設有個客戶端從G2讀了v的值,因爲滿足可用性要求,G2也必須正常響應,因爲網絡的問題,G2沒有更新到G1的數據,所以G2只能返回v0,Gilbert和Lynch將這個階段稱爲alpha2階段,如下圖:
在這裏插入圖片描述

在這裏G1返回v1,G2只能返回v1,產生了不一致,和我們的假設相悖,所以證明同時滿足一致性、可用性和分區容錯性的分佈式系統不存在。

原文鏈接

https://mwhittaker.github.io/blog/an_illustrated_proof_of_the_cap_theorem/

本文來自https://blog.csdn.net/xindoo

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章