分布式CAP理論

2021-08-15 04:00:08 字數 1335 閱讀 9718

根據維基百科定義【cap】

根據定理,乙個分布式系統最多只能滿足其中兩項, 不可能同時滿則c-a-p三項

首先說一下對各項原則的理解:

(1)一致性c: 

單機環境下, 資料只有乙份,所有的客戶端訪問的是同乙份資料,不會出現兩個客戶端看到不一樣的資料;分布式環境下,同乙份資料會儲存在多台伺服器上,大量客戶端來訪問資料,負載會分布在各個伺服器上,兩個不同的客戶端c1,c2可能訪問的是不同的兩台伺服器s1,s2, 如果s1,s2上當前資料完全一樣,c1,c2會拿到同樣的資料,滿足一致性;而要保證每個時刻s1,s2上的資料完全一樣,在每次對資料更新的時候,就必須等待c1,c2都完成了資料更新, 該次資料更新操作才能成功返回。

(2)可用性a:

可用性要求所有的讀寫請求必須在一定的時間得到響應,可以終止,但是不可以一直等待。在單機環境中,如果服務沒問題,讀寫服務可以很快返回,如果伺服器掛掉,也可以很容易做到返回響應。但是在分布式環境中,乙個寫請求達到某乙個伺服器,該服務更新資料後還得和集群中其他伺服器同步資料,使得各個伺服器資料一致, 但是網路是不可控的,可能某些伺服器之間的網路出現故障導致更新請求無法送達,或者更新完成ack無法返回,這個時候就要選擇是直接返回,還是等待更新成功。

(3)分割槽容錯性p:

分割槽容錯性要求在發生網路分割槽的情況下,被分割的節點仍能對外提供服務。單機環境下不會發生網路分割槽,分布式環境下,任意時刻,當前環境下各個伺服器的資料即使存在不一致,也要系統能正常對外提供服務。這就會導致一問題,多個客戶端訪問不同的伺服器,由於資料不一致,會存在對同乙份資料的訪問,得到不同的結果(也就是違背了一致性原則)。

為什麼不能同時滿足cap?

(1)假設當前分布式系統滿足ca,c要求各個客戶端讀到的資料必須是一致的,考慮發生網路分割槽的情況,當前各個伺服器存在資料不一致,那麼根據c系統是不可以對外提供服務的(因為不同的客戶端訪問同乙份資料會得到不同的結果),那麼也就無法滿足分割槽容錯性p。

(2)假設當前分布式系統滿足cp, 在網路發生分割槽的情況下,為達到c, 請求只能一直等待,等待網路分割槽情況解除,系統資料同步完成才能返回,這就無法滿足可用性a。

(3)假設當前分布式系統滿足ap, 系統要求在一定的時間內就要返回,在發生網路分割槽的情況下,為了保證p,即使出現網路分割槽也要正常提供服務,按時返回資料,可能不同客戶端訪問同乙份資料得到不同的結果,這就不能保證資料的一致性c。

總結:(1)分布式環境下的cap理論無法同時滿足,一般根據業務需要滿足其中兩個

(2)一些分布式一致性服務,比如zookeeper,犧牲一致性來保證集群的穩定性和可用性,它們無法做到強一致性,但是可以達到最終一致性。

分布式理論CAP學習

前言 今天背面試題,看到了zookeeper和eureka的區別,看到了cap原則 尷尬了zookeeper 之前學kafka的使用配置過zookeeper集群,但是忘得差不多了 之前使用這些服務註冊的時候並沒有看什麼原理,倒是能夠直接上手,以後還是多看看原理吧,不浮在表面了分布式cap定理,為什麼...

分布式系統 CAP理論

cp 天貓雙十一下單搶購,要保證一致性,沒貨了下單失敗 一般來說,如果不需要儲存服務級別的資訊,且服務例項是通過 nacos client 註冊,並能夠保證心跳上報,那麼就可以選擇 ap 模式。當前主流的服務如 spring cloud 和 dubbo 服務,都適用於 ap 模式,ap模式為了服務的...

分布式系統CAP理論

c是一致性,a是可用性,p是分割槽容錯。前兩個沒什麼好說的,主要是p我不太清楚。然後我看文章中最後的證明,有點明白了。分割槽是指兩個伺服器之間傳送資訊失敗。而分割槽容錯就是系統允許發生這種兩個伺服器之間無法傳輸資料的情況。也就是說c和a如果算是正面的 好的性質,那麼p就是負面的 壞的性質。那為什麼允...