CAP理論
理解CAP
不能因為有一點網路問題就導致整個系統無法提供服務,網路因素成為了分散式事務的考量標準之一。
CAP是Consistency、Availability、Parttion tolerance 三個詞語的縮寫,分別表示一致性、可用性、分割槽容忍性。
C - Consistency
一致性是指寫操作後的讀操作可以讀取到最新的資料狀態,當資料分佈在多個節點上,從任意節點讀取到的資料都是最新的狀態。
如何實現一致性?
- 寫入主資料庫後要將資料同步到從資料庫。
- 寫入主資料庫後,在向從資料庫同步期間要將從資料庫鎖定,待同步完成後再釋放鎖,以免在新資料寫入成功後,向從資料庫查詢到舊的資料。
分散式系統一致性的特點:
- 由於存在資料同步的過程,寫操作的響應會有一定的延遲。
- 為了保證資料一致性會對資源暫時鎖定,待資料同步完成釋放鎖定資源。
- 如果請求資料同步失敗的節點則會返回錯誤資訊,一定不會返回舊資料。
A - Availablility
可用性是指任何事務操作都可以得到響應結果,且不會出現響應超時或響應錯誤。
如何實現可用性?
- 寫入主資料庫後要將資料同步到從資料庫。
- 由於要保證從資料庫的可用性,不可將從資料庫中的資源進行鎖定。
- 即使資料還沒有同步過來,從資料庫也要返回查詢到的資料,哪怕是舊資料,如果連舊資料也沒有則可以按照約定返回一個預設資訊,但不能返回錯誤或響應超時。
分散式系統可用性的特點:
- 所有請求都有響應,且不會出現響應超時或響應錯誤。
P - Partition tolerance
通常分散式系統的各個節點部署在不同的子網,這就是網路分割槽,不可避免的會出現由於網路問題而導致節點之間通訊失敗,此時仍可對外提供服務,這叫分割槽容忍性。
如何實現分割槽容忍性?
- 儘量使用非同步取代同步操作,例如使用非同步方式將資料從主資料庫同步到從資料庫,這樣節點之間能有效的實現鬆耦合。
- 新增從資料庫節點,其中一個從節點掛掉,其它從節點提供服務。
分散式系統分割槽容忍性特點:
- 分割槽容忍性是分散式系統具備的基本能力。
CAP組合方式
在所有分散式事務場景中不會同時具備CAP三個特性,因為在具備了P的前提下C和A是不能共存的。
本圖分割槽容忍的含義是:
- 主資料庫通過網路向從資料庫同步資料,可以認為主從資料庫部署在不同的分割槽,通過網路進行互動。
- 當主資料庫和從資料庫之間的網路出現問題不影響主資料庫和從資料庫對外提供服務。
- 其一個節點掛掉不影響另一個節點對外提供服務。
如果要實現C則必須保證資料一致性,在資料同步的時候為防止從資料庫查詢不一致的資料則需要將從資料庫資料鎖定,待同步完成後解鎖,如果同步失敗從資料庫要返回錯誤資訊或超時資訊。
如果要實現A則必須保證資料可用性,不管任何時候都可以向從資料庫查詢資料即不會響應超時或返回錯誤資訊。
通過分析發現在滿足P的前提下C和A存在矛盾性。
組合方式:
-
AP :
放棄一致性,追求分割槽容忍性和可用性。這是很多分散式系統設計時的選擇。
例如:上邊的商品管理,完全可以實現AP,前提是隻要使用者可以接受所查詢到的資料在一定時間內不是最新的即可。
通常實現AP都會保證最終一致性,BASE理論就是根據AP擴充套件來的,有一些業務場景比如“訂單退款,今日退款成功,明日賬戶到賬,只要使用者可以接受在一定時間內到賬即可。
-
CP:
放棄可用性,追求一致性和分割槽容錯性,zookeeper其實就是追求的強一致,又比如跨行轉賬,一次轉賬請求要等待對方銀行系統都完成整個事務才算完成。
-
CA:
放棄分割槽容忍性,即不進行分割槽,不考慮由於網路不通或節點掛掉的問題,則可以實現一致性和可用性。那麼系統將不是一個標準的分散式系統,我們最常用的關係型資料就滿足了CA。
主資料庫和從資料庫中間不再進行資料同步,資料庫可以響應每次的查詢請求,通過事務隔離級別實現每個查詢請求都可以返回最新的資料。