分佈式系統CAP與BASE

分佈式系統的概念

在《分佈式系統概念與設計》一書中,對分佈式系統作了以下定義:分佈式系統是一個硬件或軟件組件分佈在不一樣的網絡計算機上,彼此之間僅僅經過消息傳遞進行通訊和協調的系統。數據庫

一個標準的分佈式系統在沒有任何特定業務邏輯約束的狀況下,都會有以下幾個特徵:服務器

  • 分佈性:分佈式系統中的多臺計算機都會在空間上隨意分佈,同時,機器的分佈狀況也會隨時變更
  • 對等性:分佈式系統中的計算機沒有主/從之分,即沒有控制整個系統的主機是,也沒有被控制的從機,組成分佈式系統的全部計算機節點都是對等的。副本(Replica)是分佈式系統最多見的概念之一,指的是分佈式系統對數據服務提供的一種冗餘方式。在常見的分佈式系統中,爲了對外提供高可用的服務,咱們每每會對數據和服務進行副本處理。數據副本是指在不一樣的節點上持久化同一份數據,當某一個節點上存儲的數據丟失時,能夠從副本上讀取到該數據,這是解決分佈式系統數據丟失問題最爲有效的手段。另外一類副本是服務副本,指多個節點提供一樣的服務,每一個節點都有能力接收來自外部的請求並進行相應的處理。
  • 併發性:同一個分佈式系統中的多個節點,可能會併發的操做一些共享的資源,諸如數據庫或分佈式存儲等,如何準確並高效的協調分佈式併發操做成爲了分佈式系統架構與設計中最大的挑戰之一
  • 缺少全局時鐘:一個典型的分佈式系統是由一系列在空間上隨意分佈的多個進程組成,具備明顯的分佈性,這些進程之間經過交換消息來進行相互通訊。所以,在分佈式系統中,很難定義兩個事件究竟誰先誰後,緣由就是由於分佈式系統缺少一個全局的時鐘序列控制
  • 故障老是會發生:組成分佈式系統的全部計算機,都有可能發生任何形式的故障。一個被大量工程實踐所檢驗過的黃金定理是:任何在設計階段考慮到的異常狀況,必定會在系統實際運行中發生,而且,在系統實際運行過程當中還會遇到不少在設計時未能考慮到的異常故障。因此,除非需求指標容許,在系統設計時不能放過任何異常狀況。

分佈式事務

分佈式事務是指事務的參與者、支持事務的服務器、資源服務器以及事務管理器分別位於分佈式系統的不一樣節點之上。一般一個分佈式事務中會涉及對多個數據源或業務系統的操做。 例如:一個跨銀行的轉帳操做涉及調用兩個異地的銀行服務,其中一個是本地銀行提供的取款服務,另外一個則是目標銀行提供的存款服務,這兩個服務自己是無狀態而且是相互獨立的,共同構成了一個完整的分佈式事務。若是從本地銀行取款成功,可是由於某種緣由存款服務失敗了,那麼就必須回滾到取款錢的狀態,不然用戶可能發現本身的錢不知去向了。 從這個例子中,咱們能夠看到,一個分佈式事務能夠看做是由多個分佈式操做序列組成的,例如上面例子中的取款服務和存款服務,一般能夠把這一系列分佈式的操做序列稱爲子事務。所以,分佈式事務也能夠被定義爲一種嵌套的事務,同時也就具備了ACID事務特性。但因爲在分佈式事務中,各個子事務的執行是分佈式的,所以要實現一種可以保證ACID特性的分佈式事務處理系統就顯得格外複雜。網絡

CAP理論

CAP理論告訴咱們,一個分佈式系統不可能同時知足一致性(C:Consistency)、可用性(A:Availability)和分區容錯性(P:Partition tolerance)這三個基本需求,最多隻能同時知足其中的兩項。架構

  • 一致性:跟新操做使各節點的數據一致
  • 可用性:可以在有限的時間內返回明確的結果
  • 分區容錯性:分佈式系統在遇到任何網絡分區故障時,任然須要可以保證對外提供知足一致性和可用性服務,除非是整個網絡環境都發生了故障。

一個分佈式系統沒法同時知足上述單個需求,而只能知足其中的兩項,所以在進行對CAP理論的應用時,咱們就須要拋棄其中的一項。場景說明以下:併發

放棄CAP理論 說明
放棄P 若是但願系統避免出現分區容錯性問題,一種較爲簡單的作法是將全部的數據(或者是僅僅是那些與事務相關的數據)都放在一個分佈式節點上。這樣的作法雖然沒法100%地保證系統不會出錯,但至少不會碰到因爲網絡分區帶來的負面影響。但同時須要注意的是,放棄P的同時也就意味着放棄了系統的可擴展性
放棄A 對於放棄「分區容錯性」來講,放棄可用性則正好相反,其作法是一旦系統遇到網絡分區或者其餘故障時,那麼受影響的服務須要等待必定的時間,所以在等待期間系統沒法對外提供正常的服務,即不可用
放棄C 這裏所說的放棄一致性,並非徹底不須要數據的一致性,若是真是這樣的話,那麼系統數據都是沒有意義的,整個系統也是沒有價值的。事實上,放棄一致性指的是放棄數據的強一致性,而保留數據的最終一致性。這樣的系統沒法保證數據的實時一致性,可是可以承諾的是,數據最終會達到一個一致的狀態。這就引入了一個時間窗口的額概念,具體多久可以達到數據一致性的狀態取決於系統的需求與設計,主要包括數據副本在不一樣節點之間的複製時間長短

從CAP定理中咱們能夠看出,一個分佈式系統不可能同時知足一致性、可用性和分區容錯性這三個需求。另外一方面,須要明確的一點是,對於一個分佈式系統而言,分區容錯性能夠說是最基本的需求。爲何這樣說,其實很簡單,由於既然是一個分佈式系統,那麼分佈式系統中的組件必然須要被部署到不一樣的節點,不然也就無所謂分佈式系統了,所以必然出現子網絡。而對於分佈式系統而言,網絡問題又是一個一定會出現的異常狀況,所以分區容錯性也就成了分佈式系統必然須要面對和解決的問題。所以系統架構師每每須要把精力花在如何根據業務特色在C(一致性)和A(可用性)之間尋求平衡。分佈式

BASE理論

BASE 是Basecally Available(基本可用)、Soft state(軟狀態)和Eventually consistent(最終一致性)三個短語的縮寫,是由來自eBay的架構師Dan Pritchett在其文章BASE:An ACID Alternative中第一次明確提出的。BASE是對CAP中一致性和可用性權衡的結果,其來源於對大規模互聯網系統分佈式實踐的總結,是基於CAP理論逐步演化而來的,其核心思想是即便沒法作到強一致性(Strong consistency),但每一個應用均可以根據自身的業務特色,採用適當的方式來使系統達到最終一致性(Eventual Consistency).接下來咱們着重對BASE中的三要素進行詳細講解:設計

  • 基本可用:
  • 弱狀態:
  • 最終一致性: 參考文獻《從PAXOS到Zookeeper分佈式一致性原理與實踐》
相關文章
相關標籤/搜索