分布式系統(tǒng)基礎(chǔ)-CAP(轉(zhuǎn))

原文鏈接: http://www.hollischuang.com/archives/666

2000年7月憔足,加州大學(xué)伯克利分校的Eric Brewer教授在ACM PODC會議上提出CAP猜想讥珍。2年后孵坚,麻省理工學(xué)院的Seth Gilbert和Nancy Lynch從理論上證明了CAP病游。之后,CAP理論正式成為分布式計算領(lǐng)域的公認(rèn)定理再扭。

CAP理論概述

一個分布式系統(tǒng)最多只能同時滿足一致性(Consistency)着撩、可用性(Availability)和分區(qū)容錯性(Partition tolerance)這三項中的兩項。

CAP的定義

Consistency 一致性

一致性指“all nodes see the same data at the same time
”沈条,即更新操作成功并返回客戶端完成后需忿,所有節(jié)點在同一時間的數(shù)據(jù)完全一致。分布式的一致性

對于一致性蜡歹,可以分為從客戶端和服務(wù)端兩個不同的視角屋厘。從客戶端來看,一致性主要指的是多并發(fā)訪問時更新過的數(shù)據(jù)如何獲取的問題月而。從服務(wù)端來看汗洒,則是更新如何復(fù)制分布到整個系統(tǒng),以保證數(shù)據(jù)最終一致景鼠。一致性是因為有并發(fā)讀寫才有的問題仲翎,因此在理解一致性的問題時痹扇,一定要注意結(jié)合考慮并發(fā)讀寫的場景铛漓。

從客戶端角度,多進(jìn)程并發(fā)訪問時鲫构,更新過的數(shù)據(jù)在不同進(jìn)程如何獲取的不同策略浓恶,決定了不同的一致性。對于關(guān)系型數(shù)據(jù)庫结笨,要求更新過的數(shù)據(jù)能被后續(xù)的訪問都能看到包晰,這是強(qiáng)一致性。如果能容忍后續(xù)的部分或者全部訪問不到炕吸,則是弱一致性伐憾。如果經(jīng)過一段時間后要求能訪問到更新后的數(shù)據(jù),則是最終一致性赫模。

Availability 可用性

可用性指“Reads and writes always succeed”树肃,即服務(wù)一直可用,而且是正常響應(yīng)時間瀑罗。

對于一個可用性的分布式系統(tǒng)胸嘴,每一個非故障的節(jié)點必須對每一個請求作出響應(yīng)。也就是斩祭,該系統(tǒng)使用的任何算法必須最終終止劣像。當(dāng)同時要求分區(qū)容忍性時,這是一個很強(qiáng)的定義:即使是嚴(yán)重的網(wǎng)絡(luò)錯誤摧玫,每個請求必須終止耳奕。

好的可用性主要是指系統(tǒng)能夠很好的為用戶服務(wù),不出現(xiàn)用戶操作失敗或者訪問超時等用戶體驗不好的情況∥萑海可用性通常情況下可用性和分布式數(shù)據(jù)冗余时迫,負(fù)載均衡等有著很大的關(guān)聯(lián)。

Partition Tolerance分區(qū)容錯性

分區(qū)容錯性指“the system continues to operate despite arbitrary message loss or failure of part of the system”谓晌,即分布式系統(tǒng)在遇到某節(jié)點或網(wǎng)絡(luò)分區(qū)故障的時候掠拳,仍然能夠?qū)ν馓峁M足一致性和可用性的服務(wù)。

分區(qū)容錯性和擴(kuò)展性緊密相關(guān)纸肉。在分布式應(yīng)用中溺欧,可能因為一些分布式的原因?qū)е孪到y(tǒng)無法正常運轉(zhuǎn)。好的分區(qū)容錯性要求能夠使應(yīng)用雖然是一個分布式系統(tǒng)柏肪,而看上去卻好像是在一個可以運轉(zhuǎn)正常的整體姐刁。比如現(xiàn)在的分布式系統(tǒng)中有某一個或者幾個機(jī)器宕掉了,其他剩下的機(jī)器還能夠正常運轉(zhuǎn)滿足系統(tǒng)需求烦味,或者是機(jī)器之間有網(wǎng)絡(luò)異常聂使,將分布式系統(tǒng)分隔未獨立的幾個部分,各個部分還能維持分布式系統(tǒng)的運作谬俄,這樣就具有好的分區(qū)容錯性柏靶。

CAP的證明

