1. 程式人生 > >CAP理論&BASE理論

CAP理論&BASE理論

CAP理論

 

C:Consistency 一致性
同一資料的多個副本是否實時相同。
A:Availability 可用性
可用性:一定時間內 & 系統返回一個明確的結果 則稱為該系統可用。
P:Partition tolerance 分割槽容錯性
將同一服務分佈在多個系統中,從而保證某一個系統宕機,仍然有其他系統提供相同的服務。

一個分散式系統無論在CAP三者之間如何權衡,都無法徹底放棄一致性(Consistency),如果真的放棄一致性,那麼就說明這個系統中的資料根本不可信,資料也就沒有意義,那麼這個系統也就沒有任何價值可言

比如:下單操作要依次扣減紅包、扣減折扣券、扣減庫存。在下單應用的執行過程中,呼叫紅包系統扣減紅包成功了,但是再呼叫折扣券系統扣減折扣券的時候網路超時了。這時候下單應用根本不知道折扣券系統到底有沒有執行成功。這時候他就需要一些機制來決定是要回滾紅包的扣減,還是繼續執行庫存的扣減。這種機制,其實就是資料一致性的解決方案了。


一致性模型


強一致性
當更新操作完成之後,任何多個後續程序或者執行緒的訪問都會返回最新的更新過的值。這種是對使用者最友好的,就是使用者上一次寫什麼,下一次就保證能讀到什麼。

但是這種實現對效能影響較大,因為這意味著,只要上次的操作沒有處理完,就不能讓使用者讀取資料。

弱一致性
系統並不保證程序或者執行緒的訪問都會返回最新的更新過的值。系統在資料寫入成功之後,不承諾立即可以讀到最新寫入的值,也不會具體的承諾多久之後可以讀到。但會盡可能保證在某個時間級別(比如秒級別)之後,可以讓資料達到一致性狀態。

最終一致性
弱一致性的特定形式。系統保證在沒有後續更新的前提下,系統最終返回上一次更新操作的值。在沒有故障發生的前提下,不一致視窗的時間主要受通訊延遲,系統負載和複製副本的個數影響

 

CAP的論證


CA without P
從Google的經驗中可以得到的結論是,無法通過降低CA來提升P。要想提升系統的分割槽容錯性,需要通過提升基礎設施的穩定性來保障。

CP without A
容許系統停機或者長時間無響應的話
最典型的就是很多分散式資料庫,他們都是設計成CP的。在發生極端情況時,優先保證資料的強一致性,代價就是捨棄系統的可用性。如Redis、HBase等,還有分散式系統中常用的Zookeeper也是在CAP三者之中選擇優先保證CP的。

無論是像Redis、HBase這種分散式儲存系統,還是像Zookeeper這種分散式協調元件。資料的一致性是他們最最基本的要求。一個連資料一致性都保證不了的分散式儲存要他有何用?

ZooKeeper是分散式協調服務,它的職責是保證資料在其管轄下的所有服務之間保持同步、一致。所以就不難理解為什麼ZooKeeper被設計成CP而不是AP特性的了

AP wihtout C
放棄一致性

很多系統在可用性方面會做很多事情來保證系統的全年可用性可以達到N個9,所以,對於很多業務系統來說,比如淘寶的購物,12306的買票。都是在可用性和一致性之間捨棄了一致性而選擇可用性。

12306買票的時候肯定遇到過這種場景,當你購買的時候提示你是有票的(但是可能實際已經沒票了),你也正常的去輸入驗證碼,下單了。但是過了一會系統提示你下單失敗,餘票不足。
案例捨棄的只是強一致性。退而求其次保證了最終一致性。也就是說,雖然下單的瞬間,關於車票的庫存可能存在資料不一致的情況,但是過了一段時間,還是要保證最終一致性的。

適合的才是最好的
涉及到錢財這樣不能有一絲讓步的場景,C必須保證。網路發生故障寧可停止服務,這是保證CA,捨棄P。比如前幾年支付寶光纜被挖斷的事件,在網路出現故障的時候,支付寶就在可用性和資料一致性之間選擇了資料一致性,使用者感受到的是支付寶系統長時間宕機,但是其實背後是無數的工程師在恢復資料,保證數資料的一致性。


BASE理論


BASE理論是對CAP理論的延伸,核心思想是即使無法做到強一致性(Strong Consistency,CAP的一致性就是強一致性),但應用可以採用適合的方式達到最終一致性(Eventual Consitency)。

BASE是指基本可用(Basically Available)
基本可用是指分散式系統在出現故障的時候,允許損失部分可用性,即保證核心可用。
電商大促時,為了應對訪問量激增,部分使用者可能會被引導到降級頁面,服務層也可能只提供降級服務。這就是損失部分可用性的體現。

軟狀態( Soft State)
軟狀態是指允許系統存在中間狀態,而該中間狀態不會影響系統整體可用性。分散式儲存中一般一份資料至少會有三個副本,允許不同節點間副本同步的延時就是軟狀態的體現。
mysql replication的非同步複製也是一種體現。

最終一致性( Eventual Consistency)
最終一致性是指系統中的所有資料副本經過一定時間後,最終能夠達到一致的狀態。弱一致性和強一致性相反,最終一致性是弱一致性的一種特殊情況。

 

參考:

https://my.oschina.net/foodon/blog/372703

http://www.hollischuang.com/archives/666

https://www.zhihu.com/question/54105974