一.前序
數據的一致性和系統的性能是每個分布式系統都需要考慮和權衡的問題。一致性的級別如下:
1.強一致性
這種一致性級別是最符合用戶直覺的,它要求系統寫入什么,讀出來的也會是什么,用戶體驗好,但實現起來往往對系統的性能影響大
2.弱一致性
這種一致性級別約束了系統在寫入成功后,不承諾立即可以讀到寫入的值,也不久承諾多久之后數據能夠達到一致,但會盡可能地保證到某個時間級別(比如秒級別)后,數據能夠達到一致狀態
3、最終一致性
最終一致性是弱一致性的一個特例,系統會保證在一定時間內,能夠達到一個數據一致的狀態。這里之所以將最終一致性單獨提出來,是因為它是弱一致性中非常推崇的一種一致性模型,也是業界在大型分布式系統的數據一致性上比較推崇的模型
一.CAP原則(https://en.wikipedia.org/wiki/CAP_theorem)
CAP原則:指的是在一個分布式系統中, Consistency(一致性)、 Availability(可用性)、Partition tolerance(分區容錯性),三者不可得兼。
注意:此處的Consistency(一致性)為強一致性;
* 一個分布式系統無法同時滿足以上三個需求,因此在實際運用時,我們就要拋棄其中一項.
* CAP定理應用:
1. 放棄P:放棄P就意味著放棄了擴展性.就是把所有數據放在一個分布式節點上.
2. 放棄A:系統遇到故障時,在等待時間內系統無法對外提供正常服務,即不可用.
3. 放棄C:放棄強一致性,而保持數據的最終一致性.引入“時間窗口”概念.
* 對于分布式系統而言,網絡問題是必定會出現的異常情況,因為P是一個分布式系統必須面對和解決的問題.
* 所以往往要根據業務權衡C和A之間的選擇.
Consistency(一致性)和 Availability(可用性)的共存問題?
一致性與可用性為什么不能同時成立?其實答案很簡單,由于Partition tolerance(分區容錯性)的存在,節點間的通行可能會失敗。
舉個例子:
假設微服務A異地部署,東莞區域為A1,深圳區域為A2。如果要保證A1的一致性,那么在A2執行寫操作的時候,鎖定A1的讀操作和寫操作。只有在數據同步后,才重新開放讀寫權限。鎖定期間,A1不能讀寫的,對于Availability(可用性)是不成立。
如果要保證A1的可用性,那么勢必不能鎖定A1,這樣Consistency(一致性)肯定是不成立。
如下公共組件:
Zookeeper、ETCD符合CP設計;Eureka符合AP設計;
二.BASE理論(https://en.wikipedia.org/wiki/Eventual_consistency)
BASE理論由eBay的架構師Dan Pritchett提出,BASE理論是對CAP理論的延伸,核心思想是即使無法做到強一致性,應用應該可以采用合適的方式達到最終一致性。BASE是指基本可用(Basically Available)、軟狀態( Soft State)、最終一致性( Eventual Consistency)。
●基本可用(Basically Available)
分布式系統出現故障的時候,允許損失部分可用性,即保證核心可用。
●軟狀態( Soft State)
允許系統存在中間狀態,并且該中間狀態不會影響系統整體可用性。分布式存儲中一般一份數據至少會有三個副本,允許不同節點間副本同步的延時,這就是軟狀態的體現。
●最終一致性( Eventual Consistency)
分布式系統中所有的副本經過一定的時間后,最終能夠達到一致的狀態。
最終一致性分為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 種系統往往會結合使用,以構建一個具有最終一致性的分布式系統。實際上,不只是分布式系統使用最終一致性,關系型數據庫在某個功能上,也是使用最終一致性的,比如備份,數據庫的復制過程是需要時間的,這個復制過程中,業務讀取到的值就是舊的。當然,最終還是達成了數據一致性。這也算是一個最終一致性的經典案例。
?