前言
BASE理論是由eBay架構師提出的。BASE是對CAP中一致性和可用性權衡的結果,其來源於對大規模網際網路分散式系統實踐的總結,是基於CAP定律逐步演化而來。其核心思想是即使無法做到強一致性,但每個應用都可以根據自身業務特點,才用適當的方式來使系統打到最終一致性。
正文
1. CAP的3選2偽命題
實際上,不是為了P(分割槽容錯性),必須在C(一致性)和A(可用性)之間任選其一。分割槽的情況很少出現,CAP在大多時間能夠同時滿足C和A。
對於分割槽存在或者探知其影響的情況下,需要提供一種預備策略做出處理:
- 探知分割槽的發生;
- 進入顯示的分割槽模式,限制某些操作;
- 啟動恢復過程,恢復資料一致性,補償分割槽發生期間的錯誤。
2. BASE理論簡介
BASE理論是Basically Available(基本可用),Soft State(軟狀態)和Eventually Consistent(最終一致性)三個短語的縮寫。
其核心思想是:
既是無法做到強一致性(Strong consistency),但每個應用都可以根據自身的業務特點,採用適當的方式來使系統達到最終一致性(Eventual consistency)。
3. BASE理論的內容
- 基本可用(Basically Available)
- 軟狀態(Soft State)
- 最終一致性(Eventually Consistent)
下面展開討論:
3.1. 基本可用
什麼是基本可用呢?假設系統,出現了不可預知的故障,但還是能用,相比較正常的系統而言:
-
響應時間上的損失:正常情況下的搜尋引擎0.5秒即返回給使用者結果,而基本可用的搜尋引擎可以在2秒作用返回結果。
-
功能上的損失:在一個電商網站上,正常情況下,使用者可以順利完成每一筆訂單。但是到了大促期間,為了保護購物系統的穩定性,部分消費者可能會被引導到一個降級頁面。
3.2. 軟狀態
什麼是軟狀態呢?相對於原子性而言,要求多個節點的資料副本都是一致的,這是一種“硬狀態”。
軟狀態指的是:允許系統中的資料存在中間狀態,並認為該狀態不影響系統的整體可用性,即允許系統在多個不同節點的資料副本存在資料延時。
3.3. 最終一致性
上面說軟狀態,然後不可能一直是軟狀態,必須有個時間期限。在期限過後,應當保證所有副本保持資料一致性,從而達到資料的最終一致性。這個時間期限取決於網路延時、系統負載、資料複製方案設計等等因素。
而在實際工程實踐中,最終一致性分為5種:
3.3.1. 因果一致性(Causal consistency)
因果一致性指的是:如果節點A在更新完某個資料後通知了節點B,那麼節點B之後對該資料的訪問和修改都是基於A更新後的值。於此同時,和節點A無因果關係的節點C的資料訪問則沒有這樣的限制。
3.3.2. 讀己之所寫(Read your writes)
讀己之所寫指的是:節點A更新一個資料後,它自身總是能訪問到自身更新過的最新值,而不會看到舊值。其實也算一種因果一致性。
3.3.3. 會話一致性(Session consistency)
會話一致性將對系統資料的訪問過程框定在了一個會話當中:系統能保證在同一個有效的會話中實現 “讀己之所寫” 的一致性,也就是說,執行更新操作之後,客戶端能夠在同一個會話中始終讀取到該資料項的最新值。
3.3.4. 單調讀一致性(Monotonic read consistency)
單調讀一致性指的是:如果一個節點從系統中讀取出一個資料項的某個值後,那麼系統對於該節點後續的任何資料訪問都不應該返回更舊的值。
3.3.5. 單調寫一致性(Monotonic write consistency)
單調寫一致性指的是:一個系統要能夠保證來自同一個節點的寫操作被順序的執行。
在實際的實踐中,這5種系統往往會結合使用,以構建一個具有最終一致性的分散式系統。
實際上,不只是分散式系統使用最終一致性,關係型資料庫在某個功能上,也是使用最終一致性的。比如備份,資料庫的複製過程是需要時間的,這個複製過程中,業務讀取到的值就是舊的。當然,最終還是達成了資料一致性。這也算是一個最終一致性的經典案例。
小結
總體來說BASE理論面向的是大型高可用、可擴充套件的分散式系統。與傳統ACID特性相反,不同於ACID的強一致性模型,BASE提出通過犧牲強一致性來獲得可用性,並允許資料段時間內的不一致,但是最終達到一致狀態。同時,在實際分散式場景中,不同業務對資料的一致性要求不一樣。因此在設計中,ACID和BASE理論往往又會結合使用。
相關連結
- 分散式理論(一) - CAP定理
- 分散式理論(二) - BASE理論
- 分散式理論(三) - 2PC協議
- 分散式理論(四) - 3PC協議
- 分散式理論(五) - 一致性演算法Paxos
- 分散式理論(六) - 一致性協議Raft
歡迎掃碼關注公眾號: 零壹技術棧
本帳號將持續分享後端技術乾貨,包括虛擬機器基礎,多執行緒程式設計,高效能框架,非同步、快取和訊息中介軟體,分散式和微服務,架構學習和進階等學習資料和文章。