分佈式理論之CAP定理(布魯爾定理)

系列文章 -> 分佈式理論html

  1. 分佈式理論之CAP定理(布魯爾定理)
  2. 分佈式理論之BASE理論
  3. 分佈式理論之2PC協議(2階段提交協議)

定義

在理論計算機科學中,CAP定理(CAP theorem),又被稱做布魯爾定理(Brewer's theorem),它指出對於一個分佈式計算系統來講,不可能同時知足如下三點git

選項 具體意義
一致性(Consistency) 全部節點訪問同一份最新的數據副本
可用性(Availability) 每次請求都能獲取到非錯的響應,可是不保證獲取的數據爲最新數據
分區容錯性(Partition tolerance) 分佈式系統在遇到任何網絡分區故障的時候,仍然可以對外提供知足一致性和可用性的服務,除非整個網絡環境都發生了故障

而CAP指的就是上述三個指標的首字母github

分別解釋每一個指標

一致性(Consistency)

這裏指的是強一致性,而最終一致性後續討論
在寫操做完成後開始的任何讀操做都必須返回該值,或者後續寫操做的結果
也就是說,在一致性系統中,一旦客戶端將值寫入任何一臺服務器並得到響應,那麼以後client從其餘任何服務器讀取的都是剛寫入的數據算法

用以下系統進行解釋segmentfault

clipboard.png

  1. 客戶端向G1寫入數據v1,並等待響應
  2. 此時,G1服務器的數據爲v1,而G2服務器的數據爲v0,二者不一致
  3. 接着,在返回響應給客戶端以前,G2服務器會自動同步G1服務器的數據,使得G2服務器的數據也是v1
  4. 一致性保證了無論向哪臺服務器(好比這邊向G1)寫入數據,其餘的服務器(G2)能實時同步數據
  5. G2已經同步了G1的數據,會告訴G1,我已經同步了
  6. G1接收了全部同步服務器的已同步的報告,纔將「寫入成功」信息響應給client
  7. client再發起請求,讀取G2的數據
  8. 此時獲得的響應是v1,即便client從未寫入數據到G2

可用性(Availability)

系統中非故障節點收到的每一個請求都必須有響應
在可用系統中,若是咱們的客戶端向服務器發送請求,而且服務器未崩潰,則服務器必須最終響應客戶端,不容許服務器忽略客戶的請求安全

分區容錯性(Partition tolerance)

容許網絡丟失從一個節點發送到另外一個節點的任意多條消息,即不一樣步
也就是說,G1和G2發送給對方的任何消息都是能夠放棄的,也就是說G1和G2可能由於各類意外狀況,致使沒法成功進行同步,分佈式系統要能容忍這種狀況。服務器

clipboard.png

CAP三者不可能同時知足

假設確實存在三者能同時知足的系統網絡

  • 那麼咱們要作的第一件事就是分區咱們的系統,因爲知足分區容錯性,也就是說可能由於通訊不佳等狀況,G1和G2之間是沒有同步

clipboard.png

  • 接下來,咱們的客戶端將v1寫入G1,但G1和G2之間是不一樣步的,因此以下G1是v1數據,G2是v0數據。

clipboard.png

  • 因爲要知足可用性,即必定要返回數據,因此G1必須在數據沒有同步給G2的前提下返回數據給client,以下

clipboard.png

  • 接下去,client請求的是G2服務器,因爲G2服務器的數據是v0,因此client獲得的數據是v0

clipboard.png

很明顯,G1返回的是v1數據,G2返回的是v0數據,二者不一致。
其他狀況也有相似推導,也就是說CAP三者不能同時出現。分佈式

CAP三者如何權衡

三選二利弊如何

  • CA (Consistency + Availability):關注一致性和可用性,它須要很是嚴格的全體一致的協議,好比「兩階段提交」(2PC)。CA 系統不能容忍網絡錯誤或節點錯誤,一旦出現這樣的問題,整個系統就會拒絕寫請求,由於它並不知道對面的那個結點是否掛掉了,仍是隻是網絡問題。惟一安全的作法就是把本身變成只讀的。
  • CP (consistency + partition tolerance):關注一致性和分區容忍性。它關注的是系統裏大多數人的一致性協議,好比:Paxos 算法 (Quorum 類的算法)。這樣的系統只須要保證大多數結點數據一致,而少數的結點會在沒有同步到最新版本的數據時變成不可用的狀態。這樣可以提供一部分的可用性。
  • AP (availability + partition tolerance):這樣的系統關心可用性和分區容忍性。所以,這樣的系統不能達成一致性,須要給出數據衝突,給出數據衝突就須要維護數據版本。Dynamo 就是這樣的系統。

clipboard.png

如何進行三選二

權衡三者的關鍵點取決於業務
放棄了一致性,知足分區容錯,那麼節點之間就有可能失去聯繫,爲了高可用,每一個節點只能用本地數據提供服務,而這樣會容易致使全局數據不一致性。對於互聯網應用來講(如新浪,網易),機器數量龐大,節點分散,網絡故障再正常不過了,那麼此時就是保障AP,放棄C的場景,而從實際中理解,像門戶網站這種偶爾沒有一致性是能接受的,但不能訪問問題就很是大了。post

對於銀行來講,就是必須保證強一致性,也就是說C必須存在,那麼就只用CA和CP兩種狀況,當保障強一致性和可用性(CA),那麼一旦出現通訊故障,系統將徹底不可用。另外一方面,若是保障了強一致性和分區容錯(CP),那麼就具有了部分可用性。實際究竟應該選擇什麼,是須要經過業務場景進行權衡的(並非全部狀況都是CP好於CA,只能查看信息但不能更新信息有時候還不如直接拒絕服務)

參考

CAP原則(CAP定理)、BASE理論
分佈式理論(一) - CAP定理
CAP定理
An Illustrated Proof of the CAP Theorem
分佈式系統的一致性協議之 2PC 和 3PC

相關文章
相關標籤/搜索