1. 程式人生 > >CAP原則和BASE理論

CAP原則和BASE理論

提高 丟失更新 很多 研發 訪問 訂單 特殊 這樣的 nsis

CAP原則


CAP原則又稱CAP定理,是一個經典的分布式系統理論。CAP理論告訴我們:一個分布式系統不可能同時滿足一致性(C:Consistency)、可用性(A:Availability)和分區容錯性(P:Partition tolerance)這三個基本需求,最多只能同時滿足其中兩項。

一致性

在分布式環境下,一致性是指數據在多個副本之間能否保持一致的特性。在一致性的需求下,當一個系統在數據一致的狀態下執行更新操作後,應該保證系統的數據仍然處於一致的狀態。

對於一個將數據副本分布在不同分布式節點上的系統來說,如果對第一個節點的數據進行了更新操作並且更新成功後,卻沒有使得第二個節點上的數據得到相應的更新,於是在對第二個節點的數據進行讀取操作時,獲取的依然是老數據(或稱為臟數據),這就是典型的分布式數據不一致的情況。在分布式系統中,如果能夠做到針對一個數據項的更新操作執行成功後,所有的用戶都可以讀取到其最新的值,那麽 這樣的系統就被認為具有強一致性

在分布式系統中要解決的一個重要問題就是數據的復制。在我們的日常開發經驗中,相信很多開發人員都遇到過這樣的問題:假設客戶端C1將系統中的一個值K由V1更新為V2,但客戶端C2無法立即讀取到K的最新值,需要在一段時間之後才能 讀取到。這很正常,因為數據庫復制之間存在延時。

分布式系統對於數據的復制需求一般都來自於以下兩個原因:

  1. 為了增加系統的可用性,以防止單點故障引起的系統不可用
  2. 提高系統的整體性能,通過負載均衡技術,能夠讓分布在不同地方的數據副本都能夠為用戶提供服務

數據復制在可用性和性能方面給分布式系統帶來的巨大好處是不言而喻的,然而數據復制所帶來的一致性挑戰,也是每一個系統研發人員不得不面對的。

所謂分布一致性問題,是指在分布式環境中引入數據復制機制之後,不同數據節點之間可能出現的,並無法依靠計算機應用程序自身解決的數據不一致的情況。簡單講,數據一致性就是指在對一個副本數據進行更新的時候,必須確保也能夠更新其他的副本,否則不同副本之間的數據將不一致。

那麽如何解決這個問題?一種思路是"既然是由於延時動作引起的問題,那我可以將寫入的動作阻塞,直到數據復制完成後,才完成寫入動作"。 沒錯,這似乎能解決問題,而且有一些系統的架構也確實直接使用了這個思路。但這個思路在解決一致性問題的同時,又帶來了新的問題:寫入的性能。如果你的應 用場景有非常多的寫請求,那麽使用這個思路之後,後續的寫請求都將會阻塞在前一個請求的寫操作上,導致系統整體性能急劇下降。

總得來說,我們無法找到一種能夠滿足分布式系統所有系統屬性的分布式一致性解決方案。因此,如何既保證數據的一致性,同時又不影響系統運行的性能,是每一個分布式系統都需要重點考慮和權衡的。於是,一致性級別由此誕生:

  1. 強一致性:這種一致性級別是最符合用戶直覺的,它要求系統寫入什麽,讀出來的也會是什麽,用戶體驗好,但實現起來往往對系統的性能影響大
  2. 弱一致性:這種一致性級別約束了系統在寫入成功後,不承諾立即可以讀到寫入的值,也不久承諾多久之後數據能夠達到一致,但會盡可能地保證到某個時間級別(比如秒級別)後,數據能夠達到一致狀態
  3. 最終一致性:最終一致性是弱一致性的一個特例,系統會保證在一定時間內,能夠達到一個數據一致的狀態。這裏之所以將最終一致性單獨提出來,是因為它是弱一致性中非常推崇的一種一致性模型,也是業界在大型分布式系統的數據一致性上比較推崇的模型

