分散式系統CAP理論
在單機的資料庫系統之中,我們很容易實現一套滿足ACID 特性的 事務處理系統, 事務的一致性不存在問題。 但是在分散式系統之中,由於資料分佈在不同的主機結點上,如何對著些資料進行分散式的事務處理就具有非常大的挑戰,CAP 理論的出現,讓我們對於分散式事務的一致性有了另外一種看法。
什麼是CAP 理論?
在電腦科學理論,CAP 理論 (也稱Brewer 定理) 又有稱為 CAP原則,CAP定理,是由電腦科學家Eric Brewer 在 2000 年 提出的 ,其理論觀點是, 在分散式計算機系統中,不可能存在同時提供 以下全部三個保證。
- Consistency(一致性): 所有節點同一時間看到的是相同的資料。在分散式系統中的所有資料備份,在同一時刻是否同樣的值。(等同於所有節點訪問同一份最新的資料副本)
- Availability(可用性):不管是否成功,確保每一個請求都能接收到響應。在叢集中一部分節點故障後,叢集整體是否還能響應客戶端的讀寫請求。(對資料更新具備高可用性)
- Partition tolerance(分割槽容錯性):系統任意分割槽後,在網路故障時,仍能操作。以實際效果而言,分割槽相當於對通訊的時限要求。系統如果不能在時限內達成資料一致性,就意味著發生了分割槽的情況,必須就當前操作在C和A之間做出選擇。
CAP原則是NOSQL資料庫和分散式系統的基石。
為什麼說CAP 只能三選二?
舉個栗子:
下圖 顯示了在一個網路中,N1,N2 是兩個節點,他們共享資料塊V 其中一個 值V0, 執行在N1 的A 程式可以認為是安全的,無Bug,可預測的和可靠的,執行在N2 的是B 程式,在這個例子中,A 將寫入V的新值。而B從V 中讀取值。
系統預期執行下面的操作:
- 寫入一個V 的新值 V1 。
- 然後訊息(M) 從N1 更新V 的副本到N2.
- 從B 處讀取返回的V1
如果網路是分割槽的,當N1到N2 的訊息不能傳遞的時候,就會出現雖然N2 能訪問到V 的值(可用性),但是實際上與N1 的V 值已經不一致了。 如下圖:
CAP 常見模型:
既然 CAP 理論已經證明一致性,可用性和分割槽容錯性三者不可能通知達成。 那麼在實際應用中,我們可在其他某一方面來放鬆條件,從而達到妥協,下面是一些常用的模型。
- 犧牲分割槽 (CA 模型)
犧牲分割槽容錯性意味著把所有機器搬到一臺機器內部,或者放到一個“要死一起上死”的機架上面(機架也可能出現部分失效),這明顯就違背了我們希望的可伸縮性。
常見例子:
- 單站點資料庫
- 叢集資料庫
- LDAP/">LDAP
- xFS 檔案系統
實現方式:
兩階段提交, 快取驗證協議。
2. 犧牲可用性(CP 模型)
犧牲可用性意味著一旦系統出現分割槽這樣的錯誤, 系統就直接停止服務。
常見例子:
- 分散式資料庫
- 分散式鎖定
- 絕大部分協議
實現方式:
悲觀鎖, 少數分割槽不可用。
3 . 犧牲一致性(AP 模型)
常見例子:
- Coda
- Web快取
- DNS
實現方式:
到期/租賃, 解決衝突, 樂觀。
CAP 的意義:
在系統架構時,應該是根據具體的業務場景來權衡CAP, 比如 對於大多數網際網路應用來說(如入口網站),因為 機器數量龐大,部署結點分散,網路故障是常態的,所以可用性是必須的所以只有捨棄一致性來保證服務的AP 而對於銀行等需要確保一致性的場景,通常會權衡CA, 和CP 模型。
CAP 的最新發展:
Eric Brewer 在2012 年發表文章指出了CAP裡面三選二的做法存在一定的誤差性,主要體現在:
- 由於分割槽很少發生,那麼在系統中不存在分割槽的情況下,沒有什麼理由犧牲C或A 。
- C與A 之間的取捨可以在同一系統內以非常細小的粒度反覆發生,而每一次的決策可能因為具體的操作,乃至因為牽涉特定的資料或使用者而有所不同。
- 這三種性質都可以在一定程度上衡量,並不是非黑即白的有或無。可用性顯然是在0% 到100% 之間連續變化的,一致性分很多級別,連分割槽也可以細分不同的含義,如系統內的不同部分對於是否存在分割槽可以有不一樣的認知。
理解CAP 理論最簡單的方式 是想象兩個節點分處於分割槽兩側,允許至少一個節點更新狀態會導致資料不一致,即喪失了C 性質,如果為了保證資料的一致性,將分割槽一側的節點設定為不可用, 那就喪失了A 性質,除非兩個節點可以相互通訊,才能既保證A 又保證C ,但這又會喪失P 性質,一般來說 跨區域的系統,設計師無法捨棄P 性質,那麼就只能在資料一致性和可用性上做一個艱難選擇, 不確切的說,NoSQL 運動的主題其實是創造各種可用性優先,資料一致性其次的方案,而傳統資料庫堅守ACID 特性,做的是相反的事情。
BASE :
BASE 來自於網際網路的電子商務領域的實踐,它是基於CAP 理論逐步演化而來的,核心思想是即便不能達到強一致性,但可以根據應用特點採用適當的方式來達到最終一致性的效果。BASE 是對CAP 中C和A 的延伸。 其含義如下 :
- Basically Available 基本可用
- Soft state 軟狀態/柔性事務,即狀態可以有一段時間的不同步。
- Eventual consistency 最終一致性。