原文鏈接: 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ù)場景定奪兼砖,適合的才是最好的。