根據維基百科定義【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...