分布式系統原理之cap理論
1.1 CAP理論的含義
Cap理論表示在分布式系統中一致性(C)、可用性(A)和分區容錯性(P)最多只能同時滿足兩個。
一致性:客戶端更新數據成功後,在任意時刻,在系統任意對外提供服務的節點,讀取到的數據都是最新寫入的數據。(強一致性)。
可用性:當系統出現異常時,仍能對外提供服務。
分區容錯:當出現網絡分區時,系統的容錯能力(機器之間出現網絡故障,不能正常通信)。
證明cap理論:有兩臺機器M1和M2,為保持一致性,兩臺機器的數據相同,現在客戶端對M1的數據進行更新,但M1和M2之間出現網絡故障(分區),M的最新數據無法同步到M2,導致M1的數據變為v1,M2仍為v0。現有一客戶端向M2發送數據讀取請求,對此請求的處理有兩種選擇:
- 返回舊數據v0,滿足可用性,但是卻違反了一致性。
- 阻塞此次讀操作,直至網絡故障恢復,M1的數據v1同步到M2中,滿足一致性,但違反了可用性。
由於分布式系統天生具有分區的特性,所以一定要滿足P,只能在CA中選其一。
Cap理論說明了想設計完全滿足強一致性、可用性和分區容錯性的分布式系統是不切實際的,只能在三者之間權衡,為分布式系統的設計提供理論指導。
1.2 一致性的分類
一致性可從客戶端和服務端兩個角度來看,客戶端一致性定義客戶端怎樣和何時看到數據更新,服務端一致性定義更新時數據如何流經系統及系統對更新有何保證。
客戶端一致性分為以下幾種:
1. 強一致性:數據更新之後,任何客戶端在後續的訪問中都能訪問到最新版本的數據。
2. 弱一致性:數據更新之後,不能保證客戶端的訪問能訪問到最新更新之後的數據,數據更新到所有客戶端可見這段時間稱為不一致窗口。
3. 最終一致性:最終一致性是種特殊的弱一致性,假如更新數據之後沒有後續的對此數據對象的更新操作,系統保證一段時間之後任何客戶端對此數據對象的訪問都能返回最後一次更新的數據。
最終一致性有如下變種:
1. 因果一致性: 如果進程A向進程B傳達它已更新數據項,則進程B的後續訪問將返回更新的值,並且保證寫入將取代先前的寫入。進程C的訪問與進程A沒有因果關系,遵循正常的最終一致性規則。
2. 讀已之所寫一致性: 進程A在更新數據項之後始終訪問更新的值,並且永遠不會看到較舊的值。這是因果一致性模型的特例
3. 會話一致性:是讀已之所寫的實際應用版本,進程對系統的訪問存在與一個會話上下文中,在此會話中的訪問遵循讀已之所寫一致性。
4. 單調讀一致性:進程訪問某一數據對象的值之後,此進程後續的訪問都不會返回更舊版本的值。
5. 單調寫一致性:系統保證相同進程的一系列寫操作是序列化有序的。
同一個系統中,可以同時滿足多種一致性,例如讀已之所寫和單調讀一致性是常用的組合方案,這兩種一致性使系統更易使用。
服務端一致性:
N=存儲數據副本的結點數量
W=在更新完成之前,需要確認更新成功的副本數量。
R=當讀操作訪問數據對象,需要訪問的副本數量
如果W+R>N,寫副本和讀副本會出現重疊,能保證一定能讀到更新後的數據對象,從而保證強一致性。例如:在實現了primary-backup關系數據庫管理系統中,同步副本技術N=2,W=2,R=1,能保證強一致性;異步副本方式N=2,W=1,R=1, R+W=N,一致性不能得到保證。
如果W+R<=N, 那麽不能保證強一致性,只能是弱一致性或最終一致性。如在主備RDBMS中,使用異步同步副本,並開啟從副本讀功能的方式,那麽N=2, W=1和R=1。在這種情況下,R+W=N, 一致性不能得到保證。
1.3 CAP理論的變種(BASE理論)
BASE理論由CAP理論演化而來,是工業界對分布式系統實踐的總結,其核心思想是即使無法達到強一致性,也要保證滿足最終一致性。
BASE是Basically Available(基本可用)、Soft state(軟狀態)和Eventually consistent(最終一致性)三個短語的簡寫。
基本可用:當系統發生不可預知故障時,允許損失部分可用性,例如:部分機房故障,允許查詢時間變長(時間上的損失),系統高峰期為保證系統的穩定性,將部分用戶請求引導到降級頁面(功能上的損失)。
軟狀態:允許系統中的數據存在中間狀態,該中間狀態不會影響系統的整體可用性,即允許多個副本間的同步存在延時。
最終一致性:系統中數據的副本經過一段時間的同步之後,最終能達到一致性狀態,不要求強一致性。
參考文獻
[1] 分布式系統的CAP理論.https://www.hollischuang.com/archives/666
[2] Vogels W. Eventually consistent[J]. Communications of the ACM, 2009, 52(1): 40-44.
[3] 分布式系統原理九:CAP理論和BASE理論.http://feixiao.github.io/2017/03/14/fbsxt9/
分布式系統原理之cap理論