2021-2-22:請你說下 CAP 理論並舉例

CAP

CAP 理論是分佈式系統中的一個老生常談的理論了,最先由 Eric Brewer一個講座中提出。在這個講座中,在傳統 ACID 理論以及當時比較流行可是比較抽象的的設計指導理論 BASE 理論(當時的 BASE 理論還很抽象,直到好幾年後纔出現一份比較權威的被普遍接受的 BASE 理論完整解釋和設計)的類比中,提出數據庫

  • C(Consistency,一致性):在一個分佈式的系統中,同一個數據全部備份,在同一時刻是否有相同的值。也就是,對於同一個數據的讀寫,是否馬上對於全部副本都能看到一致的結果。一種比較常見的強一致性實現就是,在看到一致的結果以前,寫請求不返回,讀請求阻塞或者超時。
  • A(Availability,可用性):在集羣中一些節點故障時,集羣還能夠響應讀寫請求
  • P(Partition-tolerance,分區容忍性):分佈式系統具備多個節點,若是節點間網絡中斷,就會形成分區

而且提出了,CAP 並不能所有知足,而是通常選兩個知足編程

以後,Seth Gilbert 以及 Nancy Lynch一篇 Notes 中,證實了 CAP 並不能同時都知足。而且,將 CAP 定義的更加清晰:瀏覽器

  • C: 須要知足原子一致性,也就是任何讀寫都是具備原子性的,也就是對於同一個數據的寫以後的讀取,必定能讀取到寫的值,也就是最新的值
  • A:對於全部成功的請求,都須要在有限的時間內返回,也就是成功請求是有效的,可終止的。
  • P:可能節點間傳輸丟失一些消息

CA 系統

也就是不容許分區的系統,也其實就不是分佈式系統,而是單機系統。例如單機數據庫,或者是共享存儲數據庫,好比 Aurora DB 相似的思路設計的數據庫,共享同一份存儲,上面創建不一樣的 MySQL 進程,一個 MySQL 讀寫,其餘的只讀,因爲使用的同一塊存儲,而且只有一個 MySQL 進程寫入,知足 ACID 的事務特性,能保證強一致性,以及可用性。緩存

CP 系統

也就是不要求高可用性,可是要求強一致性的系統,哪怕當前業務不可用,也不能出現數據不一致的狀況。而且,若是節點間傳輸消息丟失致使沒有同步成功,或者重試,或者返回更新失敗,回滾更新請求微信

CP 的一種實際應用就是分佈式鎖,通常的,若是沒有獲取到鎖,或者獲取鎖失敗,咱們都會選擇阻塞等待,或者直接失敗,而不會冒着可能會有併發危險而去執行業務。而且,分佈式鎖必須保持全部節點看到的鎖狀態一致,不能有差別,不然認爲獲取鎖失敗。網絡

同時,大部分分佈式數據庫都是 CP 系統,可是他們的一致性協議方案是不一樣的,常見的例如 Paxos,2PC,3PC,RAFT等等。併發

AP 系統

也就是要求高可用性,可是不用強一致性的系統。在這種狀況下,一旦分區發生,節點間的數據可能不一致,每一個節點用本身的本地數據繼續提供服務。這樣狀況下,可能會出現數據不一致,系統通常會實現最終一致性。也就是在分區結束後,經過一些機制將數據同步。分佈式

基本上具備多層緩存的系統,都是 AP 的系統設計。例如 DNS,客戶端緩存,瀏覽器緩存以及進程內緩存等等。ide

一個 CP 與 AP 系統的對比

一個比較經典的例子就是 Zookeeper 做爲註冊中心和 Eureka 做爲註冊中心。設計

假設註冊中心有兩個接口,一個是註冊實例,一個是讀取實例。

若是以 Zookeeper 爲註冊中心,對於註冊實例請求也就是更新請求,採用的是過半寫以及 2 PC 的同步機制。
image

只有過半 2PC 更新成功,這個註冊請求才成功,這樣讀取每一個節點都會讀取到這個更新請求,不然會回滾已經更新的節點。而且每一個節點數據是一致的。若是過半的節點不可用,那麼整個集羣都不能處理註冊實例請求以及讀取實例的請求。這樣保證的強一致性,可是可用性是打了折扣的。

若是以 Eureka 爲註冊中心,註冊請求發到一個 Eureka 實例上以後,這個 Eureka 會轉發到集羣內其餘 Eureka 節點。

image

即便某些節點失敗,也不會將已經更新的回滾。而且不管集羣內哪些 Eureka 掛了,也不會影響其餘正常的 Eureka 繼續服務工做,雖然可能讀取到比較老的數據,以及有一些數據不一致。

目前的 CAP 理論

隨着技術的不斷髮展以及理論的不斷完善,咱們發現,分區並非會常常出現的狀況,大部分狀況下,若是咱們忽略 P ,其實就是能夠實現 CA 共存的狀況。若是分區是能夠感知的,納悶咱們能夠提早制定響應策略,例如進入服務降級限制某些操做,經過恢復補償邏輯修正數據不一致。

在 CAP 基礎上演變的 PACELC 理論,就是針對這種狀況的更爲實際的指導意見。在出現分區的狀況下,取前半部分,其實仍是 CAP 理論。若是不出現分區的狀況,也就是大部分的狀況下,咱們考慮 L(Latency,延遲) 與 C(Consistency 一致性)的權衡。

微信搜索「個人編程喵」關注公衆號,每日一刷,輕鬆提高技術,斬獲各類offer

image

相關文章
相關標籤/搜索