徹底搞清楚什么是CAP理論


1、說明

以下內容引用攀博課堂,如果侵權,請聯系刪除
http://www.pbteach.com/java/java_06_03/20210520/579963602065162240.html

2、簡介

CAP是 Consistency、Availability、Partition tolerance三個詞語的縮寫,分別表示一致性、可用性、分區容忍性。CAP是一個已經被證實的理論:一個分布式系統最多只能同時滿足一致性(Consistency)、可用性(Availability)和分區容忍性(Partition tolerance)這三項中的兩項。

3、理解CAP

CAP是 Consistency、Availability、Partition tolerance三個詞語的縮寫,分別表示一致性、可用性、分區容忍性。

下邊我們分別來解釋:

為了方便對CAP理論的理解,我們結合電商系統中的一些業務場景來理解CAP。

如下圖,是商品信息管理的執行流程:

整體執行流程如下:

1、商品服務請求主數據庫寫入商品信息(添加商品、修改商品、刪除商品)

2、主數據庫向商品服務響應寫入成功。

3、商品服務請求從數據庫讀取商品信息。

C - Consistency:

一致性是指寫操作后的讀操作可以讀取到最新的數據狀態,當數據分布在多個節點上,從任意結點讀取到的數據都是最新的狀態。

上圖中,商品信息的讀寫要滿足一致性就是要實現如下目標:

1、商品服務寫入主數據庫成功,則向從數據庫查詢新數據也成功。

2、商品服務寫入主數據庫失敗,則向從數據庫查詢新數據也失敗。

如何實現一致性?

​ 1、寫入主數據庫后要將數據同步到從數據庫。

​ 2、寫入主數據庫后,在向從數據庫同步期間要將從數據庫鎖定,待同步完成后再釋放鎖,以免在新數據寫入成功后,向從數據庫查詢到舊的數據。

分布式系統一致性的特點:

​ 1、由於存在數據同步的過程,寫操作的響應會有一定的延遲。

​ 2、為了保證數據一致性會對資源暫時鎖定,待數據同步完成釋放鎖定資源。

​ 3、如果請求數據同步失敗的結點則會返回錯誤信息,一定不會返回舊數據。

A - Availability :

​ 可用性是指任何事務操作都可以得到響應結果,且不會出現響應超時或響應錯誤。

​ 上圖中,商品信息讀取滿足可用性就是要實現如下目標:

​ 1、從數據庫接收到數據查詢的請求則立即能夠響應數據查詢結果。

​ 2、從數據庫不允許出現響應超時或響應錯誤。

​ 如何實現可用性?

​ 1、寫入主數據庫后要將數據同步到從數據庫。

​ 2、由於要保證從數據庫的可用性,不可將從數據庫中的資源進行鎖定。

​ 3、即時數據還沒有同步過來,從數據庫也要返回要查詢的數據,哪怕是舊數據,如果連舊數據也沒有則可以按照約定返回一個默認信息,但不能返回錯誤或響應超時。

​ 分布式系統可用性的特點:

​ 1、 所有請求都有響應,且不會出現響應超時或響應錯誤。

P - Partition tolerance :

​ 通常分布式系統的各各結點部署在不同的子網,這就是網絡分區,不可避免的會出現由於網絡問題而導致結點之間通信失敗,此時仍可對外提供服務,這叫分區容忍性。

​ 上圖中,商品信息讀寫滿足分區容忍性就是要實現如下目標:

​ 1、主數據庫向從數據庫同步數據失敗不影響讀寫操作。

​ 2、其一個結點掛掉不影響另一個結點對外提供服務。

​ 如何實現分區容忍性?

​ 1、盡量使用異步取代同步操作,例如使用異步方式將數據從主數據庫同步到從數據,這樣結點之間能有效的實現松耦合。

​ 2、添加從數據庫結點,其中一個從結點掛掉其它從結點提供服務。

​ 分布式分區容忍性的特點:

​ 1、分區容忍性分是布式系統具備的基本能力。

4、CAP組合方式

1、上邊商品管理的例子是否同時具備 CAP呢?

在所有分布式事務場景中不會同時具備CAP三個特性,因為在具備了P的前提下C和A是不能共存的。

​ 比如:

​ 下圖滿足了P即表示實現分區容忍:

本圖分區容忍的含義是:

1)主數據庫通過網絡向從數據同步數據,可以認為主從數據庫部署在不同的分區,通過網絡進行交互。

2)當主數據庫和從數據庫之間的網絡出現問題不影響主數據庫和從數據庫對外提供服務。

3)其一個結點掛掉不影響另一個結點對外提供服務。

如果要實現C則必須保證數據一致性,在數據同步的時候為防止向從數據庫查詢不一致的數據則需要將從數據庫數據鎖定,待同步完成后解鎖,如果同步失敗從數據庫要返回錯誤信息或超時信息。

如果要實現A則必須保證數據可用性,不管任何時候都可以向從數據查詢數據,則不會響應超時或返回錯誤信息。

通過分析發現在滿足P的前提下C和A存在矛盾性。

2、CAP有哪些組合方式呢?

​ 所以在生產中對分布式事務處理時要根據需求來確定滿足CAP的哪兩個方面。

​ 1)AP:

​ 放棄一致性,追求分區容忍性和可用性。這是很多分布式系統設計時的選擇。

​ 例如:

​ 上邊的商品管理,完全可以實現AP,前提是只要用戶可以接受所查詢的到數據在一定時間內不是最新的即可。

​ 通常實現AP都會保證最終一致性,后面講的BASE理論就是根據AP來擴展的,一些業務場景 比如:訂單退款,今日退款成功,明日賬戶到賬,只要用戶可以接受在一定時間內到賬即可。

​ 2)CP:

​ 放棄可用性,追求一致性和分區容錯性,我們的zookeeper其實就是追求的強一致,又比如跨行轉賬,一次轉賬請求要等待雙方銀行系統都完成整個事務才算完成。

​ 3)CA:

​ 放棄分區容忍性,即不進行分區,不考慮由於網絡不通或結點掛掉的問題,則可以實現一致性和可用性。那么系統將不是一個標准的分布式系統,我們最常用的關系型數據就滿足了CA。

​ 上邊的商品管理,如果要實現CA則架構如下:

主數據庫和從數據庫中間不再進行數據同步,數據庫可以響應每次的查詢請求,通過事務隔離級別實現每個查詢請求都可以返回最新的數據。

5、總結

通過上面我們已經學習了CAP理論的相關知識,CAP是一個已經被證實的理論:一個分布式系統最多只能同時滿足一致性(Consistency)、可用性(Availability)和分區容忍性(Partition tolerance)這三項中的兩項。它可以作為我們進行架構設計、技術選型的考量標准。對於多數大型互聯網應用的場景,結點眾多、部署分散,而且現在的集群規模越來越大,所以節點故障、網絡故障是常態,而且要保證服務可用性達到N個9(99.99..%),並要達到良好的響應性能來提高用戶體驗,因此一般都會做出如下選擇:保證P和A,舍棄C強一致,保證最終一致性。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM