天天看點

分布式架構之CAP理論前言: CAP 定理的說明性證明什麼是CAP定理?分布式系統

前言:

        随着網際網路行業的發展,傳統的單機模式已經不能滿足龐大的業務需求,其中随着業務量越來越多代碼也變得越來越備援耦合。這使得分布式系統(distributed system)正變得越來越重要,大型網站幾乎都是分布式的。

        分布式系統的最大難點,就是各個節點的狀态如何同步。CAP 定理是這方面的基本定理,也是了解分布式系統的起點。

        本文介紹該定理。它其實很好懂,而且是顯而易見的。下面的内容主要參考了 Michael Whittaker 的文章。

 CAP 定理的說明性證明

        該CAP定理是在分布式系統中的一個基本定理,指出任何分布式系統最多可以有兩個以下三個屬性。

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

什麼是CAP定理?

        CAP 定理指出,分布式系統最多滿足其中的兩個特性,要麼滿足CA,要麼CP,要麼AP。無法同時滿足CAP。不能同時具有一緻性、可用性和分區容忍性。聽起來很簡單,但保持一緻是什麼意思?可用的?分區容忍?哎呀,你說的分布式系統到底是什麼意思?

        在本節中,我們将介紹一個簡單的分布式系統,并解釋該系統可用、一緻和分區容忍意味着什麼。有關系統和三個屬性的正式描述,請參閱 Gilbert 和 Lynch 的論文。

分布式系統

        讓我們考慮一個非常簡單的分布式系統。我們的系統由兩台伺服器組成,G1 和 G2. 這兩個伺服器都在跟蹤相同的變量 v,其初始值為 v0。G1 和 G2 可以互相通信,也可以與外部用戶端通信。這是我們的系統的樣子。

分布式架構之CAP理論前言: CAP 定理的說明性證明什麼是CAP定理?分布式系統

用戶端可以請求從任何伺服器寫入和讀取。當伺服器收到請求時,它會執行它想要的任何計算,然後響應用戶端。例如,這是寫入的樣子。

分布式架構之CAP理論前言: CAP 定理的說明性證明什麼是CAP定理?分布式系統

 這是閱讀的樣子。

分布式架構之CAP理論前言: CAP 定理的說明性證明什麼是CAP定理?分布式系統

現在我們已經建立了我們的系統,讓我們來看看系統的一緻性、可用和分區容錯意味着什麼。

一緻性

以下是吉爾伯特和林奇如何描述一緻性:

any read operation that begins after a write operation completes must return that value, or the result of a later write operation

在寫操作完成後開始的任何讀操作都必須傳回該值,或寫操作完成後的結果

在一緻的系統中,一旦用戶端向任何伺服器寫入一個值并獲得響應,它就希望從它讀取的任何伺服器擷取該值(或更新的值)。 

1. 下面是一個不一緻系統的例子。

分布式架構之CAP理論前言: CAP 定理的說明性證明什麼是CAP定理?分布式系統

如圖:假設分布式系統有G1,G2兩個節點,初始值都是v0。現在有一個client向系統中的G1節點服務寫入了值v1。寫完之後client再去讀取這個值,這時讀到了G2節點。可能由于網絡延遲或一些其他問題,導緻G2節點與G1節點失去連接配接,這時G1節點上的資料還未同步到G2節點,是以用戶端讀取到的是修改之前的值v0。 這就出現了不滿足一緻性的情況了。

相當于滿足了可用性,失去了一緻性。

2.另一方面,這是一個一緻系統的例子。

分布式架構之CAP理論前言: CAP 定理的說明性證明什麼是CAP定理?分布式系統

在這個系統中,用戶端client向系統中的G1節點服務寫入了值v1,在向用戶端發送确認之前, G1 将其值複制到 G2。是以,當用戶端從G2,它擷取最新的值 v: v1。

缺點:如果系統保證了強的一緻性,那麼在client 寫完G1節點後, 而G1向G2節點同步資料出現了問題,這時如果client再去讀取G2節點的資料時,client就會一直處于等待狀态,因為系統内各節點資料未同步完成,需要等同步完成才能使用。

這就相當于滿足了一緻性,而失去了可用性。

可用性

以下是吉爾伯特和林奇如何描述可用性。

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節點與G2節點将沒有通信。那麼我們的系統将如下所示。 

分布式架構之CAP理論前言: CAP 定理的說明性證明什麼是CAP定理?分布式系統

我們的系統必須能夠在任意網絡分區的情況下正常運作才能進行分區容忍。

證據

現在我們已經熟悉了一緻性、可用性和分區容錯性的概念,我們可以證明一個系統不能同時擁有這三者。

假設存在一個沖突的系統,它是一緻的、可用的和分區容忍的。我們要做的第一件事是對系統進行分區。它看起來像這樣。

分布式架構之CAP理論前言: CAP 定理的說明性證明什麼是CAP定理?分布式系統

 接下來,我們的用戶端要求對G1寫入v1。由于我們的系統滿足可用性,G1必須回應。然而,由于網絡是分區的,G1 無法将其資料複制到 G2。吉爾伯特和林奇将這個階段稱為執行階段α1。

分布式架構之CAP理論前言: CAP 定理的說明性證明什麼是CAP定理?分布式系統

 接下來,我們讓我們的用戶端對G2節點做同樣的操作,由于我們的系統滿足可用性,G2必須回應。由于網絡是分區的,G1無法更新G2寫入後的值v1。 它隻能傳回v0。吉爾伯特和林奇将這個階段稱為執行階段α2。

分布式架構之CAP理論前言: CAP 定理的說明性證明什麼是CAP定理?分布式系統

G2 傳回 v0,但是 在用戶端已經将值v1寫入G1節點。這就不滿足不一緻性。

結論:

我們說,CAP 不可能同時滿足,而分區容錯是對于分布式系統而言,是必須的。最後,我們說,如果系統能夠同時實作 CAP 是再好不過的了,是以出現了 BASE 理論。

繼續閱讀