CAP理論概述
1998 年來自柏克萊加州大學的計算機科學家 埃里克.布魯爾(Eric Brewer) 提出分布式系統的三個基本指標:Consistency(一致性)
、Availability(可用性)
、Partition tolerance(分區容錯)
,簡稱:CAP。
在2000年的分布式計算原則研討大會上(PODC)埃里克.布魯爾提出的一個猜想:在設計一個分布式系統時,CAP三者無法同時滿足。在2002年,麻省理工學院(MIT)的 賽斯·吉爾伯特(Seth Gilbert) 和 南希·林奇(Nancy Lynch) 發表了布魯爾猜想的證明,使之成為分布式計算系統的標准定理(也是理解分布式系統的起點)。定理討論了在兩個互相矛盾的請求到達彼此連接不通的兩個不同的分布式節點的時候的處理方案。
CAP定理(CAP theorem), 又被稱作 布魯爾定理(Brewer’s theorem), 它指出對於一個 分布式計算系統 來說,不可能同時滿足以下三點
Consistency(一致性)
: 所有節點在同一時間具有相同的數據Availability(可用性)
:保證每個請求不管成功或者失敗都有響應(也就是只要收到用戶的請求,服務器都要在合理的時間內給出合理的響應)Partition tolerance(分區容錯)
:系統中任意信息的丟失或失敗不會影響系統的繼續運作(也就是分布式系統遇到任何網絡分區故障時,仍然可以對外提供一致性、可用性的服務)
什么是分區?
在分布式系統中,不同的節點通常分布在不同的子網絡中,由於一些客觀的因素,子網絡之間出現了網絡不通,但子網絡內部的網絡是正常的。從而導致了整個系統的環境被切分成了若干個孤立的區域,這就是分區。
大部分分布式系統都分布在不同的子網絡,分區又是高概率事件,因此分布式系統,默認是支持分區容錯的。由於Partition tolerance(分區容錯)
的存在,導致Availability(可用性)
和Consistency(一致性)
互相矛盾,因此一個分布式系統不可能同時很好的滿足一致性,可用性和分區容錯性這三個需求,最多只能同時較好的滿足兩個,即分布式系統在AP和CP之間做選擇。
因此,根據 CAP 定理將 NoSQL
數據庫分成了滿足 CA 、CP 和 AP 原則三 大類:
- CA - 單點集群,滿足一致性,可用性的系統,通常在可擴展性上不太強大。
- CP - 滿足一致性,分區容忍性的系統,通常性能不是特別高。
- AP - 滿足可用性,分區容忍性的系統,通常可能對一致性要求低一些。
CAP 理論的經典解釋,是忽略網絡延遲的,但在實際中延遲和分區緊密相關。CAP 從理論變為落地的場景發生在操作的間歇,系統需要在這段時間內做出關於分區的一個重要決定:
- 取消操作,降低了系統的可用性
- 繼續操作,可能損失系統一致性
2008年eBay的架構師Dan Pritchett源於對大規模分布式系統的實踐總結,在ACM上發表文章提出BASE理論,BASE理論是對CAP理論的延伸。核心思想是通過犧牲一定的一致性(Strong Consistency
,CAP的一致性就是強一致性),可以采用適合的方式達到最終一致性(Eventual Consitency
),來最大程度的滿足大部分分布式系統的業務需求。
Basically Available(基本可用)
:分布式系統在出現故障時,允許損失部分可用功能,保證核心功能可用
服務降級策略?
在雙十一期大促期間,為了應對海量的訪問,保證下單等核心功能的可用性,各大電商平台通常會采取降級服務策略:關閉評論等非核心功能)
Soft State(軟狀態/柔性事務)
:允許分布式系統中的數據存在中間狀態,即:分布式系統不同節點的副本數據可以存在延遲,並認為該狀態不影響分布式系統可用性Eventual Consistency(最終一致性)
:在分布式系統可接受的時間范圍內,所有節點數據都將會達到一致,而可接受的時間范圍受網絡、業務、數據及復制技術等等因素影響。實際應用中,有可以分為以下幾種- 因果一致性:因果一致性是指,如果進程A在更新完某個數據項后通知了進程B,那么進程B之后對該數據項的訪問都應該能夠獲取到進程A更新后的最新值,並且如果進程B要對該數據項進行更新操作的話,務必基於進程A更新后的最新值,即不能發生丟失更新情況。與此同時,與進程A無因果關系的進程C的數據訪問則沒有這樣的限制。
- 讀寫一致性:讀己之所寫是指,進程A更新一個數據項之后,它自己總是能夠訪問到更新過的最新值,而不會看到舊值。也就是說,對於單個數據獲取者而言,其讀取到的數據一定不會比自己上次寫入的值舊。因此,讀己之所寫也可以看作是一種特殊的因果一致性。
- 會話一致性:會話一致性將對系統數據的訪問過程框定在了一個會話當中:系統能保證在同一個有效的會話中實現“讀己之所寫”的一致性,也就是說,執行更新操作之后,客戶端能夠在同一個會話中始終讀取到該數據項的最新值。
- 單調讀一致性:單調讀一致性是指如果一個進程從系統中讀取出一個數據項的某個值后,那么系統對於該進程后續的任何數據訪問都不應該返回更舊的值。
- 單調寫一致性:單調寫一致性是指,一個系統需要能夠保證來自同一個進程的寫操作被順序地執行。
總的來說,BASE理論面向的是大型高可用可擴展的分布式系統,和傳統事務的ACID特性使相反的,它完全不同於ACID的強一致性模型,而是提出通過犧牲強一致性來獲得可用性,並允許數據在一段時間內是不一致的,但最終達到一致狀態。但同時,在實際的分布式場景中,不同業務單元和組件對數據一致性的要求是不同的,因此在具體的分布式系統架構設計過程中,ACID特性與BASE理論往往又會結合在一起使用。
BASE理論是對CAP定理的延伸,是Redis、MongoDB等眾多NoSQL數據庫管理系統的理論基礎。ACID是傳統關系型數據庫的設計理念,ACID 和 BASE代表截然不同的兩種設計哲學,強一致性-可用性的兩端。