前言
在前文 分布式理論(一) —— CAP 定理 中,我們說,CAP 不可能同時滿足,而分區容錯是對於分布式系統而言,是必須的。最后,我們說,如果系統能夠同時實現 CAP 是再好不過的了,所以出現了 BASE 理論,今天就來講講 Base 理論。
1. 什么是 Base 理論
BASE:全稱:Basically Available(基本可用),Soft state(軟狀態),和 Eventually consistent(最終一致性)三個短語的縮寫,來自 ebay 的架構師提出。
Base 理論是對 CAP 中一致性和可用性權衡的結果,其來源於對大型互聯網分布式實踐的總結,是基於 CAP 定理逐步演化而來的。其核心思想是:
既是無法做到強一致性(Strong consistency),但每個應用都可以根據自身的業務特點,采用適當的方式來使系統達到最終一致性(Eventual consistency)。
2. Basically Available(基本可用)
什么是基本可用呢?假設系統,出現了不可預知的故障,但還是能用,相比較正常的系統而言:
-
響應時間上的損失:正常情況下的搜索引擎 0.5 秒即返回給用戶結果,而基本可用的搜索引擎可以在 1 秒作用返回結果。
-
功能上的損失:在一個電商網站上,正常情況下,用戶可以順利完成每一筆訂單,但是到了大促期間,為了保護購物系統的穩定性,部分消費者可能會被引導到一個降級頁面。
3. Soft state(軟狀態)
什么是軟狀態呢?相對於原子性而言,要求多個節點的數據副本都是一致的,這是一種 “硬狀態”。
軟狀態指的是:允許系統中的數據存在中間狀態,並認為該狀態不影響系統的整體可用性,即允許系統在多個不同節點的數據副本存在數據延時。
4. Eventually consistent(最終一致性)
這個比較好理解了哈。
上面說軟狀態,然后不可能一直是軟狀態,必須有個時間期限。在期限過后,應當保證所有副本保持數據一致性。從而達到數據的最終一致性。這個時間期限取決於網絡延時,系統負載,數據復制方案設計等等因素。
稍微官方一點的說法就是:
系統能夠保證在沒有其他新的更新操作的情況下,數據最終一定能夠達到一致的狀態,因此所有客戶端對系統的數據訪問最終都能夠獲取到最新的值。
而在實際工程實踐中,最終一致性分為 5 種:
1. 因果一致性(Causal consistency)
指的是:如果節點 A 在更新完某個數據后通知了節點 B,那么節點 B 之后對該數據的訪問和修改都是基於 A 更新后的值。於此同時,和節點 A 無因果關系的節點 C 的數據訪問則沒有這樣的限制。
2. 讀己之所寫(Read your writes)
這種就很簡單了,節點 A 更新一個數據后,它自身總是能訪問到自身更新過的最新值,而不會看到舊值。其實也算一種因果一致性。
3. 會話一致性(Session consistency)
會話一致性將對系統數據的訪問過程框定在了一個會話當中:系統能保證在同一個有效的會話中實現 “讀己之所寫” 的一致性,也就是說,執行更新操作之后,客戶端能夠在同一個會話中始終讀取到該數據項的最新值。
4. 單調讀一致性(Monotonic read consistency)
單調讀一致性是指如果一個節點從系統中讀取出一個數據項的某個值后,那么系統對於該節點后續的任何數據訪問都不應該返回更舊的值。
5. 單調寫一致性(Monotonic write consistency)
指一個系統要能夠保證來自同一個節點的寫操作被順序的執行。
然而,在實際的實踐中,這 5 種系統往往會結合使用,以構建一個具有最終一致性的分布式系統。實際上,不只是分布式系統使用最終一致性,關系型數據庫在某個功能上,也是使用最終一致性的,比如備份,數據庫的復制過程是需要時間的,這個復制過程中,業務讀取到的值就是舊的。當然,最終還是達成了數據一致性。這也算是一個最終一致性的經典案例。
5. 總結
總的來說,BASE 理論面向的是大型高可用可擴展的分布式系統,和傳統事務的 ACID 是相反的,它完全不同於 ACID 的強一致性模型,而是通過犧牲強一致性來獲得可用性,並允許數據在一段時間是不一致的。