CAP原理、一致性模型、BASE理論和ACID特性


CAP原理

在理論計算機科學中,CAP定理(CAP theorem),又被稱作布魯爾定理(Brewer's theorem),它指出對於一個分布式計算系統來說,不可能同時滿足以下三點:

  • 一致性(Consistence)
    分布式系統中的所有數據備份,在同一時刻是否同樣的值。(等同於所有節點訪問同一份最新的數據副本)

  • 可用性(Availability)
    集群出現故障節點后,是否還能響應客戶端的讀寫請求。(對數據更新具備高可用性)

  • 分區容忍性(Partition tolerance)
    實際中通信產生延時。系統如果不能在時限內達成數據一致性,就意味着發生了分區的情況,必須就當前操作在C點和A點之間做出選擇。

CAP原理指的是,CAP的三個要素最多只能同時實現兩點,不可能三者兼顧。因此在進行分布式架構設計時,必須做出取舍。而對於分布式數據系統,分區容忍性是基本要求,否則就失去了價值。

因此設計分布式數據系統,就是在一致性和可用性之間取一個平衡。對於大多數web應用,其實並不需要強一致性,因此犧牲一致性而換取高可用性,是目前多數分布式數據庫產品的方向。

當然,並不是完全不管數據的一致性。犧牲一致性,只是不再要求關系型數據庫中的強一致性,而是只要系統能達到最終一致性即可,考慮到客戶體驗,這個最終一致的時間窗口,要盡可能的對用戶透明,也就是需要保障“用戶感知到的一致性”。通常是通過數據的多份異步復制來實現系統的高可用和數據的最終一致性的,“用戶感知到的一致性”的時間窗口則取決於數據復制到一致狀態的時間。


一致性模型

強一致性

當更新操作完成之后,任何多個后續進程或者線程的訪問都會返回最新的更新過的值。這種是對用戶最友好的,就是用戶上一次寫什么,下一次就保證能讀到什么。但是這種實現對性能影響較大。

弱一致性

系統並不保證續進程或者線程的訪問都會返回最新的更新過的值。系統在數據寫入成功之后,不承諾立即可以讀到最新寫入的值,也不會具體的承諾多久之后可以讀到。但會盡可能保證在某個時間級別(比如秒級別)之后,可以讓數據達到一致性狀態。

最終一致性

弱一致性的特定形式。系統保證在沒有后續更新的前提下,系統最終返回上一次更新操作的值。在沒有故障發生的前提下,不一致窗口的時間主要受通信延遲,系統負載和復制副本的個數影響。DNS是一個典型的最終一致性系統。

最終一致性模型的變種

  • 因果一致性:如果A進程在更新之后向B進程通知更新的完成,那么B的訪問操作將會返回更新的值。如果沒有因果關系的C進程將會遵循最終一致性的規則。
  • 讀己所寫一致性:因果一致性的特定形式。一個進程總可以讀到自己更新的數據。
  • 會話一致性:讀己所寫一致性的特定形式。進程在訪問存儲系統同一個會話內,系統保證該進程讀己之所寫。
  • 單調讀一致性:如果一個進程已經讀取到一個特定值,那么該進程不會讀取到該值以前的任何值。
  • 單調寫一致性:系統保證對同一個進程的寫操作串行化。

上述最終一致性的不同方式可以進行組合,例如單調讀一致性和讀己之所寫一致性就可以組合實現。並且從實踐的角度來看,這兩者的組合,讀取自己更新的 數據,和一旦讀取到最新的版本不會再讀取舊版本,對於此架構上的程序開發來說,會少很多額外的煩惱。


BASE理論——CAP理論的延伸

BASE理論是對CAP理論的延伸,核心思想是即使無法做到強一致性(Strong Consistency,CAP的一致性就是強一致性),但應用可以采用適合的方式達到最終一致性(Eventual Consitency)。Redis等眾多系統構建於這個理論之上。

  • 基本可用(Basically Available)
    基本可用是指分布式系統在出現故障的時候,允許損失部分可用性,即保證核心可用。
    電商大促時,為了應對訪問量激增,部分用戶可能會被引導到降級頁面,服務層也可能只提供降級服務。這就是損失部分可用性的體現。

  • 軟狀態( Soft State)
    軟狀態是指允許系統存在中間狀態,而該中間狀態不會影響系統整體可用性。分布式存儲中一般一份數據至少會有三個副本,允許不同節點間副本同步的延時就是軟狀態的體現。mysql replication的異步復制也是一種體現。

  • 最終一致性( Eventual Consistency)
    最終一致性是指系統中的所有數據副本經過一定時間后,最終能夠達到一致的狀態。弱一致性和強一致性相反,最終一致性是弱一致性的一種特殊情況。


BASE和ACID的區別與聯系

ACID,是指數據庫管理系統(DBMS)在寫入/更新資料的過程中,為保證事務(transaction)是正確可靠的,所必須具備的四個特性:原子性(atomicity,或稱不可分割性)、一致性(consistency)、隔離性(isolation,又稱獨立性)、持久性(durability)。

  • 原子性:一個事務(transaction)中的所有操作,要么全部完成,要么全部不完成,不會結束在中間某個環節。事務在執行過程中發生錯誤,會被回滾(Rollback)到事務開始前的狀態,就像這個事務從來沒有執行過一樣。

  • 一致性:在事務開始之前和事務結束以后,數據庫的完整性沒有被破壞。這表示寫入的資料必須完全符合所有的預設規則,這包含資料的精確度、串聯性以及后續數據庫可以自發性地完成預定的工作。

  • 隔離性:數據庫允許多個並發事務同時對齊數據進行讀寫和修改的能力,隔離性可以防止多個事務並發執行時由於交叉執行而導致數據的不一致。事務隔離分為不同級別,包括讀未提交(Read uncommitted)、讀提交(read committed)、可重復讀(repeatable read)和串行化(Serializable)。

  • 持久性:事務處理結束后,對數據的修改就是永久的,即便系統故障也不會丟失。

ACID是傳統數據庫常用的設計理念, 追求強一致性模型。BASE支持的是大型分布式系統,提出通過犧牲強一致性獲得高可用性。

ACID和BASE代表了兩種截然相反的設計哲學,分處【一致性-可用性】分布圖譜的兩極。


原文地址:
http://wangxin123.com/2016/10/21/CAP原理、一致性模型、BASE理論和ACID特性/


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM