CAP理論由Eric Brewer在ACM PODC會(huì)議上的主題報(bào)告中提出,這個(gè)理論是NoSQL數(shù)據(jù)管理系統(tǒng)構(gòu)建的基礎(chǔ),如下圖所示:
▲CAP理論
其中字母“C”、“A”、“P”分別代表以下三個(gè)特征:
·強(qiáng)一致性(Consistency)。系統(tǒng)在執(zhí)行過(guò)某項(xiàng)操作后仍然處于一致的狀態(tài)。在分布式系統(tǒng)中,更新操作執(zhí)行成功后所有的用戶都應(yīng)該讀取到最新的值,這樣的系統(tǒng)被認(rèn)為具有強(qiáng)一致性。
·可用性(Availability)。每一個(gè)操作總是能夠在一定的時(shí)間內(nèi)返回結(jié)果,這里需要注意的是“一定時(shí)間內(nèi)”和“返回結(jié)果”。
“一定時(shí)間內(nèi)”是指,系統(tǒng)的結(jié)果必須在給定時(shí)間內(nèi)返回,如果超時(shí)則被認(rèn)為不可用。這是至關(guān)重要的。比如通過(guò)網(wǎng)上銀行的網(wǎng)絡(luò)支付功能購(gòu)買物品。當(dāng)?shù)却撕荛L(zhǎng)時(shí)間,如15分鐘,系統(tǒng)還是沒(méi)有返回任務(wù)操作結(jié)果,購(gòu)買者一直處于等待狀態(tài),那么購(gòu)買者就不知道現(xiàn)在是否支付成功,還是需要進(jìn)行其他操作。這樣當(dāng)下次購(gòu)買者再次使用網(wǎng)絡(luò)支付功能時(shí)必將心有余悸。
“返回結(jié)果”同樣非常重要。還是拿這個(gè)例子來(lái)說(shuō),假如購(gòu)買者點(diǎn)擊支付之后很快出現(xiàn)了結(jié)果,但是結(jié)果卻是“java.lang.error……”之類的錯(cuò)誤信息。這對(duì)于普通購(gòu)買者來(lái)說(shuō)相當(dāng)于沒(méi)有返回任何結(jié)果。因?yàn)樗耘f不知道系統(tǒng)處于什么狀態(tài),是支付成功還是失敗,或者需要重新操作。
·分區(qū)容錯(cuò)性(Partition Tolerance)。分區(qū)容錯(cuò)性可以理解為系統(tǒng)在存在網(wǎng)絡(luò)分區(qū)的情況下仍然可以接受請(qǐng)求(滿足一致性和可用性)。這里網(wǎng)絡(luò)分區(qū)是指由于某種原因網(wǎng)絡(luò)被分成若干個(gè)孤立的區(qū)域,而區(qū)域之間互不相通。還有一些人將分區(qū)容錯(cuò)性理解為系統(tǒng)對(duì)節(jié)點(diǎn)動(dòng)態(tài)加入和離開(kāi)的處理能力,因?yàn)楣?jié)點(diǎn)的加入和離開(kāi)可以認(rèn)為是集群內(nèi)部的網(wǎng)絡(luò)分區(qū)。
CAP是在分布式環(huán)境中設(shè)計(jì)和部署系統(tǒng)時(shí)所要考慮的三個(gè)重要的系統(tǒng)需求。根據(jù)CAP理論,數(shù)據(jù)共享系統(tǒng)只能滿足這三個(gè)特性中的兩個(gè),而不能同時(shí)滿足三個(gè)條件。因此系統(tǒng)設(shè)計(jì)者必須在這三個(gè)特性之間做出權(quán)衡。例如Amazon的Dynamo具有高可用性和分區(qū)容錯(cuò)性但不支持強(qiáng)一致性,也就是說(shuō)用戶不能立即看到其他用戶更新的內(nèi)容。
下面通過(guò)圖示來(lái)解釋數(shù)據(jù)共享系統(tǒng)為什么不能同時(shí)滿足CAP理論三個(gè)條件。
如下圖所示,在網(wǎng)絡(luò)中有兩個(gè)節(jié)點(diǎn)分別為G1和G2,這兩個(gè)節(jié)點(diǎn)上存儲(chǔ)著同一數(shù)據(jù)的不同副本,現(xiàn)在數(shù)據(jù)是一致的,兩個(gè)副本的值都為V0,A、B分別是運(yùn)行在G1、G2上與數(shù)據(jù)交互的應(yīng)用程序。
▲網(wǎng)絡(luò)節(jié)點(diǎn)及數(shù)據(jù)分布圖
在正常情況下,操作過(guò)程如下(如下圖所示):
(1)A將V0更新,數(shù)據(jù)值為V1;
(2)G1發(fā)送消息m給G2,數(shù)據(jù)V0更新為V1;
(3)B讀取到G2中的數(shù)據(jù)V1。
▲正常情況
如果發(fā)生網(wǎng)絡(luò)分區(qū)故障,那么在操作的步驟(2)將發(fā)生錯(cuò)誤:G1發(fā)送的消息不能傳送到G2上。這樣數(shù)據(jù)就處于不一致的狀態(tài),B讀取到的就不是最新的數(shù)據(jù),如圖2-3所示。如果我們采用一些技術(shù)如阻塞、加鎖、集中控制等來(lái)保證數(shù)據(jù)的一致,那么必然會(huì)影響到系統(tǒng)的可用性和分區(qū)容錯(cuò)性。
▲網(wǎng)絡(luò)分區(qū)故障
CAP理論告訴我們?nèi)绻到y(tǒng)具有較高的可用性和較小延遲,那么節(jié)點(diǎn)必須能夠容忍網(wǎng)絡(luò)分區(qū),但這時(shí)候應(yīng)用程序可能會(huì)得到不同的數(shù)據(jù)(B讀取到的值為V1)。
有人可能會(huì)想,如果我們對(duì)步驟(2)的操作加一個(gè)同步消息,問(wèn)題會(huì)不會(huì)解決呢(同時(shí)滿足CAP理論三個(gè)特性)?答案是否定的。不加同步的情況下,G1到G2的更新是不可知的,也就是說(shuō),B讀取到得數(shù)據(jù)可能是V1也可能是V2,但是服務(wù)是可用的。即同時(shí)滿足了“A”和“P”,但是不保證“C”一定滿足。加了同步消息之后,將能夠保證B讀取到數(shù)據(jù)V1。但是這個(gè)同步操作必定要消耗一定的時(shí)間,尤其是在網(wǎng)絡(luò)規(guī)模較大的情況下,當(dāng)節(jié)點(diǎn)規(guī)模成百上千的時(shí)候,不一定能保證此時(shí)的服務(wù)是可用的。這種情況下只能滿足“C”和“P”,而不能保證“A”一定滿足。
CAP理論不但對(duì)此網(wǎng)絡(luò)和通信模型有效,對(duì)其他模型同樣有效,有興趣的讀者可以換其他的網(wǎng)絡(luò)和通信模型來(lái)驗(yàn)證CAP理論。
根據(jù)CAP理論,系統(tǒng)滿足三個(gè)條件中不同的兩個(gè)條件會(huì)具有不同的特點(diǎn),見(jiàn)下表:處理CAP問(wèn)題的選擇。
可以看出,三種不同的組合對(duì)應(yīng)著放棄了CAP三個(gè)特性當(dāng)中的一個(gè)。
·放棄P:如果想避免分區(qū)容錯(cuò)性問(wèn)題的發(fā)生,一種做法是將所有的數(shù)據(jù)(與事務(wù)相關(guān)的)都放到一臺(tái)機(jī)器上。雖然無(wú)法100%地保證系統(tǒng)不會(huì)出錯(cuò),但不會(huì)碰到由分區(qū)帶來(lái)的負(fù)面效果。當(dāng)然,這個(gè)選擇會(huì)嚴(yán)重影響系統(tǒng)的擴(kuò)展性。
·放棄A:相對(duì)于放棄“分區(qū)容錯(cuò)性”來(lái)說(shuō),其反面就是放棄可用性。一旦遇到分區(qū)容錯(cuò)故障,那么受到影響的服務(wù)需要等待數(shù)據(jù)一致,因此在等待期間系統(tǒng)就無(wú)法對(duì)外提供服務(wù)。
·放棄C:這里所說(shuō)的放棄一致性,并不是完全放棄數(shù)據(jù)的一致性,而是放棄數(shù)據(jù)的強(qiáng)一致性,而保留數(shù)據(jù)的最終一致性。以網(wǎng)絡(luò)購(gòu)物為例,對(duì)只剩最后一件庫(kù)存的商品,如果同時(shí)接收到了兩份訂單,那么較晚的訂單將被告知商品售罄。
·其他選擇:引入BASE(Basically Available, Soft-state, Eventually consistent),該方法支持最終一致性,其實(shí)是放棄C的一個(gè)特例,我們將在后文進(jìn)行介紹。
傳統(tǒng)關(guān)系型數(shù)據(jù)管理系統(tǒng)注重?cái)?shù)據(jù)的強(qiáng)一致性,但是對(duì)于海量數(shù)據(jù)的分布式存儲(chǔ)和處理其性能不能滿足人們的需求,因此現(xiàn)在許多NoSQL數(shù)據(jù)庫(kù)犧牲了強(qiáng)一致性來(lái)提高性能,CAP理論對(duì)于非關(guān)系性數(shù)據(jù)庫(kù)的設(shè)計(jì)有很大的影響并被NoSQL陣營(yíng)所認(rèn)可。
CAP理論已經(jīng)得到人們的普遍認(rèn)同,但是并不是所有人都這樣認(rèn)為,這種不同的聲音主要是因?yàn)閷?duì)CAP的概念有不同的理解所造成的。此外,我們不能說(shuō)一種解決方案在任何時(shí)間任何環(huán)境下永遠(yuǎn)都是正確的,因?yàn)殡S著時(shí)間和環(huán)境的變遷情況將會(huì)有所不同,正如隨著海量數(shù)據(jù)的出現(xiàn),傳統(tǒng)關(guān)系型數(shù)據(jù)庫(kù)已經(jīng)不能完全滿足人們的需求一樣。因此,我們應(yīng)該肯定CAP理論對(duì)海量數(shù)據(jù)管理的研究與發(fā)展所作出的貢獻(xiàn)。