如上圖,是我們證明CAP的基本場景溃论,網(wǎng)絡(luò)中有兩個節(jié)點N1和N2屎蜓,可以簡單的理解N1和N2分別是兩臺計算機(jī),他們之間網(wǎng)絡(luò)可以連通钥勋,N1中有一個應(yīng)用程序A炬转,和一個數(shù)據(jù)庫V,N2也有一個應(yīng)用程序B2和一個數(shù)據(jù)庫V∷憔模現(xiàn)在扼劈,A和B是分布式系統(tǒng)的兩個部分,V是分布式系統(tǒng)的數(shù)據(jù)存儲的兩個子數(shù)據(jù)庫菲驴。

在滿足一致性的時候荐吵,N1和N2中的數(shù)據(jù)是一樣的,V0=V0谢翎。在滿足可用性的時候捍靠,用戶不管是請求N1或者N2,都會得到立即響應(yīng)森逮。在滿足分區(qū)容錯性的情況下榨婆,N1和N2有任何一方宕機(jī),或者網(wǎng)絡(luò)不通的時候褒侧,都不會影響N1和N2彼此之間的正常運作良风。

如上圖谊迄,是分布式系統(tǒng)正常運轉(zhuǎn)的流程,用戶向N1機(jī)器請求數(shù)據(jù)更新烟央,程序A更新數(shù)據(jù)庫Vo為V1统诺,分布式系統(tǒng)將數(shù)據(jù)進(jìn)行同步操作M,將V1同步的N2中V0疑俭,使得N2中的數(shù)據(jù)V0也更新為V1粮呢,N2中的數(shù)據(jù)再響應(yīng)N2的請求。

這里钞艇,可以定義N1和N2的數(shù)據(jù)庫V之間的數(shù)據(jù)是否一樣為一致性啄寡;外部對N1和N2的請求響應(yīng)為可用行;N1和N2之間的網(wǎng)絡(luò)環(huán)境為分區(qū)容錯性哩照。這是正常運作的場景挺物,也是理想的場景,然而現(xiàn)實是殘酷的飘弧,當(dāng)錯誤發(fā)生的時候识藤,一致性和可用性還有分區(qū)容錯性,是否能同時滿足次伶,還是說要進(jìn)行取舍呢痴昧?

作為一個分布式系統(tǒng),它和單機(jī)系統(tǒng)的最大區(qū)別学少,就在于網(wǎng)絡(luò)剪个,現(xiàn)在假設(shè)一種極端情況,N1和N2之間的網(wǎng)絡(luò)斷開了版确,我們要支持這種網(wǎng)絡(luò)異常,相當(dāng)于要滿足分區(qū)容錯性乎折,能不能同時滿足一致性和響應(yīng)性呢绒疗?還是說要對他們進(jìn)行取舍。

假設(shè)在N1和N2之間網(wǎng)絡(luò)斷開的時候骂澄,有用戶向N1發(fā)送數(shù)據(jù)更新請求吓蘑,那N1中的數(shù)據(jù)V0將被更新為V1,由于網(wǎng)絡(luò)是斷開的坟冲,所以分布式系統(tǒng)同步操作M磨镶,所以N2中的數(shù)據(jù)依舊是V0;這個時候健提,有用戶向N2發(fā)送數(shù)據(jù)讀取請求琳猫,由于數(shù)據(jù)還沒有進(jìn)行同步,應(yīng)用程序沒辦法立即給用戶返回最新的數(shù)據(jù)V1私痹,怎么辦呢脐嫂?有二種選擇统刮,第一,犧牲數(shù)據(jù)一致性账千,響應(yīng)舊的數(shù)據(jù)V0給用戶侥蒙;第二,犧牲可用性匀奏,阻塞等待鞭衩,直到網(wǎng)絡(luò)連接恢復(fù),數(shù)據(jù)更新操作M完成之后娃善,再給用戶響應(yīng)最新的數(shù)據(jù)V1醋旦。

這個過程,證明了要滿足分區(qū)容錯性的分布式系統(tǒng)会放,只能在一致性和可用性兩者中饲齐,選擇其中一個。

CAP權(quán)衡

通過CAP理論咧最,我們知道無法同時滿足一致性捂人、可用性和分區(qū)容錯性這三個特性,那要舍棄哪個呢矢沿?

CA without P:如果不要求P(不允許分區(qū))滥搭,則C(強(qiáng)一致性)和A(可用性)是可以保證的。但其實分區(qū)不是你想不想的問題捣鲸,而是始終會存在瑟匆,因此CA的系統(tǒng)更多的是允許分區(qū)后各子系統(tǒng)依然保持CA。

