分布式系統(tǒng)-CAP理論

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ū)容錯性這三個基本需求欣除,最多只能同時滿足其中的兩個∨猜裕‘

分布式系統(tǒng)-CAP理論.png

一致性和可用性的爭論主要表現(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ū)之間的通信可能通信失敗萌抵。

分布式系統(tǒng)-CAP理論為什么不能同時滿足.png
  1. 從圖中可以看出找御,數(shù)據(jù)庫有兩個節(jié)點(diǎn),兩個節(jié)點(diǎn)中age都等于1绍填。

  2. 此時寫請求發(fā)送給DB1霎桅,將age的值改成2,但由于網(wǎng)絡(luò)分區(qū)出現(xiàn)了異常讨永,同步到DB2的時候同步失敗了滔驶。

  3. 最后有個讀請求,從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ù)一致性竿音。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市拴驮,隨后出現(xiàn)的幾起案子谍失,更是在濱河造成了極大的恐慌,老刑警劉巖莹汤,帶你破解...
    沈念sama閱讀 217,542評論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件快鱼,死亡現(xiàn)場離奇詭異,居然都是意外死亡纲岭,警方通過查閱死者的電腦和手機(jī)抹竹,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,822評論 3 394
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來止潮,“玉大人窃判,你說我怎么就攤上這事±ⅲ” “怎么了袄琳?”我有些...
    開封第一講書人閱讀 163,912評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長燃乍。 經(jīng)常有香客問我唆樊,道長,這世上最難降的妖魔是什么刻蟹? 我笑而不...
    開封第一講書人閱讀 58,449評論 1 293
  • 正文 為了忘掉前任逗旁,我火速辦了婚禮,結(jié)果婚禮上舆瘪,老公的妹妹穿的比我還像新娘片效。我一直安慰自己,他們只是感情好英古,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,500評論 6 392
  • 文/花漫 我一把揭開白布淀衣。 她就那樣靜靜地躺著,像睡著了一般召调。 火紅的嫁衣襯著肌膚如雪膨桥。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,370評論 1 302
  • 那天某残,我揣著相機(jī)與錄音国撵,去河邊找鬼陵吸。 笑死玻墅,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的壮虫。 我是一名探鬼主播澳厢,決...
    沈念sama閱讀 40,193評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼环础,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了剩拢?” 一聲冷哼從身側(cè)響起线得,我...
    開封第一講書人閱讀 39,074評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎徐伐,沒想到半個月后贯钩,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,505評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡办素,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,722評論 3 335
  • 正文 我和宋清朗相戀三年角雷,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片性穿。...
    茶點(diǎn)故事閱讀 39,841評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡勺三,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出需曾,到底是詐尸還是另有隱情吗坚,我是刑警寧澤,帶...
    沈念sama閱讀 35,569評論 5 345
  • 正文 年R本政府宣布呆万,位于F島的核電站商源,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏谋减。R本人自食惡果不足惜炊汹,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,168評論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望逃顶。 院中可真熱鬧讨便,春花似錦、人聲如沸以政。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,783評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽盈蛮。三九已至废菱,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間抖誉,已是汗流浹背殊轴。 一陣腳步聲響...
    開封第一講書人閱讀 32,918評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留袒炉,地道東北人旁理。 一個月前我還...
    沈念sama閱讀 47,962評論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像我磁,于是被迫代替她去往敵國和親孽文。 傳聞我的和親對象是個殘疾皇子驻襟,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,781評論 2 354

推薦閱讀更多精彩內(nèi)容