天天看點

有人問你什麼是CAP?你就把這篇文章發給他

1、什麼是分布式系統

CAP定理是分布式存儲系統的基石,分布式系統(distributed system)指的是建立在網絡上的軟體系統,它是多個計算機節點通過協調工作的方式,共同完成任務的系統。分布式系統解決了單個計算機無法完成的計算和存儲任務。但是分布式系統的設計十分複雜,設計者必定面臨諸多挑戰,比如節點故障、網絡分區、異地網絡等等問題。

2、垂直擴充和水準擴充

上面有說到分布式系統,分布式和水準擴充等概念經常會一起出現,文中也通過閱讀資料和自己的了解總結一下計算機系統超負荷時,常用的兩種擴充解決手段。

有人問你什麼是CAP?你就把這篇文章發給他

垂直擴充(縱向擴充、向上擴充、Scale up):

指的是增加現有系統部件的記憶體、CPU等資源來提升系統的負荷能力。

水準擴充(橫向擴充、向外擴充、Scale Out):

指的是在現有系統部件的基礎上新增新的機器來提升系統的符合能力。

優缺點:

垂直擴充實作簡單,但是機器的增加硬體資源仍然容易達到性能瓶頸,需要繼續擴充。

水準擴充實作複雜,但是相比之下能帶來系統的高可用、高吞吐量等優勢。

3、CAP原則

CAP原則又稱CAP定理,指的是在一個分布式系統中,一緻性(Consistency)、可用性(Availability)、分區容錯性(Partition tolerance)。CAP 原則指的是,這三個要素最多隻能同時實作兩點,不可能三者兼顧。

有人問你什麼是CAP?你就把這篇文章發給他

一緻性(C):在分布式系統中的所有資料備份,在同一時刻是否同樣的值。(等同于所有節點通路同一份最新的資料副本)

可用性(A):保證每個請求不管成功或者失敗都有響應。

分區容錯性(P):系統中任意資訊的丢失或失敗不會影響系統的繼續運作。

上面有說到分布式系統建立在網絡上,需要依靠網絡來進行節點之間的通信,由于網絡的不穩定性是必然存在的,這可能會導緻節點網絡斷開,專業術語叫“網絡分區”。

有人問你什麼是CAP?你就把這篇文章發給他

在上圖中當網絡分區産生的時候,分布式節點之間無法進行通信,資料無法及時同步,此時用戶端對Node A節點資料的修改無法同步到Node B節點上,這會導緻分布式系統中資料不一緻,一緻性(Consistency)将無法得到保證,如果此時要保證分布式系統中資料一緻性,那麼隻能停止提供服務,等待節點網絡恢複資料同步之後,在提供服務,但是這樣系統就無法滿足可用性(Availability)。

是以CAP原理可以這樣簡單的總結:當網絡分區發生時,一緻性和可用性不可兼得。

4、如何取舍

CAP理論應該如何取舍,CAP 原則指的是,這三個要素最多隻能同時實作兩點,不可能三者兼顧。并且上面有分析在分布式系統中網絡分區必然存在的問題,是以理論上CAP在分布式系統中隻有CP和AP兩種選擇。

CP—不要求可用性(Availability),CP追求的是強一緻性,每個伺服器節點之間的資料必須保證完全一緻,選擇CP會導緻系統在發生網絡分區時,無法對外提供服務。CP強一緻性的系統架構在銀行轉賬系統中比較常見。Redis、HBase等資料庫也是典型的強一緻性分布式資料庫。

AP—不要求一緻性(Consistency),AP追求的是系統高可用,在網絡分區發生時,分布式系統仍然能夠提供服務,這會導緻資料短暫的不一緻性。AP高可用的系統架構在淘寶、京東等電商系統的秒殺活動中比較常見。

CA—不允許分區(Partition tolerance),這種情況不符合分布式系統架構,一般情況下都是Mysql、Oracle等RDBMS傳統的關系型資料庫。

5、資源推薦

關于CAP理論,其實比較簡單,但是具體運用于分布式系統實作起來是非常複雜的。網上的文章非常多,我感覺其實隻需要看下

Robert Greiner

的兩篇文章就可以。

https://robertgreiner.com/cap-theorem-explained/ https://robertgreiner.com/cap-theorem-revisited/