CAP定理是這樣描述的:一個分布式系統(tǒng)不可能同時滿足一致性(C:Consistency)创坞、可用性(A:Availability)和分區(qū)容錯性(P:Partition tolerance)這三個基本需求猜绣,最多只能同時滿足其中兩項。
本文主要從以下幾個部分來展開說明:
1善茎、什么是分布式系統(tǒng)以及為什么會受CAP定理限制?
2、什么是CAP?
3钞螟、分布式系統(tǒng)為什么最多同時滿足CAP定理的其中兩項?
一谎碍、什么是分布式系統(tǒng)以及為什么會受CAP定理限制鳞滨?
George Coulouris(《Distributed Systems-Concepts and Design》作者)對分布式系統(tǒng)下了一個簡單的定義:你會知道系統(tǒng)當(dāng)中的某臺電腦崩潰或停止運(yùn)行了,但是你的軟件永遠(yuǎn)不會蟆淀。這句話非常簡單拯啦,但也非常形象地說明了分布式系統(tǒng)的特點。
設(shè)計分布式系統(tǒng)的目的無非就是為了提升系統(tǒng)處理能力熔任、增強(qiáng)系統(tǒng)穩(wěn)定性等SLA(服務(wù)等級協(xié)議)指標(biāo)褒链,但每個系統(tǒng)的SLA指標(biāo)可能都不太一樣,并且每個指標(biāo)對應(yīng)的權(quán)重也不一樣疑苔。比如微博可能更關(guān)注系統(tǒng)的可用性甫匹,數(shù)據(jù)只要最終一致即可,而銀行系統(tǒng)相比可用性則更關(guān)注系統(tǒng)的數(shù)據(jù)一致性。但是分布式系統(tǒng)還是有以下幾個通用的特點:
1兵迅、服務(wù)冗余抢韭。為系統(tǒng)的每種服務(wù)都提供若干冗余備份,當(dāng)正常的服務(wù)出現(xiàn)問題時恍箭,系統(tǒng)啟用冗余備份服務(wù)來接管刻恭,盡量保證每時每刻所有的請求都能夠得到正常的處理。但這同時也帶來了冗余服務(wù)之間的數(shù)據(jù)一致性問題扯夭。
2鳍贾、高可擴(kuò)展性。當(dāng)系統(tǒng)的請求量或者計算量增加時交洗,系統(tǒng)可以通過動態(tài)擴(kuò)展的方式提高處理能力骑科,以應(yīng)付高峰期的流量。同樣當(dāng)系統(tǒng)的請求量或計算量減少時藕筋,系統(tǒng)可以通過動態(tài)減縮的方式減少服務(wù)器的運(yùn)行纵散,降低運(yùn)行成本。但這也同時帶來了當(dāng)某臺服務(wù)器down或者網(wǎng)絡(luò)連接斷了的問題隐圾。
3伍掀、透明性。用戶無需關(guān)心所用的系統(tǒng)是分布式還是單體的暇藏,也不需關(guān)心分布式系統(tǒng)是有上千臺還是只有幾臺服務(wù)器蜜笤,更不需關(guān)心分布式系統(tǒng)的所有服務(wù)器是否都能正常工作。用戶唯一關(guān)心的是自己的請求能否得到合理的處理盐碱。所以上面1把兔、2點帶來的問題,必須在分布式系統(tǒng)設(shè)計時進(jìn)行解決瓮顽,盡量減少對于用戶的影響县好。
根據(jù)上面分布式系統(tǒng)的幾個通用特點,在設(shè)計分布式系統(tǒng)時必須考慮以下三個問題:
1暖混、數(shù)據(jù)的一致性問題缕贡。2、當(dāng)某些服務(wù)不可用時的問題拣播。3晾咪、當(dāng)某些服務(wù)器不可通過網(wǎng)絡(luò)通信時的問題。
上面這三個問題分別對應(yīng)CAP中的一致性贮配、可用性以及分區(qū)容錯性谍倦,所以分布式系統(tǒng)的設(shè)計必須受限于CAP理論。
二泪勒、什么是CAP?
C(Consistency):一致性
一致性必然涉及到多個實體昼蛀,如果只有一個實體就不存在是否一致的說法宴猾。比如一個人的隊列就不存在整齊一致的說法,只有至少兩個人的隊列才會被認(rèn)為是整齊一致或者不一致曹洽。
一致性是指系統(tǒng)在存在多個實體的情形下鳍置,對于系統(tǒng)內(nèi)任意對象x,在任意時刻送淆,不管是從實體a、實體b怕轿、...還是實體n獲取到的數(shù)據(jù)應(yīng)該是一致的偷崩。這里的一致性其實就是指強(qiáng)一致性。
拿某電商系統(tǒng)中的商品剩余庫存舉例:某個商品的當(dāng)前庫存是n撞羽,當(dāng)被購買一件后阐斜,庫存變?yōu)榱薾-1。那該 電商系統(tǒng)的所有用戶查詢該商品的庫存時诀紊,如果返回的都是n-1谒出,則說明該電商系統(tǒng)滿足一致性。如果有些返回n-1邻奠,有些返回n笤喳,甚至其它的,則說明該電商系統(tǒng)不滿足一致性碌宴。
A(Availability):可用性
可用性是指在系統(tǒng)的某些實體失效的前提下杀狡,系統(tǒng)還是能正常對外提供服務(wù)。當(dāng)然如果整個系統(tǒng)下的所有實體都失效了贰镣,那整個系統(tǒng)也就失效了呜象,系統(tǒng)就不存在可用性的說法了。
比如某電商系統(tǒng)部署了M1和M2服務(wù)來負(fù)載分擔(dān)處理用戶登陸請求碑隆。某個時刻M1服務(wù)突然掛了恭陡,那系統(tǒng)應(yīng)該把所有的登陸請求都轉(zhuǎn)發(fā)給M2服務(wù)來處理,保障所有的用戶都能成功登陸上煤。如果M2服務(wù)無法處理全部的請求休玩,系統(tǒng)應(yīng)該立即自動啟動M3服務(wù)來負(fù)載分擔(dān),或者采取服務(wù)降級以及限流的方式楼入,給用戶一個合理的響應(yīng)信息哥捕。
對于許多系統(tǒng)而言,四個9的(即99.99%)可用性都被認(rèn)為是高可用性嘉熊。
P(Partition tolerance):分區(qū)容錯性
分區(qū)容錯性是指系統(tǒng)的某些實體之間無法溝通時遥赚,整個系統(tǒng)會形成幾個完全隔離的分區(qū),系統(tǒng)能夠容忍這種分區(qū)的異常阐肤,滿足系統(tǒng)的一致性或者可用性凫佛,但是在滿足分區(qū)容錯性的前提下讲坎,一致性和可用性只能滿足其中的一個。
比如某電商系統(tǒng)的下訂單子系統(tǒng)和訂單處理子系統(tǒng)之間無法通過網(wǎng)絡(luò)通信了愧薛。那現(xiàn)在有兩種情況:
第一種:這兩個子系統(tǒng)還是正常對外提供服務(wù)晨炕,這樣必然帶來訂單數(shù)據(jù)不一致的問題。
第二種:這兩個子系統(tǒng)均不對外提供服務(wù)毫炉,這樣必然帶來可用性的問題瓮栗。
三、分布式系統(tǒng)為什么最多滿足CAP定理中的兩項瞄勾?
1费奸、滿足分區(qū)容錯性的情況下,是否能同時滿足一致性和可用性进陡?
(1)如果要滿足可用性愿阐,則無法滿足一致性,則如下所示(x的值最初為2):
(2)如果要滿足一致性趾疚,則無法滿足可用性缨历,則如下所示(x的值最初為2):
2、滿足可用性的情況下糙麦,是否能同時滿足一致性和分區(qū)容錯性辛孵?
(1)如果要滿足一致性,則無法滿足分區(qū)容錯性喳资,則如下所示(x的值最初為2):
(2)如果要滿足分區(qū)容錯性觉吭,則無法滿足一致性,則如下所示(x的值最初為2):
3仆邓、滿足一致性的情況下鲜滩,是否能同時滿足可用性和分區(qū)容錯性?
(1)如果要滿足可用性节值,則無法滿足分區(qū)容錯性徙硅,則如下所示(x的值最初為2):
(2)如果要滿足分區(qū)容錯性,則無法滿足可用性搞疗,則如下所示(x的值最初為2):