CP without A:如果不要求A(可用)栽惶,相當(dāng)于每個請求都需要在Server之間強(qiáng)一致愁溜,而P(分區(qū))會導(dǎo)致同步時間無限延長,如此CP也是可以保證的外厂。很多傳統(tǒng)的數(shù)據(jù)庫分布式事務(wù)都屬于這種模式冕象。

AP wihtout C:要高可用并允許分區(qū),則需放棄一致性汁蝶。一旦分區(qū)發(fā)生渐扮,節(jié)點之間可能會失去聯(lián)系,為了高可用掖棉,每個節(jié)點只能用本地數(shù)據(jù)提供服務(wù)墓律,而這樣會導(dǎo)致全局?jǐn)?shù)據(jù)的不一致性。現(xiàn)在眾多的NoSQL都屬于此類幔亥。

對于多數(shù)大型互聯(lián)網(wǎng)應(yīng)用的場景耻讽,主機(jī)眾多、部署分散紫谷,而且現(xiàn)在的集群規(guī)模越來越大齐饮,所以節(jié)點故障捐寥、網(wǎng)絡(luò)故障是常態(tài),而且要保證服務(wù)可用性達(dá)到N個9祖驱,即保證P和A握恳,舍棄C(退而求其次保證最終一致性)。雖然某些地方會影響客戶體驗捺僻,但沒達(dá)到造成用戶流程的嚴(yán)重程度乡洼。

對于涉及到錢財這樣不能有一絲讓步的場景,C必須保證匕坯。網(wǎng)絡(luò)發(fā)生故障寧可停止服務(wù)束昵,這是保證CA,舍棄P葛峻。貌似這幾年國內(nèi)銀行業(yè)發(fā)生了不下10起事故锹雏,但影響面不大,報到也不多术奖,廣大群眾知道的少礁遵。還有一種是保證CP,舍棄A采记。例如網(wǎng)絡(luò)故障事只讀不寫佣耐。

孰優(yōu)孰略,沒有定論唧龄,只能根據(jù)場景定奪兼砖,適合的才是最好的。

參考資料

CAP和BASE理論
CAP原理的證明

拓展閱讀:

CAP理論

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末既棺,一起剝皮案震驚了整個濱河市讽挟,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌援制,老刑警劉巖戏挡,帶你破解...
    沈念sama閱讀 211,290評論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異晨仑,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)拆檬,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,107評論 2 385
  • 文/潘曉璐 我一進(jìn)店門洪己,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人竟贯,你說我怎么就攤上這事答捕。” “怎么了屑那?”我有些...
    開封第一講書人閱讀 156,872評論 0 347
  • 文/不壞的土叔 我叫張陵拱镐,是天一觀的道長艘款。 經(jīng)常有香客問我,道長沃琅,這世上最難降的妖魔是什么哗咆? 我笑而不...
    開封第一講書人閱讀 56,415評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮益眉,結(jié)果婚禮上晌柬,老公的妹妹穿的比我還像新娘。我一直安慰自己郭脂,他們只是感情好年碘,可當(dāng)我...
    茶點故事閱讀 65,453評論 6 385
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著展鸡,像睡著了一般屿衅。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上莹弊,一...
    開封第一講書人閱讀 49,784評論 1 290
  • 那天涤久,我揣著相機(jī)與錄音,去河邊找鬼箱硕。 笑死拴竹,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的剧罩。 我是一名探鬼主播栓拜,決...
    沈念sama閱讀 38,927評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼惠昔!你這毒婦竟也來了幕与?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,691評論 0 266
  • 序言:老撾萬榮一對情侶失蹤镇防,失蹤者是張志新(化名)和其女友劉穎啦鸣,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體来氧,經(jīng)...
    沈念sama閱讀 44,137評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡诫给,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,472評論 2 326
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了啦扬。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片中狂。...
    茶點故事閱讀 38,622評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖扑毡,靈堂內(nèi)的尸體忽然破棺而出胃榕,到底是詐尸還是另有隱情,我是刑警寧澤瞄摊,帶...
    沈念sama閱讀 34,289評論 4 329
  • 正文 年R本政府宣布勋又,位于F島的核電站苦掘,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏楔壤。R本人自食惡果不足惜鹤啡,卻給世界環(huán)境...
    茶點故事閱讀 39,887評論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望挺邀。 院中可真熱鬧揉忘,春花似錦、人聲如沸端铛。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,741評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽禾蚕。三九已至您朽,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間换淆,已是汗流浹背哗总。 一陣腳步聲響...
    開封第一講書人閱讀 31,977評論 1 265
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留倍试,地道東北人讯屈。 一個月前我還...
    沈念sama閱讀 46,316評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像县习,于是被迫代替她去往敵國和親涮母。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,490評論 2 348

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