CAP基本概念
CAP理論作為分布式系統(tǒng)的基石洲拇,應(yīng)該是每個入門分布式系統(tǒng)的人都應(yīng)該學(xué)習(xí)的內(nèi)容。
CAP理論是2000年7月,加州大學(xué)伯克利分校的Eric Brewer教授在ACM PODC會議上提出CAP猜想爆哑。
2 年以后绘雁,來自麻省理工學(xué)院的 Seth Gilbert 和 Nancy Lynch 從理論上證明了 Eric Brewer 教授的 CAP 猜想是成立的橡疼。
CAP理論分別指的是
Consistency:一致性
Availability:可用性
Partition tolerance:分區(qū)容錯性
CAP理論告訴我們,一個分布式系統(tǒng)不可能同時滿足一致性庐舟、可用性和分區(qū)容錯性這三個基本需求欣除,最多只能同時滿足其中的兩個∨猜裕‘
一致性和可用性的爭論主要表現(xiàn)為ACID和BASE之間的爭論
BASE:可用性優(yōu)先历帚、數(shù)據(jù)一致性其次
ACID(原子性、一致性杠娱、隔離性挽牢、持久性):優(yōu)先數(shù)據(jù)一致性,在必要的時候摊求,可以放棄系統(tǒng)可用性
一致性
一致性指的是all nodes see the same data at the same time
禽拔,即所有節(jié)點(diǎn)在同一時間的數(shù)據(jù)完全一致。
一致性級別
強(qiáng)一致性(Strong Consistency)又被稱為線性一致性(Linearizable Consistency)室叉。
序列一致性(Sequential Consistency)睹栖。
最終一致性(Eventual Consistency)。
在數(shù)據(jù)一致性方面太惠,雖然我們無法實(shí)現(xiàn)強(qiáng)一致性磨淌,但是我們也不要全部放棄疲憋,可以努力去實(shí)現(xiàn)更高的一致性級別凿渊,為系統(tǒng)的服務(wù)提供更好的抽象。
可用性
可用性指Reads and writes always succeed
缚柳,即服務(wù)在正常響應(yīng)時間內(nèi)一直可用埃脏,要求系統(tǒng)提供的服務(wù)必須處于100%可用的狀態(tài),對于用戶的每一個操作請求秋忙,系統(tǒng)總能夠在有限的時間內(nèi)返回結(jié)果
但是彩掐,在我們的日常工作中,幾乎沒有見過 100% 可用的服務(wù)灰追《掠模可用性指標(biāo)是在 0 到 100% 之間連續(xù)分布的,在我們的系統(tǒng)選擇了 CP 模型的時候弹澎,對于可用性( A )朴下,我們永遠(yuǎn)無法達(dá)到 100%,但是按業(yè)務(wù)要求不斷優(yōu)化苦蒿,是我們努力的目標(biāo)殴胧。
例如,如果按照CAP理論來劃分,etcd屬于CP模型团滥,而在 etcd 系統(tǒng)的實(shí)現(xiàn)中竿屹,如果網(wǎng)絡(luò)沒有出現(xiàn)分區(qū),整個系統(tǒng)是100%可用的灸姊;就算網(wǎng)絡(luò)出現(xiàn)分區(qū)了拱燃,也不會有整個 etcd 系統(tǒng)都不可用的情況。在這時厨钻,超過半數(shù) etcd 實(shí)例所在的網(wǎng)絡(luò)分區(qū)一側(cè)扼雏,系統(tǒng)是正常可用的夯膀,雖然網(wǎng)絡(luò)分區(qū)的另一側(cè)是不可用的诗充,但是整個 etcd 系統(tǒng)的可用性依然可能超過 50%。
分區(qū)容錯性
分區(qū)指的是網(wǎng)絡(luò)分區(qū)诱建,在整個分布式系統(tǒng)中蝴蜓,因?yàn)楦鞣N網(wǎng)絡(luò)原因,系統(tǒng)被分隔成多個單獨(dú)的部分俺猿,可能會出現(xiàn)很多異常情況茎匠,如網(wǎng)絡(luò)丟包導(dǎo)致網(wǎng)絡(luò)不通的情況,節(jié)點(diǎn)宕機(jī)導(dǎo)致網(wǎng)絡(luò)不通的情況押袍。
分區(qū)容錯性指the system continues to operate despite arbitrary message loss or failure of part of the system
诵冒,即分布式系統(tǒng)在遇到某節(jié)點(diǎn)或網(wǎng)絡(luò)分區(qū)故障的時候,仍然能夠?qū)ν馓峁M足一致性或可用性的服務(wù)谊惭。
由于我們面對的就是一個不可靠的網(wǎng)絡(luò)和有一定概率宕機(jī)的設(shè)備汽馋,在分布式系統(tǒng)中,分區(qū)容錯性是一個必選項(xiàng)圈盔。
在分布式系統(tǒng)中豹芯,如果我們的設(shè)計(jì)放棄分區(qū)容錯性,就相當(dāng)于我們認(rèn)為節(jié)點(diǎn)之間的網(wǎng)絡(luò)通信永遠(yuǎn)是好的驱敲,那么我們對節(jié)點(diǎn)之間的遠(yuǎn)程調(diào)用的結(jié)果铁蹈,就不需要處理超時、網(wǎng)絡(luò)地址不可達(dá)等網(wǎng)絡(luò)層錯誤了众眨。但是這樣一來握牧,看似是簡化了系統(tǒng)設(shè)計(jì),實(shí)際卻忽視了超時等網(wǎng)絡(luò)錯誤的情況娩梨。當(dāng)它們出現(xiàn)后沿腰,系統(tǒng)的行為就是未定義的了,可能會出現(xiàn)崩潰姚建,或者是臟數(shù)據(jù)的問題矫俺。
如果在網(wǎng)絡(luò)不出現(xiàn)分區(qū)的時候,我們將數(shù)據(jù)強(qiáng)一致性和 100% 的可用性都選擇,等到網(wǎng)絡(luò)出現(xiàn)分區(qū)的時候厘托,系統(tǒng)再選擇放棄部分的可用性或者降低數(shù)據(jù)一致性的級別友雳。這樣做其實(shí)是可行的,它實(shí)際是將 CAP 理論的選擇铅匹,推遲到出現(xiàn)網(wǎng)絡(luò)分區(qū)的時候押赊,而不是系統(tǒng)一啟動就進(jìn)行 CAP 的選擇。這樣可以大大提高系統(tǒng)的可用性和數(shù)據(jù)一致性包斑,并且系統(tǒng)依然能容忍網(wǎng)絡(luò)分區(qū)流礁。
為什么不能同時滿足
對于CAP理論中,分布式系統(tǒng)要保障整體的服務(wù)罗丰,因此(Partition tolerance)分區(qū)容錯性必然存在神帅。那么為什么CA不能同時存在?因?yàn)榉謪^(qū)之間的通信可能通信失敗萌抵。
從圖中可以看出找御,數(shù)據(jù)庫有兩個節(jié)點(diǎn),兩個節(jié)點(diǎn)中age都等于1绍填。
此時寫請求發(fā)送給DB1霎桅,將age的值改成2,但由于網(wǎng)絡(luò)分區(qū)出現(xiàn)了異常讨永,同步到DB2的時候同步失敗了滔驶。
最后有個讀請求,從DB1中能讀取到正確的值卿闹,但是DB2則會返回不一致的數(shù)據(jù)揭糕。
如果為了保證一致性,則需要讀取的時候阻塞等待比原,直到故障恢復(fù)后DB1的數(shù)據(jù)同步到了DB2的時候插佛。
如果為了可用性杠巡,則需要返回的數(shù)據(jù)是age=1量窘。
案例
案例1-論證Kafka是AP模型還是CP模型
Kafka的開發(fā)人員申明Kafka是CA系統(tǒng),Kafka設(shè)計(jì)是運(yùn)行在一個數(shù)據(jù)中心氢拥,網(wǎng)絡(luò)分區(qū)問題基本不會發(fā)生蚌铜,所以是CA系統(tǒng)。
其實(shí)嫩海,Kafka提供了一些配置冬殃,用戶可以根據(jù)具體的業(yè)務(wù)需求,進(jìn)行不同的配置叁怪,使得Kafka滿足AP或者CP审葬,或者它們之間的一種平衡。
下面這種配置,保證強(qiáng)一致性涣觉,使得Kafka滿足CP痴荐。
replication.factor = 3
min.insync.replicas = 3
acks = all
下面的配置,就主要保證可用性官册,使得Kafka滿足AP生兆。
replication.factor = 3
min.insync.replicas = 3
acks = 1
還有一種配置是公認(rèn)比較推薦的一種配置,使得Kafka滿足的是一種介于AP和CP之間的一種平衡狀態(tài)膝宁。
replication.factor = 3
min.insync.replicas = 2
acks = all
對于這種配置鸦难,其實(shí)Kafka不光可以容忍一個節(jié)點(diǎn)宕機(jī),同時也可以容忍這個節(jié)點(diǎn)和其它節(jié)點(diǎn)產(chǎn)生網(wǎng)絡(luò)分區(qū)员淫,它們都可以看成是Kafka的容錯(Fault tolerance)機(jī)制合蔽。
案例2-論證Google的Spanner是AP模型還是CP模型
Spanner 是一個全球分布式數(shù)據(jù)庫,但是 Google 卻宣稱 Spanner 是一個 CA 系統(tǒng)介返。它運(yùn)行在 Google 的內(nèi)部網(wǎng)絡(luò)中辈末,并且擁有大量冗余的網(wǎng)絡(luò)鏈路、處理相關(guān)故障的架構(gòu)規(guī)劃映皆、以及非常細(xì)致的運(yùn)維挤聘,以此來確保系統(tǒng)的可用性超過了 99.999%。雖然不能達(dá)到 100%捅彻,但是對于使用者來說组去,和可用性 100% 幾乎沒有任何區(qū)別,所以 Spanner 就是一個 CA 系統(tǒng)步淹。
但是在網(wǎng)絡(luò)出現(xiàn)分區(qū)的時候从隆,Spanner 會選擇一致性而不是可用性,就變成CP模型缭裆。
總結(jié)
從上述兩個案例可以看出键闺,對于 CAP 理論,我們不會簡單地三選二或者二選一澈驼。對于 AP 模型的系統(tǒng)辛燥,我們會努力去提升數(shù)據(jù)一致性的級別,而對于 CP 模型的系統(tǒng)缝其,我們會努力去提升系統(tǒng)可用性的級別挎塌。
由于系統(tǒng)分區(qū)的情況非常少見,我們可以在網(wǎng)絡(luò)不出現(xiàn)分區(qū)的時候内边,將 A 和 C 都選擇上榴都;在網(wǎng)絡(luò)出現(xiàn)分區(qū)的時候,再選擇放棄部分的可用性漠其,或者降低數(shù)據(jù)一致性的級別嘴高,通過推遲 CAP 選擇來提高系統(tǒng)的可用性和數(shù)據(jù)一致性竿音。