1. CAP定理
CAP理論告訴我們,一個分佈式系統不可能同時滿足一致性(C:Consistency),可用性(A:Availability)和分區容錯性(P:Partition tolerance)這三個需求,最多隻能同時滿足其中的兩項。
1.1 一致性
- 在分佈式環境中,一致性是指數據在多個副本之間是否能夠保持一致的特性。在一致性的需求下,當一個系統在數據一致的狀況下執行更新操作後,應該保持系統的數據仍然處於一致性的狀態。
- 在分佈式系統中,如果能夠做到針對一個數據項的更新操作執行成功後,所有的用戶都可以讀取到其最新的值,那麼這樣的系統就被認爲具有強一致性(或嚴格的一致性).
1.2 可用性
- 可用性是指系統提供的服務必須一直處於可用的狀態,對於用戶的每一個操作請求總是能夠在有限的時間內返回結果。
- 有效的時間是指,對於一個用戶的操作請求,系統必須能夠在指定的時間(即響應時間)內返回對應的處理結果,如果超過了這個時間範圍,那麼系統就認爲是不可用的。
- 返回結果是可用性的另一個非常重要的指標,它要求系統在完成對用戶請求的處理後,返回一個正常的響應結果。
1.3 分區容錯性
- 分區容錯性約束了一個分佈式系統需要具有以下特性:分佈式系統在遇到任何網絡分區故障的時候,仍然需要能夠保證對外提供滿足一致性和可用性的服務,除非是整個網絡環境都出現了故障。
1.4 CAP定理應用
放棄CAP定理 | 說明 |
---|---|
放棄P | 一種較簡單的做法是將所有的數據都放在一個分佈式節點上。 放棄P的同事也就意味着放棄了系統的可擴展性 |
放棄A | 一旦系統遇到網絡分區或其他故障時,那麼收到影響的服務 需要等待一定的時間,因此在等待期間系統無法提供正常的 服務,即不可用 |
放棄C | 放棄一致性指的是放棄數據的強一致性,而保留數據的最終 一致性。這樣的系統無法保證數據保持實時的一致性,但是 能夠承諾的是,數據最終會達到一個一致的狀態。這就引入 了一個時間窗口的概念,具體多長時間能夠達到數據一致取 決於系統的設計,主要包括數據副本在不同節點之間的複製 時間長短 |
在實際中,對於分佈式系統而言,網絡問題是一個必定會出先的異常情況,因此分區容錯性也就成爲了一個分佈式系統必須需要面對和解決的問題。因此係統架構設計師往往需要把精力花在如何根據業務特點在C(一致性)和A(可用性)之間尋求平衡。
2. BASE理論
BASE是Basically Available(基本可用)、Soft state(軟狀態)和Eventually consistent(最終一致性)三個詞的縮寫。BASE是對CAP中一致性和可用性權衡的結果,其來源於對大規模互聯網系統分佈式實踐的總結,是基於CAP定理逐步演化而來的,其核心思想是即使無法做到強一致性(Strong consistency),但每個應用都可以根據自身的業務特點,採用適當的方式來使系統達到最終一致性。
2.1 基本可用
基本可用是指分佈式系統在出現不可預測故障的時候,允許損失部分可用性——但請注意,這絕不等價於系統不可用。
- 響應時間上的損失
- 功能上的損失
2.2 弱狀態
弱狀態也成爲軟狀態,和硬狀態相對,是指允許系統中的數據存在中間狀態,並認爲該中間狀態的存在不會影響系統的整體可用性,即允許系統在不同節點的數據副本之間進行數據同步的過程存在延遲。
2.3 最終一致性
最終一致性強調的是系統中所有的數據副本,在經過一段時間的同步後,最終能夠達到一個一致的狀態。因此,最終一致性的本質是需要系統保證最終數據能夠達到一致,而不需要實時保證系統數據的強一致性。在沒有發現故障的前提下,數據達到一致狀態的時間延遲,取決於網絡延遲、系統負載和數據複製方案設計等因素。
在實際工程實踐中,最終一致性存在以下五類主要變種:
- 因果一致性(Causal consistency)
如果進程A在更新完某個數據項後通知了進程B,那麼進程B之後對該數據項的訪問就應該能夠獲取到進程A更新後的最新值,並且如果進程B要對該數據項進行更新操作的話,務必基於進程A更新後的最新值,即不能發生丟失更新情況。與此同時,與進程A無因果關係的進程C的數據訪問則沒有這樣的限制。 - 讀己之所寫(Read your writes)
進程A更新一個數據項之後,它自己總是能夠訪問到更新過的最新值,而不會看到舊值。也就是說,對於單個數據獲取者來說,其讀取到的數據,一定不會自己上次寫入的值舊。因此,讀己之所寫也可以看做是一種特殊的因果一致性。 - 會話一致性(Session consistency)
會話一致性將對系統數據的訪問過程框定在一個會話當中:系統能夠保證在同一個有效的會話中實現”讀己之所寫”的一致性,也就是說,執行更新操作之後,客戶端能夠在同一個會話中始終讀取到該數據項的最新值。 - 單調讀一致性(Monotonic read consistency)
單調讀一致性是指如果一個進程從系統中讀取一個數據項的某個值後,那麼系統對於該進程後續的任何數據訪問都不應該返回更舊的值。 - 單調寫一致性(Monotonic write consistency)
單調寫一致性是指,一個系統要能夠保證來自同一個進程的寫操作被順序地執行。
2.4 最終一致性的應用
在現代關係型數據庫中,大多都會採用同步和異步方式來實現主備數據複製技術。在同步的方式中,數據的複製過程通常是更新事務的一部分,因此在事務完成後,主備數據庫的數據庫就會達到一致。而在異步方式中,備庫的更新往往會存在延時,這取決於事務日誌在主備數據庫中的傳輸時間長短。當然,無論是採用多次重試還是人爲數據訂正,關係型數據庫還是能夠保證最終數據達到一致。
2.5 BASE和ACID
BASE理論面向的是大型高可用可擴展的分佈式系統,和傳統事務的ACID特性是相反的,它往往不同於ACID的強一致性模型,而是提出通過犧牲強一致性來獲得可用性,並允許數據在一段時間內是不一致的,但最終達到一致狀態。但同時,在實際的分佈式場景中,不同業務單元和組件對數據一致性的要求是不同的,因此在具體的分佈式架構設計過程中,ACID特性和BASE理論往往又會結合在一起使用。