在《分佈式系統概念與設計》一書中,對分佈式系統作了以下定義:分佈式系統是一個硬件或軟件組件分佈在不一樣的網絡計算機上,彼此之間僅僅經過消息傳遞進行通訊和協調的系統。數據庫
一個標準的分佈式系統在沒有任何特定業務邏輯約束的狀況下,都會有以下幾個特徵:服務器
分佈式事務是指事務的參與者、支持事務的服務器、資源服務器以及事務管理器分別位於分佈式系統的不一樣節點之上。一般一個分佈式事務中會涉及對多個數據源或業務系統的操做。 例如:一個跨銀行的轉帳操做涉及調用兩個異地的銀行服務,其中一個是本地銀行提供的取款服務,另外一個則是目標銀行提供的存款服務,這兩個服務自己是無狀態而且是相互獨立的,共同構成了一個完整的分佈式事務。若是從本地銀行取款成功,可是由於某種緣由存款服務失敗了,那麼就必須回滾到取款錢的狀態,不然用戶可能發現本身的錢不知去向了。 從這個例子中,咱們能夠看到,一個分佈式事務能夠看做是由多個分佈式操做序列組成的,例如上面例子中的取款服務和存款服務,一般能夠把這一系列分佈式的操做序列稱爲子事務。所以,分佈式事務也能夠被定義爲一種嵌套的事務,同時也就具備了ACID事務特性。但因爲在分佈式事務中,各個子事務的執行是分佈式的,所以要實現一種可以保證ACID特性的分佈式事務處理系統就顯得格外複雜。網絡
CAP理論告訴咱們,一個分佈式系統不可能同時知足一致性(C:Consistency)、可用性(A:Availability)和分區容錯性(P:Partition tolerance)這三個基本需求,最多隻能同時知足其中的兩項。架構
一個分佈式系統沒法同時知足上述單個需求,而只能知足其中的兩項,所以在進行對CAP理論的應用時,咱們就須要拋棄其中的一項。場景說明以下:併發
放棄CAP理論 | 說明 |
---|---|
放棄P | 若是但願系統避免出現分區容錯性問題,一種較爲簡單的作法是將全部的數據(或者是僅僅是那些與事務相關的數據)都放在一個分佈式節點上。這樣的作法雖然沒法100%地保證系統不會出錯,但至少不會碰到因爲網絡分區帶來的負面影響。但同時須要注意的是,放棄P的同時也就意味着放棄了系統的可擴展性 |
放棄A | 對於放棄「分區容錯性」來講,放棄可用性則正好相反,其作法是一旦系統遇到網絡分區或者其餘故障時,那麼受影響的服務須要等待必定的時間,所以在等待期間系統沒法對外提供正常的服務,即不可用 |
放棄C | 這裏所說的放棄一致性,並非徹底不須要數據的一致性,若是真是這樣的話,那麼系統數據都是沒有意義的,整個系統也是沒有價值的。事實上,放棄一致性指的是放棄數據的強一致性,而保留數據的最終一致性。這樣的系統沒法保證數據的實時一致性,可是可以承諾的是,數據最終會達到一個一致的狀態。這就引入了一個時間窗口的額概念,具體多久可以達到數據一致性的狀態取決於系統的需求與設計,主要包括數據副本在不一樣節點之間的複製時間長短 |
從CAP定理中咱們能夠看出,一個分佈式系統不可能同時知足一致性、可用性和分區容錯性這三個需求。另外一方面,須要明確的一點是,對於一個分佈式系統而言,分區容錯性能夠說是最基本的需求。爲何這樣說,其實很簡單,由於既然是一個分佈式系統,那麼分佈式系統中的組件必然須要被部署到不一樣的節點,不然也就無所謂分佈式系統了,所以必然出現子網絡。而對於分佈式系統而言,網絡問題又是一個一定會出現的異常狀況,所以分區容錯性也就成了分佈式系統必然須要面對和解決的問題。所以系統架構師每每須要把精力花在如何根據業務特色在C(一致性)和A(可用性)之間尋求平衡。分佈式
BASE 是Basecally Available(基本可用)、Soft state(軟狀態)和Eventually consistent(最終一致性)三個短語的縮寫,是由來自eBay的架構師Dan Pritchett在其文章BASE:An ACID Alternative中第一次明確提出的。BASE是對CAP中一致性和可用性權衡的結果,其來源於對大規模互聯網系統分佈式實踐的總結,是基於CAP理論逐步演化而來的,其核心思想是即便沒法作到強一致性(Strong consistency),但每一個應用均可以根據自身的業務特色,採用適當的方式來使系統達到最終一致性(Eventual Consistency).接下來咱們着重對BASE中的三要素進行詳細講解:設計