分散式理論(一) - CAP定理

零壹技術棧發表於2018-06-17

前言

CAP原則又稱CAP定理,指的是在一個分散式系統中,Consistency(一致性)、 Availability(可用性)、Partition tolerance(分割槽容錯性)這三個基本需求,最多隻能同時滿足其中的2個。

分散式理論(一) - CAP定理

正文

1. CAP原則簡介

選項 描述
Consistency(一致性) 指資料在多個副本之間能夠保持一致的特性(嚴格的一致性)
Availability(可用性) 指系統提供的服務必須一直處於可用的狀態,每次請求都能獲取到非錯的響應(不保證獲取的資料為最新資料)
Partition tolerance(分割槽容錯性) 分散式系統在遇到任何網路分割槽故障的時候,仍然能夠對外提供滿足一致性和可用性的服務,除非整個網路環境都發生了故障

什麼是分割槽?

在分散式系統中,不同的節點分佈在不同的子網路中,由於一些特殊的原因,這些子節點之間出現了網路不通的狀態,但他們的內部子網路是正常的。從而導致了整個系統的環境被切分成了若干個孤立的區域,這就是分割槽。

2. CAP原則論證

如圖所示,是我們證明CAP的基本場景,網路中有兩個節點N1和N2,可以簡單的理解N1和N2分別是兩臺計算機,他們之間網路可以連通,N1中有一個應用程式A,和一個資料庫V,N2也有一個應用程式B和一個資料庫V。現在,A和B是分散式系統的兩個部分,V是分散式系統的資料儲存的兩個子資料庫。

分散式理論(一) - CAP定理

  • 在滿足一致性的時候,N1和N2中的資料是一樣的,V0=V0。
  • 在滿足可用性的時候,使用者不管是請求N1或者N2,都會得到立即響應。
  • 在滿足分割槽容錯性的情況下,N1和N2有任何一方當機,或者網路不通的時候,都不會影響N1和N2彼此之間的正常運作。

如圖所示,這是分散式系統正常運轉的流程,使用者向N1機器請求資料更新,程式A更新資料庫V0為V1。分散式系統將資料進行同步操作M,將V1同步的N2中V0,使得N2中的資料V0也更新為V1,N2中的資料再響應N2的請求。

分散式理論(一) - CAP定理

根據CAP原則定義,系統的一致性、可用性和分割槽容錯性細分如下:

  • 一致性:N1和N2的資料庫V之間的資料是否完全一樣。
  • 可用性:N1和N2的對外部的請求能否做出正常的響應。
  • 分割槽容錯性:N1和N2之間的網路是否互通。

這是正常運作的場景,也是理想的場景。作為一個分散式系統,它和單機系統的最大區別,就在於網路。現在假設一種極端情況,N1和N2之間的網路斷開了,我們要支援這種網路異常。相當於要滿足分割槽容錯性,能不能同時滿足一致性和可用性呢?還是說要對他們進行取捨?

分散式理論(一) - CAP定理

假設在N1和N2之間網路斷開的時候,有使用者向N1傳送資料更新請求,那N1中的資料V0將被更新為V1。由於網路是斷開的,所以分散式系統同步操作M,所以N2中的資料依舊是V0。這個時候,有使用者向N2傳送資料讀取請求,由於資料還沒有進行同步,應用程式沒辦法立即給使用者返回最新的資料V1,怎麼辦呢?

這裡有兩種選擇:

  • 第一:犧牲資料一致性,保證可用性。響應舊的資料V0給使用者。
  • 第二:犧牲可用性,保證資料一致性。阻塞等待,直到網路連線恢復,資料更新操作M完成之後,再給使用者響應最新的資料V1。

這個過程,證明了要滿足分割槽容錯性的分散式系統,只能在一致性和可用性兩者中,選擇其中一個。

3. CAP原則權衡

通過CAP理論,我們知道無法同時滿足一致性、可用性和分割槽容錯性這三個特性,那要捨棄哪個呢?

3.1. CA without P

如果不要求P(不允許分割槽),則C(強一致性)和A(可用性)是可以保證的。但其實分割槽不是你想不想的問題,而是始終會存在,因此CA的系統更多的是允許分割槽後各子系統依然保持CA。

3.2. CP without A

如果不要求A(可用),相當於每個請求都需要在Server之間強一致,而P(分割槽)會導致同步時間無限延長,如此CP也是可以保證的。很多傳統的資料庫分散式事務都屬於這種模式。

3.3. AP wihtout C

要高可用並允許分割槽,則需放棄一致性。一旦分割槽發生,節點之間可能會失去聯絡,為了高可用,每個節點只能用本地資料提供服務,而這樣會導致全域性資料的不一致性。現在眾多的NoSQL都屬於此類。

小結

對於多數大型網際網路應用的場景,主機眾多、部署分散。而且現在的叢集規模越來越大,所以節點故障、網路故障是常態。這種應用一般要保證服務可用性達到N個9,即保證P和A,只有捨棄C(退而求其次保證最終一致性)。雖然某些地方會影響客戶體驗,但沒達到造成使用者流程的嚴重程度。

對於涉及到錢財這樣不能有一絲讓步的場景,C必須保證。網路發生故障寧可停止服務,這是保證CA,捨棄P。貌似這幾年國內銀行業發生了不下10起事故,但影響面不大,報到也不多,廣大群眾知道的少。還有一種是保證CP,捨棄A,例如網路故障時只讀不寫。

孰優孰劣,沒有定論,只能根據場景定奪,適合的才是最好的。

相關連結

  1. 分散式理論(一) - CAP定理
  2. 分散式理論(二) - BASE理論
  3. 分散式理論(三) - 2PC協議
  4. 分散式理論(四) - 3PC協議
  5. 分散式理論(五) - 一致性演算法Paxos
  6. 分散式理論(六) - 一致性協議Raft

歡迎掃碼關注公眾號: 零壹技術棧

image

本帳號將持續分享後端技術乾貨,包括虛擬機器基礎,多執行緒程式設計,高效能框架,非同步、快取和訊息中介軟體,分散式和微服務,架構學習和進階等學習資料和文章。

相關文章