天天看點

分布式系統CAP定理與BASE理論

部落格搬家,原位址:https://langzi989.github.io/2018/11/28/CAP定理與Base理論/

1、CAP定理

在計算機科學中,CAP定理指出,對于一個分布式系統,不能同時滿足一下三點,最多隻能同時滿足其中兩點:

  • 一緻性(Consistency):在分布式系統環境下,資料在多台機器上有多個副本。當對資料執行更新操作時,資料更新操作完成後,所有節點在同一時間的資料完全一緻,用戶端讀取的資料永遠是更新後的最新資料。
  • 可用性(Availability) : 服務一直可用,即對于用戶端每次讀或寫請求都能在有限時間内得到正确的響應,但不保證擷取的資料為最新資料。 "有限時間内"是指對于用戶端的每一個操作請求,系統必能夠在指定的時間内傳回對應的處理結果,如果超過了這個時間範圍,系統将被認為是不可用的。
  • 分區容錯性(Partition tolerance) : 在網絡分區出現故障時保證系統不受影響,仍讓可以對外提供一緻性和可用性服務。網絡分區出現故障通常指的是節點之間的網絡故障,但是節點内部網絡是完好的,這種情況導緻的問題就是節點之間無法進行資料複制。

1.1 CAP定理簡單證明

由于分布式系統中多個節點分布在不同的機器(當然也可以是單台機器上的多個節點),節點之間通過網絡進行通信,由于網絡不完全可靠,是以在分布式系統中我們必須要滿足分區容錯性。若要舍棄分區容錯性,也就是隻有一個分區,何談分布式系統,是以下面的讨論總是圍繞分區容錯性來讨論。當網絡分區出現故障的時候,我們可以通過一定政策來達到一緻性或可用性的要求。

一個簡單的分布式系統如下:系統中有兩個節點對外提供服務,Server1和Server2,Server1和Server2各自維護和通路自己的資料庫DB1和DB2,DB1和DB2資料通過複制技術保證資料之間的同步。

分布式系統CAP定理與BASE理論

在理想情況下,即同時滿足CAP的情況,DB1和DB2的資料是完全一緻的,Server1與Server2可以同時對外提供服務,使用者不管是請求server1還是請求server2,都會得到立即響應,并且擷取的資料是完全一緻且為最新資料。

但是現實中不可能出現這麼理想的情況,當DB1和DB2之間網絡發聲故障時,此時有使用者向Server1發送資料更新請求,DB1資料更新後無法将最新資料同步到DB2,此時DB2中存儲的任然是舊資料;這個時候,有使用者向Server2發送讀資料請求,由于資料還沒有同步,應用程式無法将最新的資料傳回給使用者,這個時候有兩種選擇:

  • 犧牲資料一緻性,保證服務可用性。Server傳回DB2中的舊資料給使用者
  • 犧牲服務可用性,保證資料一緻性。阻塞服務請求,直到故障恢複,DB1與DB2資料同步完成之後再恢複提供服務。

從上面分析可以看出,分布式系統不可能同時滿足CAP。在實際應用的過程中,由于不能同時滿足CAP,我們必須舍棄其中之一,由于P是所有分布式系統中不許滿足的,是以最後需要在C和A之間做個取舍。

在大多數的分布式資料庫中(如redis、Hbase等),往往是優先保證CP,因為無論是分布式系統還是想zooKeeper這種分布式協調元件,資料一緻性往往是他們最基本的要求。

對于需要保證高可用性的系統,将舍棄資料一緻性而保證服務的高可用性。如12306

2、Base理論

Base理論是Basically Available(基本可用)、Soft state(軟狀态)、Eventually consistent(最終一緻性)的縮寫;它基于CAP定理逐漸演化來的,它是CAP中一緻性和可用性權衡的結果,其核心思想是即使系統無法達到強一緻性,可以根據應用自身的業務特點,采用适當的方式來使系統達到最終一緻性。

2.1 基本可用(Basically Available)

基本可用是指當分布式系統發生故障的時候,允許損失部分可用性。常見的有以下幾種情況:

  • 響應時間上的損失:正常情況下,一個線上搜尋引擎需要再0.5秒之内傳回給使用者響應的查詢結果,但由于出現故障,查詢結果的響應時間增加到了1~2秒。
  • 功能上的損失:通常的做法是降級服務,如對于展示一些有序元素的頁面,但部分元件出現故障時,這個時候可不展示有序元素,降級為無序元素清單。

2.2 軟狀态

軟狀态是指允許系統中的資料存在中間狀态,并認為該中間狀态的存在不影響系統的整體可用性,即允許系統不同節點的資料副本之間進行資料同步的過程中存在延時。

2.3 最終一緻性

最終一緻性強調的是系統所有的資料副本,在經過一段時間的同步後,最終能夠達到一個一緻的狀态。是以,最終一緻性的本質是需要系統保證最終資料能夠達到一緻,而不需要試試保證系統資料的強一緻性。 具體最終一緻性的實作方法見之前一緻性相關部落格:

https://langzi989.github.io/2018/11/20/分布式系統資料一緻性/

參考連結:

http://robertgreiner.com/2014/08/cap-theorem-revisited/

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

https://yq.aliyun.com/articles/240630

繼續閱讀