1. 程式人生 > >分散式CAP定理與BASE理論

分散式CAP定理與BASE理論

一.CAP原則又稱CAP定理,指的是在一個分散式系統中, Consistency(一致性)、 Availability(可用性)、Partition tolerance(分割槽容錯性),三者不可得兼。它是NOSQL資料庫的理論基石。
三個特性:
一致性(C):在分散式系統中的所有資料備份,在同一時刻是否同樣的值。(等同於所有節點訪問同一份最新的資料副本)
可用性(A):在叢集中一部分節點故障後,叢集整體是否還能響應客戶端的讀寫請求。(對資料更新具備高可用性)
分割槽容忍性(P):以實際效果而言,分割槽相當於對通訊的時限要求。系統如果不能在時限內達成資料一致性,就意味著發生了分割槽的情況,必須就當前操作在C和A之間做出選擇。

在分散式系統的設計中,沒有一種設計可以同時滿足一致性,可用性,分割槽容錯性 3個特性
為什麼會是這樣
來看一個簡單的問題, 一個DB服務 搭建在兩個機房(北京,廣州),兩個DB例項同時提供寫入和讀取
在這裡插入圖片描述

  1. 假設DB的更新操作是同時寫北京和廣州的DB都成功才返回成功
    在沒有出現網路故障的時候,滿足CA原則,C 即我的任何一個寫入,更新操作成功並返回客戶端完成後,分散式的所有節點在同一時間的資料完全一致, A 即我的讀寫操作都能夠成功,但是當出現網路故障時,我不能同時保證CA,即P條件無法滿足

  2. 假設DB的更新操作是隻寫本地機房成功就返回,通過binlog/oplog回放方式同步至側邊機房
    這種操作保證了在出現網路故障時,雙邊機房都是可以提供服務的,且讀寫操作都能成功,意味著他滿足了AP ,但是它不滿足C,因為更新操作返回成功後,雙邊機房的DB看到的資料會存在短暫不一致,且在網路故障時,不一致的時間差會很大(僅能保證最終一致性)

  3. 假設DB的更新操作是同時寫北京和廣州的DB都成功才返回成功且網路故障時提供降級服務
    降級服務,如停止寫入,只提供讀取功能,這樣能保證資料是一致的,且網路故障時能提供服務,滿足CP原則,但是他無法滿足可用性原則
    如此:
    CA without P:如果不要求P(不允許分割槽),則C(強一致性)和A(可用性)是可以保證的。但放棄P的同時也就意味著放棄了系統的擴充套件性,也就是分散式節點受限,沒辦法部署子節點,這是違背分散式系統設計的初衷的。

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

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

選擇權衡
通過上面的例子,我們得知,我們永遠無法同時得到CAP這3個特性,那麼我們怎麼來權衡選擇呢?
選擇的關鍵點取決於業務場景

對於大多數網際網路應用來說(如網易門戶),因為機器數量龐大,部署節點分散,網路故障是常態,可用性是必須需要保證的,所以只有設定一致性來保證服務的AP,通常常見的高可用服務吹噓5個9 6個9服務SLA穩定性就本都是放棄C選擇AP

對於需要確保強一致性的場景,如銀行,通常會權衡CA和CP模型,CA模型網路故障時完全不可用,CP模型具備部分可用性,實際的選擇需要通過業務場景來權衡(並不是所有情況CP都好於CA,只能檢視資訊不能更新資訊有時候從產品層面還不如直接拒絕服務)

基於我們的權衡引出BASE理論也就好理解了。

BASE理論

BASE是Basically Available(基本可用)、Soft state(軟狀態)和Eventually consistent(最終一致性)三個短語的簡寫,BASE是對CAP中一致性和可用性權衡的結果,其來源於對大規模網際網路系統分散式實踐的結論,是基於CAP定理逐步演化而來的,其核心思想是即使無法做到強一致性(Strong consistency),但每個應用都可以根據自身的業務特點,採用適當的方式來使系統達到最終一致性(Eventual consistency)。接下來我們著重對BASE中的三要素進行詳細講解。

很多大型網際網路應用的場景:主機眾多、部署分散,叢集規模越來越大,節點越來越多,節點故障、網路故障是常態,因此分割槽容錯性也就成為了一個分散式系統必然要面對的問題。那麼就只能在C和A之間進行取捨。但對於傳統的專案就可能有所不同,拿銀行的轉賬系統來說,涉及到金錢的對於資料一致性不能做出一絲的讓步,C必須保證,出現網路故障的話,寧可停止服務,可以在A和P之間做取捨。

參考:https://blog.csdn.net/yeyazhishang/article/details/80758354