分布式系統中,必然無法同時滿足一致性、可用性和分區容忍性。
分布式系統指一組電腦連成的網絡。
一致性(Consistency,簡稱C)指同一時刻全網數據完全一致,相當于軍訓隊伍整齊劃一,越整齊一致性就越高。
可用性(Availability,簡稱A)一部分節點更新數據后,分布式系統能基于最新數據響應用戶讀寫請求。排頭兵挪動后,沒跟上的隊伍走樣越小、排齊耗時越少,可用性就越高。
分區容忍性(Partition Tolerance,簡稱P)只有兩個可選參數:不容忍和容忍。
不容忍分區好比你一個人在word里打字,無需穿行網絡,一臺電腦全盤搞定;容忍分區就是分布式系統,至少有兩臺計算機聯機組成,比如你保存word文檔的瞬間,如果我的電腦沒和你交互,就讀不到你剛寫的文字。
CAP定理意思是:C、A、P三者最多得二。
具體來說:分布式系統必然容忍分區(P),所以一致性(C)與可用性(A)注定互斥。如果你想左擁右抱C和A,那就別指望分布式系統,只能用單機版的中心化方式(不容忍分區,無P)。
但是,分布式系統中C和A的不可兼得,與中文語境下魚和熊掌的不可兼得不同。CAP定理是說:一條隊伍永遠存在可能不齊的瞬間。這看著像句廢話,但只有理解這點,才能避免對CAP原理最習以為常的誤解:現在不齊,所以永遠無法整齊。
你不是教官腦中的提線木偶,不會根據教官意念自動排齊。排頭兵一個噴嚏把自己打出去半步,二號兵才能開始反應,跟出瞄齊,而他脖子位置的變化向三號兵發出指令:來,跟上。
最后才輪到你,怎么可能快?所有人的反應時間之外,還要加上挪步用時,于是耗時必然大于零。
映射到分布式系統:如果想要嚴格一致的數據,那分布式系統就沒法用了,因為你無法確保使用數據的瞬間,網絡中其他節點不會更新數據;如果你想用相對新的數據,那就得候著。
所以,分布式系統天生就慢。
這種慢,更像是遲鈍,原因很簡單:分布式系統范圍一大,節點間的通信耗時就長。
如果你想獲得可靠的最新信息,就得等所有節點匯集出最新數據,這樣能保住一致性、放棄可用性。可如果你說全網這么多節點,等到什么時候才能一致?CAP原理告訴你:別等了,你就放棄點一致性,先用著吧,否則你啥也用不了。
2000年加州大學伯克利分校計算機教授布魯爾提出了CAP的三選二猜想,兩年后被麻省理工學院的兩位教授基爾伯特和林奇證明。
他們的反證法讓證明過程出奇地簡單:
假設存在一個算法同時滿足一致性、可用性和分區容忍性,那么在兩個節點的網絡中,存儲的信息分為不相關的非空集合{G和G'},假設G和G'間沒有通信,那么,一個節點讀的操作將無法訪問另一節點稍早前寫的結果。
類比一個你熟悉的場景:
媽媽和兒子一起把兩只蛋關進冰箱,媽媽回房看電視,兒子一餓之下把蛋全煮了扒光吃盡,此時爸爸在房里問媽媽:冰箱里還有多少蛋?
媽媽關上房門的剎那,本來共享的雞蛋余額數據就發生了分區。
如果媽媽追求嚴格一致性,那她應該跑去冰箱檢查余額后再答復爸爸,可媽媽追起劇來特別專注,所以直接回答:還有兩個。這個回復沒有基于準確的最新余額,但為了可用,放棄了一致。
可這并不影響爸爸第二天就去超市買蛋,因為不管零個蛋還是兩個蛋,都不夠全家吃。
所以,一致性并非不可放棄,只是需要權衡。放棄追求一致性,就能少打斷一次電視劇情,少跑一個來回所增加的便利,如果大于因為蛋數認定不一致帶來的不便,那不一致就不一致吧。
這是很簡單的取舍,但正如“去中心”常被人們誤解為“去掉所有中心”一樣,人們也常常誤讀CAP定理中“三者只能居其二”的含義:
CAP定理的確告訴我們:分布式系統中抓走可用性就意味著放手一致性,但并不說明用戶想要的一致性被沖進了馬桶,再也撈不回來。真實情況是,我們可以在短時間內追回些一致性,就像經過嚴格訓練的隊伍可以比普通隊伍用更短的時間排齊一樣。
很可惜,即使我們只用一剎那的時間就能追回先前所有的不一致,我們也沒有辦法追回這一剎那本身所產生的不一致,這是分布式系統命中注定的無奈。
但這只是CAP定理在理論上的陳辭,實際場景中我們需要關注的是如何在C、A之間權衡利弊,最終獲得最大的經濟收益。在這方面,銀行業貢獻給我們兩個案例:
版權申明:本內容來自于互聯網,屬第三方匯集推薦平臺。本文的版權歸原作者所有,文章言論不代表鏈門戶的觀點,鏈門戶不承擔任何法律責任。如有侵權請聯系QQ:3341927519進行反饋。