1. 程式人生 > >Redis-CAP定理和BASE理論(二)

Redis-CAP定理和BASE理論(二)

CAP理論概述

1998 年來自柏克萊加州大學的電腦科學家 埃裡克.布魯爾(Eric Brewer) 提出分散式系統的三個基本指標:Consistency(一致性)Availability(可用性) 、Partition tolerance(分割槽容錯),簡稱:CAP。

在2000年的分散式計算原則研討大會上(PODC)埃裡克.布魯爾提出的一個猜想:在設計一個分散式系統時,CAP三者無法同時滿足。在2002年,麻省理工學院(MIT)的 賽斯·吉爾伯特(Seth Gilbert) 和 南希·林奇(Nancy Lynch) 發表了布魯爾猜想的證明,使之成為分散式計算系統的標準定理(也是理解分散式系統的起點)。定理討論了在兩個互相矛盾的請求到達彼此連線不通的兩個不同的分散式節點的時候的處理方案。

CAP定理定義

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

  • Consistency(一致性): 所有節點在同一時間具有相同的資料
  • Availability(可用性):保證每個請求不管成功或者失敗都有響應(也就是隻要收到使用者的請求,伺服器都要在合理的時間內給出合理的響應)
  • Partition tolerance(分割槽容錯):系統中任意資訊的丟失或失敗不會影響系統的繼續運作(也就是分散式系統遇到任何網路分割槽故障時,仍然可以對外提供一致性、可用性的服務)

什麼是分割槽?
在分散式系統中,不同的節點通常分佈在不同的子網路中,由於一些客觀的因素,子網路之間出現了網路不通,但子網路內部的網路是正常的。從而導致了整個系統的環境被切分成了若干個孤立的區域,這就是分割槽。

CAP三進二

大部分分散式系統都分佈在不同的子網路,分割槽又是高概率事件,因此分散式系統,預設是支援分割槽容錯的。由於Partition tolerance(分割槽容錯)的存在,導致Availability(可用性)Consistency(一致性)互相矛盾,因此一個分散式系統不可能同時很好的滿足一致性,可用性和分割槽容錯性這三個需求,最多隻能同時較好的滿足兩個,即分散式系統在AP和CP之間做選擇。

因此,根據 CAP 定理將 NoSQL 資料庫分成了滿足 CA 、CP 和 AP 原則三 大類:

  • CA - 單點叢集,滿足一致性,可用性的系統,通常在可擴充套件性上不太強大。
  • CP - 滿足一致性,分割槽容忍性的系統,通常效能不是特別高。
  • AP - 滿足可用性,分割槽容忍性的系統,通常可能對一致性要求低一些。

BASE理論

CAP 理論的經典解釋,是忽略網路延遲的,但在實際中延遲和分割槽緊密相關。CAP 從理論變為落地的場景發生在操作的間歇,系統需要在這段時間內做出關於分割槽的一個重要決定:

  1. 取消操作,降低了系統的可用性
  2. 繼續操作,可能損失系統一致性

2008年eBay的架構師Dan Pritchett源於對大規模分散式系統的實踐總結,在ACM上發表文章提出BASE理論,BASE理論是對CAP理論的延伸。核心思想是通過犧牲一定的一致性(Strong Consistency,CAP的一致性就是強一致性),可以採用適合的方式達到最終一致性(Eventual Consitency),來最大程度的滿足大部分分散式系統的業務需求。

  • Basically Available(基本可用):分散式系統在出現故障時,允許損失部分可用功能,保證核心功能可用

服務降級策略?
在雙十一期大促期間,為了應對海量的訪問,保證下單等核心功能的可用性,各大電商平臺通常會採取降級服務策略:關閉評論等非核心功能)

  • Soft State(軟狀態/柔性事務):允許分散式系統中的資料存在中間狀態,即:分散式系統不同節點的副本資料可以存在延遲,並認為該狀態不影響分散式系統可用性
  • Eventual Consistency(最終一致性):在分散式系統可接受的時間範圍內,所有節點資料都將會達到一致,而可接受的時間範圍受網路、業務、資料及複製技術等等因素影響。實際應用中,有可以分為以下幾種
    1. 因果一致性:因果一致性是指,如果程序A在更新完某個資料項後通知了程序B,那麼程序B之後對該資料項的訪問都應該能夠獲取到程序A更新後的最新值,並且如果程序B要對該資料項進行更新操作的話,務必基於程序A更新後的最新值,即不能發生丟失更新情況。與此同時,與程序A無因果關係的程序C的資料訪問則沒有這樣的限制。
    2. 讀寫一致性:讀己之所寫是指,程序A更新一個數據項之後,它自己總是能夠訪問到更新過的最新值,而不會看到舊值。也就是說,對於單個數據獲取者而言,其讀取到的資料一定不會比自己上次寫入的值舊。因此,讀己之所寫也可以看作是一種特殊的因果一致性。
    3. 會話一致性:會話一致性將對系統資料的訪問過程框定在了一個會話當中:系統能保證在同一個有效的會話中實現“讀己之所寫”的一致性,也就是說,執行更新操作之後,客戶端能夠在同一個會話中始終讀取到該資料項的最新值。
    4. 單調讀一致性:單調讀一致性是指如果一個程序從系統中讀取出一個數據項的某個值後,那麼系統對於該程序後續的任何資料訪問都不應該返回更舊的值。
    5. 單調寫一致性:單調寫一致性是指,一個系統需要能夠保證來自同一個程序的寫操作被順序地執行。

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

結束語

BASE理論是對CAP定理的延伸,是Redis、MongoDB等眾多NoSQL資料庫管理系統的理論基礎。ACID是傳統關係型資料庫的設計理念,ACID 和 BASE代表截然不同的兩種設計哲學,強一致性-可用性的兩端。

延伸閱讀:

CAP Twelve Years Later: How the “Rules” Have Changed
CAP理論十二年回顧:”規則”變了