為什麼CAP不能同時滿足

2021-10-08 13:27:21 字數 1447 閱讀 7987

根據維基百科定義【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,能否也滿足p?

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

(2)當前滿足cp,能否也滿足a?

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

(3)當前滿足ap,能否也滿足c?

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

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

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

分布式CAP定理,為什麼不能同時滿足三個特性

在弄清楚這個問題之前,我們先了解一下什麼是分布式的cap定理。all nodes see the same data at the same time 即更新操作成功並返回客戶端後,所有節點在同一時間的資料完全一致,這就是分布式的一致性。一致性的問題在併發系統中不可避免,對於客戶端來說,一致性指的是...

為什麼手機不能同時連線多個WiFi訊號

大多是智慧型手機使用者都知道,同乙個手機不能同時連線多個wifi。wifi是智慧型手機連線無線網路的技術,智慧型手機在連線到無線網路通常是有密碼保護的,使用者也可以選擇開放。那麼問題來了,為什麼現在智慧型手機不能同時連線多個wifi?無線網路上網簡單的說就是進行無線上網,現在大多是智慧型裝置都支援無...

為什麼中斷不能休眠

1.中斷處理的時候,不應該發生程序切換,因為在中斷context中,唯一能打斷當前中斷handler的只有更高優先順序的中斷,它不會被程序打斷 這點對 於softirq,tasklet也一樣,因此這些bottom half也不能休眠 如果在中斷context中休眠,則沒有辦法喚醒它,因為所有的 wa...