1. 程式人生 > >【分散式基礎】7.cap原則與base理論

【分散式基礎】7.cap原則與base理論

1.CAP原則

C:一致性(Consistency): 所有節點上的資料,時刻保持一致 A:可用性(Availability):每個請求都能夠收到一個響應,無論響應成功或者失敗 P:分割槽容錯 (Partition-tolerance):表示系統出現腦裂以後,可能導致某些server與叢集中的其他機器失去聯絡 CP / AP CAP理論僅適用於原子讀寫的Nosql場景,不適用於資料庫系統(因為容錯在資料庫系統是不可能的!)

熟悉CAP的人都知道,三者不能共有,如果感興趣可以搜尋CAP的證明,在分散式系統中,網路無法100%可靠,分割槽其實是一個必然現象,如果我們選擇了CA而放棄了P,那麼當發生分割槽現象時,為了保證一致性,這個時候必須拒絕請求,但是A又不允許,所以分散式系統理論上不可能選擇CA架構,只能選擇CP或者AP架構。

對於CP來說,放棄可用性,追求一致性和分割槽容錯性,我們的zookeeper其實就是追求的強一致。

對於AP來說,放棄一致性(這裡說的一致性是強一致性),追求分割槽容錯性和可用性,這是很多分散式系統設計時的選擇,後面的BASE也是根據AP來擴充套件。

2.BASE理論

基於CAP理論,CAP理論並不適用於資料庫事務(因為更新一些錯誤的資料而導致資料出現紊亂,無論什麼樣的資料庫高可用方案都是徒勞) ,雖然XA事務可以保證資料庫在分散式系統下的ACID特性,但是會帶來效能方面的影響;

eBay嘗試了一種完全不同的套路,放寬了對事務ACID的要求。提出了BASE理論 (1)Basically available : 資料庫採用分片模式, 把100W的使用者資料分佈在5個例項上。如果破壞了其中一個例項,仍然可以保證80%的使用者可用 (2)soft-state: 在基於client-server模式的系統中,server端是否有狀態,決定了系統是否具備良好的水平擴充套件、負載均衡、故障恢復等特性。(比如支付,有個下單待支付的狀態,這個就是軟狀態,直到非同步回撥更新支付狀態

) Server端承諾會維護client端狀態資料,這個狀態僅僅維持一小段時間, 這段時間以後,server端就會丟棄這個狀態,恢復正常狀態 (3)Eventually consistent:資料的最終一致性

BASE解決了CAP中理論沒有網路延遲,在BASE中用軟狀態和最終一致,保證了延遲後的一致性。BASE和 ACID 是相反的,它完全不同於ACID的強一致性模型,而是通過犧牲強一致性來獲得可用性,並允許資料在一段時間內是不一致的,但最終達到一致狀態。

3.為什麼不能同時滿足CAP原則

3.1cap定義

Consistency (一致性): “all nodes see the same data at the same time”,即更新操作成功並返回客戶端後,所有節點在同一時間的資料完全一致,這就是分散式的一致性。一致性的問題在併發系統中不可避免,對於客戶端來說,一致性指的是併發訪問時更新過的資料如何獲取的問題。從服務端來看,則是更新如何複製分佈到整個系統,以保證資料最終一致。

Availability (可用性): 可用性指“Reads and writes always succeed”,即服務一直可用,而且是正常響應時間。好的可用性主要是指系統能夠很好的為使用者服務,不出現使用者操作失敗或者訪問超時等使用者體驗不好的情況。

Partition Tolerance (分割槽容錯性): 即分散式系統在遇到某節點或網路分割槽故障的時候,仍然能夠對外提供滿足一致性和可用性的服務。

分割槽容錯性要求能夠使應用雖然是一個分散式系統,而看上去卻好像是在一個可以運轉正常的整體。比如現在的分散式系統中有某一個或者幾個機器宕掉了,其他剩下的機器還能夠正常運轉滿足系統需求,對於使用者而言並沒有什麼體驗上的影響。

3.2證明例子

只能滿足CA不能滿足P的理解 用異地DB來舉例。假如分別在A和B兩地部署了DB。兩個DB均能提供資料讀寫服務。對DB的要求是如果進行一個數據寫入操作,必須是兩地DB同時更新才能算成功。那麼此時這個部署是滿足C以及A,因為寫入一個數據後,在兩個結點是同時可以看到,而且在進行一個操作後,也是有成功的結果,所以同時滿足CA。如果此時出現網路故障,那麼CA是不能保證的,也就是說P的條件達不到。因此在這種情況只能滿足CA不能滿足P。 只能滿足AP不能滿足C的理解 還用異地DB來舉例。此時對DB的要求改為操作其中一個DB成功就算成功,另一個DB會根據binlog之類的進行同步。那麼此時這個部署是滿足A以及P的,因為寫入一個數據後,可以返回一個結果,同時當A地或者B地出現故障,不影響仍然能提供服務,所以同時滿足AP,但是在進行一個操作後,因為同步的原因兩邊會出現短暫的資料不一致,這是無法滿足C的,當AB兩地出現網路故障時,資料的差異會增大,更加無法滿足C。 只能滿足CP不能滿足A的理解 繼續用異地DB來舉例。此時對DB的要求是寫資料時,必須同時寫入到兩個DB才能算成功,同時如果有一個寫入失敗,將停止寫入操作的許可權只提供讀的操作。那麼此時這個部署是滿足C以及P的,因為寫入一個數據後,在兩個結點同時能看到,當出現網路故障時,將會停止寫入操作許可權只提供讀取操作。那麼CP是可以滿足的而A是無法滿足的。 當然在目前海量資料面前,往往會捨棄C,而保證AP,對與資料的一致性,只要求最終一致即可,在過程中是會出現差異的狀況,比如在不同地方的人對某個新聞或者商品進行評論,在一定時刻內是不需要實時顯示出來的,只要保證最終會出現即可。