前言
目前網(wǎng)絡(luò)上介紹CAP理論及BASE理論的文章已經(jīng)很多了,但很多文章內(nèi)容都在重復(fù),而且并不嚴(yán)謹(jǐn)。比如分布式系統(tǒng)一定要具備分區(qū)容忍性P,真的是這樣嗎,我們就不能夠選擇CA嗎?
本文將先介紹CAP理論及BASE理論的基本概念,然后總結(jié)下本文并談?wù)勛约簩?duì)分布式系統(tǒng)理論的思考。希望閱讀本文能夠?qū)Υ蠹矣兴鶐椭?/p>
CAP理論
分布式系統(tǒng)的CAP理論是由Eric Brewer于1999年首先提出的,CAP是對(duì)Consistency(一致性)、Availability(可用性)、Partition tolerance(分區(qū)容忍性)的一種簡稱,如下圖所示:

具體含義如下:
一致性(C):指強(qiáng)一致性,在分布式系統(tǒng)中的同一數(shù)據(jù)有多個(gè)副本的情形下,對(duì)于數(shù)據(jù)的更新操作體現(xiàn)出的效果與只有單份數(shù)據(jù)是一樣的。要求數(shù)據(jù)被一致地更新,所有數(shù)據(jù)變動(dòng)都是同步的。
可用性(A):客戶端在任何時(shí)刻對(duì)大規(guī)模數(shù)據(jù)系統(tǒng)的讀/寫操作都應(yīng)該保證在限定延時(shí)內(nèi)完成。即系統(tǒng)在面對(duì)各種異常時(shí),依然可以響應(yīng)客戶端的讀/寫請(qǐng)求并提供正常服務(wù)。
分區(qū)容忍性(P):以實(shí)際效果而言,分區(qū)相當(dāng)于對(duì)通信的時(shí)限要求。系統(tǒng)如果不能在時(shí)限內(nèi)達(dá)成數(shù)據(jù)一致性,就意味著發(fā)生了分區(qū)的情況(分布式系統(tǒng)一定會(huì)發(fā)生分區(qū)的情況的,因?yàn)榇嬖诰W(wǎng)絡(luò)中斷、消息丟失等網(wǎng)絡(luò)問題)。分區(qū)容忍性即指在網(wǎng)絡(luò)中斷、消息丟失的情況下,系統(tǒng)照樣能夠工作。
Eric Brewer在提出CAP概念的同時(shí),也證明了CAP定理:任何分布式系統(tǒng)在可用性、一致性、分區(qū)容忍性方面,不可能同時(shí)被滿足,最多只能得其二。該定理也被稱作布魯爾定理(Brewer's theorem)。任何分布式系統(tǒng)的設(shè)計(jì)只是在C、A、P三者中的不同取舍而已,要么AP,要么CP,要么AC,但是不存在CAP同時(shí)存在的情況,這就是CAP定理的精髓所在。在網(wǎng)絡(luò)環(huán)境下,運(yùn)行環(huán)境出現(xiàn)網(wǎng)絡(luò)分區(qū)/分割一般是不可避免的,所以分布式系統(tǒng)一般必須具備分區(qū)容忍性P。因此,在設(shè)計(jì)分布式系統(tǒng)時(shí),架構(gòu)師一般在C和A之間進(jìn)行權(quán)衡和選擇,即要么CP,要么AP。當(dāng)然,如果系統(tǒng)要求為強(qiáng)事務(wù)型,比如面向網(wǎng)上支付等金融交易,我們也可以選擇CA,支付寶的OceanBase就是如此。
為了進(jìn)一步理解CAP定理,我們來看一個(gè)簡單的例子:假定在分布式系統(tǒng)中有兩個(gè)節(jié)點(diǎn)m1和m2,分別存儲(chǔ)數(shù)據(jù)a的副本,作用在m1上的更新操作將數(shù)據(jù)a從v1更新成v2。該系統(tǒng)具備分區(qū)容忍性P,假定現(xiàn)在系統(tǒng)發(fā)生了故障,m1和m2之間的網(wǎng)絡(luò)斷開了,考慮以下兩種情況:-
情況一:若要保證一致性C,則要求數(shù)據(jù)a的所有副本必須一致,即保證m2上的數(shù)據(jù)a也被更新為v2而與m1同步。而此時(shí)由于發(fā)生網(wǎng)絡(luò)故障,m1與m2無法進(jìn)行通信,進(jìn)而無法將數(shù)據(jù)a同步到一致狀態(tài)。這樣,對(duì)于m2上數(shù)據(jù)a的讀請(qǐng)求必然要被拒絕,因此無法保證系統(tǒng)的可用性A。此種情況下,我們選擇了CAP中的CP而放棄了A,如下圖所示:
系統(tǒng)選擇CP的情況 -
情況二:若要保證可用性A,那么對(duì)于m2上數(shù)據(jù)a的讀請(qǐng)求必須在限定時(shí)間內(nèi)返回。在網(wǎng)絡(luò)故障尚未解決之前,m1和m2無法進(jìn)行通信,此時(shí)m2返回的a指為v1,而并非是當(dāng)前數(shù)據(jù)a的最新狀態(tài)v2,即出現(xiàn)了數(shù)據(jù)的不一致狀態(tài),因此無法保證系統(tǒng)的一致性C。此種情況下,我們選擇了CAP中的AP而放棄了C,如下圖所示:
系統(tǒng)選擇AP的情況
但是,如果我們的系統(tǒng)是強(qiáng)事務(wù)型,即實(shí)現(xiàn)了CA,那又是什么情況呢?
-
情況三:如果系統(tǒng)實(shí)現(xiàn)的是CA,答案很簡單,因?yàn)橄到y(tǒng)放棄了P,所以當(dāng)網(wǎng)絡(luò)發(fā)生故障時(shí),將數(shù)據(jù)a從v1更新成v2的操作根本就不會(huì)成功(這里回顧一下分區(qū)容忍性的概念,當(dāng)網(wǎng)絡(luò)發(fā)生分區(qū)時(shí),系統(tǒng)依然可用,我們這里放棄了P,所以更新操作將不會(huì)成功),所以在系統(tǒng)實(shí)現(xiàn)CA的情況下,數(shù)據(jù)a將還是v1,系統(tǒng)依然是一致地、可用的,因?yàn)槟阕x操作還能給你正確返回,如下圖所示:
系統(tǒng)選擇CA的情況
綜上可知,對(duì)于一個(gè)分布式系統(tǒng)來說,C、A、P三者不可兼得。
BASE理論
對(duì)于很多互聯(lián)網(wǎng)應(yīng)用來說,對(duì)一致性的要求可以降低,而可用性的要求則更為重要,從而產(chǎn)生了弱一致性的BASE理論。BASE理論是基于CAP理論逐步演化而來的,其核心思想是即使不能達(dá)到強(qiáng)一致性,也可以根據(jù)應(yīng)用特點(diǎn)采用適當(dāng)?shù)姆椒▉磉_(dá)到最終一致性的效果。BASE是Basically Available(基本可用)、Soft state(軟狀態(tài)/柔性狀態(tài))、Eventually consistent(最終一致性)三個(gè)詞組的簡寫,是對(duì)CAP中C和A的延伸。
BASE理論的含義如下:
- 基本可用:在絕大多數(shù)時(shí)間內(nèi)系統(tǒng)處于可用狀態(tài),允許偶爾的失敗。
- 軟狀態(tài)/柔性狀態(tài):數(shù)據(jù)狀態(tài)不要求在任意時(shí)刻都完全保持同步,即狀態(tài)可以有一段時(shí)間不同步。
- 最終一致性:與強(qiáng)一致性相比,最終一致性是一種弱一致性。盡管軟狀態(tài)不要求任意時(shí)刻數(shù)據(jù)保持一致同步,但是最終一致性要求在給定時(shí)間窗口內(nèi)數(shù)據(jù)會(huì)達(dá)到一致狀態(tài)。
以上就是BASE理論的基本概念,可見BASE理論強(qiáng)調(diào)的是系統(tǒng)的高可用,允許系統(tǒng)在一定時(shí)間內(nèi)存在數(shù)據(jù)不一致,但在給定的時(shí)間窗口內(nèi),系統(tǒng)最終一定是要達(dá)到一致狀態(tài)的。
總結(jié)及思考
系統(tǒng)從集中式發(fā)展到分布式,一部分原因在于單機(jī)無法滿足日益龐大的數(shù)據(jù)的存儲(chǔ)與處理,而引入分布式后,我們又不得不面對(duì)分布式系統(tǒng)中的網(wǎng)絡(luò)問題。
分布式系統(tǒng)CAP理論及BASE理論可以說是分布式系統(tǒng)設(shè)計(jì)的基石,這些基本理論對(duì)于深入理解分布式環(huán)境下技術(shù)方案設(shè)計(jì)選型具有重要的指導(dǎo)作用。而其中BASE理論也可以說是對(duì)CAP理論的一種擴(kuò)展,通過系統(tǒng)的軟狀態(tài),最終一致性的特點(diǎn),婉轉(zhuǎn)的實(shí)現(xiàn)了CAP三者的結(jié)合。
最后,對(duì)于我們大多數(shù)人來講可能并沒有機(jī)會(huì)參與到分布式系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)當(dāng)中,但了解分布式系統(tǒng)理論也能夠幫助我們更好的理解分布式系統(tǒng)的設(shè)計(jì)理念,能夠幫助我們更好的選擇與使用分布式系統(tǒng)的產(chǎn)品。
如果文章對(duì)你有幫助,歡迎點(diǎn)贊及打賞,如有不足,也歡迎指正。
近期讀了Eric Brewer教授關(guān)于CAP理論在當(dāng)前技術(shù)體系下的新思考,對(duì)分布式系統(tǒng)下的相關(guān)理論又有了更深的思考,文章的核心思想應(yīng)該是將CAP 實(shí)踐應(yīng)針對(duì)具體的應(yīng)用,在合理范圍內(nèi)最大化數(shù)據(jù)一致性和可用性的‘合力’,通過規(guī)劃分區(qū)期間的操作和分區(qū)之后的恢復(fù)來使CAP三者之間達(dá)到一定的平衡。
最后附上文章鏈接:https://www.infoq.cn/article/cap-twelve-years-later-how-the-rules-have-changed。
寫在最后
聊技術(shù),不止于技術(shù)。
歡迎大家關(guān)注我的個(gè)人公眾號(hào):WU雙,在這里我會(huì)與大家分享技術(shù)文章、管理知識(shí)以及個(gè)人的一些思想感悟。