可用性

可用性是指系統提供的服務必須一直處於可用的狀態,對於用戶的每一個操作請求總是能夠在有限的時間內返回結果。這裏的重點是"有限時間內"和"返回結果"。

"有限時間內"是指,對於用戶的一個操作請求,系統必須能夠在指定的時間內返回對應的處理結果,如果超過了這個時間範圍,那麽系統就被認為是不可用的。另外,"有限的時間內"是指系統設計之初就設計好的運行指標,通常不同系統之間有很 大的不同,無論如何,對於用戶請求,系統必須存在一個合理的響應時間,否則用戶便會對系統感到失望。

"返回結果"是可用性的另一個非常重要的指標,它要求系統在完成對用戶請求的處理後,返回一個正常的響應結果。正常的響應結果通常能夠明確地反映出隊請求的處理結果,即成功或失敗,而不是一個讓用戶感到困惑的返回結果。

分區容錯性

分區容錯性約束了一個分布式系統具有如下特性:分布式系統在遇到任何網絡分區故障的時候,仍然需要能夠保證對外提供滿足一致性和可用性的服務,除非是整個網絡環境都發生了故障。

網絡分區是指在分布式系統中,不同的節點分布在不同的子網絡(機房或異地網絡)中,由於一些特殊的原因導致這些子網絡出現網絡不連通的狀況,但各個子網絡的內部網絡是正常的,從而導致整個系統的網絡環境被切分成了若幹個孤立的區域。 需要註意的是,組成一個分布式系統的每個節點的加入與退出都可以看作是一個特殊的網絡分區。

如何選擇

既然一個分布式系統無法同時滿足一致性、可用性、分區容錯性三個特點,所以我們就需要拋棄一樣。具體有如下幾種選擇:

  • CA:放棄分區容錯性,加強一致性和可用性,其實就是傳統的單機數據庫的選擇
  • AP:放棄一致性(這裏說的一致性是強一致性),追求分區容錯性和可用性,這是很多分布式系統設計時的選擇,例如很多NoSQL系統就是如此
  • CP:放棄可用性,追求一致性和分區容錯性,基本不會選擇,網絡問題會直接讓整個系統不可用

需要明確的一點是,對於一個分布式系統而言,分區容錯性是一個最基本的要求。因為既然是一個分布式系統,那麽分布式系統中的組件必然需要被部署到不同的節點,否則也就無所謂分布式系統了,因此必然出現子網絡。而對於分布式系統而言,網絡問題又是一個必定會出現的異常情況,因此分區容錯性也就成為了一個分布式系統必然需要面對和解決的問題。因此系統架構師往往需要把精力花在如何根據業務 特點在C(一致性)和A(可用性)之間尋求平衡。


BASE理論

BASE是Basically Available(基本可用)、Soft state(軟狀態)和Eventually consistent(最終一致性)三個短語的縮寫。BASE理論是對CAP中一致性和可用性權衡的結果,其來源於對大規模互聯網系統分布式實踐的總結,是基於CAP定理逐步演化而來的。BASE理論的核心思想是:即使無法做到強一致性,但每個應用都可以根據自身業務特點,采用適當的方式來使系統達到最終一致性。接下來看一下BASE中的三要素:

基本可用

基本可用是指分布式系統在出現不可預知故障的時候,允許損失部分可用性----註意,這絕不等價於系統不可用。比如:

  • 響應時間上的損失:正常情況下,一個在線搜索引擎需要在0.5秒之內返回給用戶相應的查詢結果,但由於出現故障,查詢結果的響應時間增加了1~2秒
  • 系統功能上的損失:正常情況下,在一個電子商務網站上進行購物的時候,消費者幾乎能夠順利完成每一筆訂單,但是在一些節日大促購物高峰的時候,由於消費者的購物行為激增,為了保護購物系統的穩定性,部分消費者可能會被引導到一個降級頁面

軟狀態

軟狀態指允許系統中的數據存在中間狀態,並認為該中間狀態的存在不會影響系統的整體可用性,即允許系統在不同節點的數據副本之間進行數據同步的過程存在延時

最終一致性

最終一致性強調的是所有的數據副本,在經過一段時間的同步之後,最終都能夠達到一個一致的狀態。因此,最終一致性的本質是需要系統保證最終數據能夠達到一致,而不需要實時保證系統數據的強一致性。

亞馬遜首席技術官Werner Vogels在於2008年發表的一篇文章中對最終一致性進行了非常詳細的介紹。他認為最終一致性時一種特殊的弱一致性:系統能夠保證在沒有其他新的更新操作的情況下,數據最終一定能夠達到一致的狀態,因此所有客戶端對系統的數據訪問都能夠胡渠道最新的值。同時,在沒有發生故障的前提下,數據達到一致狀態的時間延遲,取決於網絡延遲,系統負載和數據復制方案設計等因素。

在實際工程實踐中,最終一致性存在以下五類主要變種。

  1. 因果一致性:因果一致性是指,如果進程A在更新完某個數據項後通知了進程B,那麽進程B之後對該數據項的訪問都應該能夠獲取到進程A更新後的最新值,並且如果進程B要對該數據項進行更新操作的話,務必基於進程A更新後的最新值,即不能發生丟失更新情況。與此同時,與進程A無因果關系的進程C的數據訪問則沒有這樣的限制。
  2. 讀己之所寫:讀己之所寫是指,進程A更新一個數據項之後,它自己總是能夠訪問到更新過的最新值,而不會看到舊值。也就是說,對於單個數據獲取者而言,其讀取到的數據一定不會比自己上次寫入的值舊。因此,讀己之所寫也可以看作是一種特殊的因果一致性。
  3. 會話一致性:會話一致性將對系統數據的訪問過程框定在了一個會話當中:系統能保證在同一個有效的會話中實現“讀己之所寫”的一致性,也就是說,執行更新操作之後,客戶端能夠在同一個會話中始終讀取到該數據項的最新值。
  4. 單調讀一致性:單調讀一致性是指如果一個進程從系統中讀取出一個數據項的某個值後,那麽系統對於該進程後續的任何數據訪問都不應該返回更舊的值。
  5. 單調寫一致性:單調寫一致性是指,一個系統需要能夠保證來自同一個進程的寫操作被順序地執行。

以上就是最終一致性的五類常見的變種,在時間系統實踐中,可以將其中的若幹個變種互相結合起來,以構建一個具有最終一致性的分布式系統。事實上,可以將其中的若幹個變種相互結合起來,以構建一個具有最終一致性特性的分布式系統。事實上,最終一致性並不是只有那些大型分布式系統才設計的特性,許多現代的關系型數據庫都采用了最終一致性模型。在現代關系型數據庫中,大多都會采用同步和異步方式來實現主備數據復制技術。在同步方式中,數據的復制通常是更新事務的一部分,因此在事務完成後,主備數據庫的數據就會達到一致。而在異步方式中,備庫的更新往往存在延時,這取決於事務日誌在主備數據庫之間傳輸的時間長短,如果傳輸時間過長或者甚至在日誌傳輸過程中出現異常導致無法及時將事務應用到備庫上,那麽很顯然,從備庫中讀取的的數據將是舊的,因此就出現了不一致的情況。當然,無論是采用多次重試還是認為數據訂正,關系型數據庫還是能搞保證最終數據達到一致——這就是系統提供最終一致性保證的經典案例。

總的來說,BASE理論面向的是大型高可用可擴展的分布式系統,和傳統的事務ACID特性是相反的,它完全不同於ACID的強一致性模型,而是通過犧牲強一致性來獲得可用性,並允許數據在一段時間內是不一致的,但最終達到一致狀態。但同時,在實際的分布式場景中,不同業務單元和組件對數據一致性的要求是不同的,因此在具體的分布式系統架構設計過程中,ACID特性和BASE理論往往又會結合在一起。

CAP原則和BASE理論