分布式系統(tǒng)(distributed system)變得越來越重要氨距,大型網(wǎng)站幾乎都是分布式的恩伺。
分布式系統(tǒng)的最大難點徙瓶,就是各個節(jié)點的狀態(tài)如何同步喊积。CAP 定理是這方面的基本定理烹困,也是理解分布式系統(tǒng)的起點。
一乾吻、分布式系統(tǒng)的三個指標
Consistency韭邓,Availability,Partition tolerance溶弟。
它們的第一個字母分別是 C、A瞭郑、P辜御。這三個指標不可能同時做到。這個結(jié)論就叫做 CAP 定理屈张。
二擒权、Partition tolerance
先看 Partition tolerance,中文叫做“分區(qū)容錯”阁谆。
大多數(shù)分布式系統(tǒng)都分布在多個子網(wǎng)絡(luò)碳抄。每個子網(wǎng)絡(luò)就叫做一個區(qū)(partition)。分區(qū)容錯的意思是场绿,區(qū)間通信可能失敗剖效。比如,一臺服務(wù)器放在中國,另一臺服務(wù)器放在美國璧尸,這就是兩個區(qū)咒林,它們之間可能無法通信。
上圖中爷光,G1 和 G2 是兩臺跨區(qū)的服務(wù)器垫竞。G1 向 G2 發(fā)送一條消息,G2 可能無法收到蛀序。系統(tǒng)設(shè)計的時候欢瞪,必須考慮到這種情況。
一般來說徐裸,分區(qū)容錯無法避免遣鼓,因此可以認為 CAP 的 P 總是成立。CAP 定理告訴我們倦逐,剩下的 C 和 A 無法同時做到譬正。
三、Consistency
Consistency 中文叫做“一致性”檬姥。意思是曾我,寫操作之后的讀操作,必須返回該值健民。舉例來說抒巢,某條記錄是 v0,用戶向 G1 發(fā)起一個寫操作秉犹,將其改為 v1蛉谜。
接下來,用戶的讀操作就會得到 v1崇堵。這就叫一致性型诚。
問題是,用戶有可能向 G2 發(fā)起讀操作鸳劳,由于 G2 的值沒有發(fā)生變化狰贯,因此返回的是 v0。G1 和 G2 讀操作的結(jié)果不一致赏廓,這就不滿足一致性了涵紊。
為了讓 G2 也能變?yōu)?v1,就要在 G1 寫操作的時候幔摸,讓 G1 向 G2 發(fā)送一條消息摸柄,要求 G2 也改成 v1。
這樣的話既忆,用戶向 G2 發(fā)起讀操作驱负,也能得到 v1嗦玖。
四、Availability
Availability 中文叫做“可用性”电媳,意思是只要收到用戶的請求踏揣,服務(wù)器就必須給出回應(yīng)。
用戶可以選擇向 G1 或 G2 發(fā)起讀操作匾乓。不管是哪臺服務(wù)器捞稿,只要收到請求,就必須告訴用戶拼缝,到底是 v0 還是 v1娱局,否則就不滿足可用性。
五咧七、Consistency 和 Availability 的矛盾
一致性和可用性衰齐,為什么不可能同時成立?答案很簡單继阻,因為可能通信失敵芴巍(即出現(xiàn)分區(qū)容錯)。
如果保證 G2 的一致性瘟檩,那么 G1 必須在寫操作時抹缕,鎖定 G2 的讀操作和寫操作。只有數(shù)據(jù)同步后墨辛,才能重新開放讀寫卓研。鎖定期間,G2 不能讀寫睹簇,沒有可用性不奏赘。
如果保證 G2 的可用性,那么勢必不能鎖定 G2太惠,所以一致性不成立磨淌。
綜上所述,G2 無法同時做到一致性和可用性凿渊。系統(tǒng)設(shè)計時只能選擇一個目標伦糯。如果追求一致性,那么無法保證所有節(jié)點的可用性嗽元;如果追求所有節(jié)點的可用性,那就沒法做到一致性喂击。
在什么場合剂癌,可用性高于一致性?
舉例來說翰绊,發(fā)布一張網(wǎng)頁到 CDN佩谷,多個服務(wù)器有這張網(wǎng)頁的副本旁壮。后來發(fā)現(xiàn)一個錯誤,需要更新網(wǎng)頁谐檀,這時只能每個服務(wù)器都更新一遍抡谐。
一般來說,網(wǎng)頁的更新不是特別強調(diào)一致性桐猬。短時期內(nèi)麦撵,一些用戶拿到老版本,另一些用戶拿到新版本溃肪,問題不會特別大免胃。當然,所有人最終都會看到新版本惫撰。所以羔沙,這個場合就是可用性高于一致性。
六厨钻、互聯(lián)網(wǎng)企業(yè)做法
在大型網(wǎng)站應(yīng)用中扼雏,數(shù)據(jù)規(guī)模總是快速擴張夯膀,因為可伸縮性即分區(qū)耐受性(P)必不可少诗充。規(guī)模變大,機器數(shù)量也會變得龐大棍郎,這時網(wǎng)絡(luò)和服務(wù)器故障會頻繁出現(xiàn)其障,要想保證可用就必須保證分布式處理系統(tǒng)的高可用性。所以大型網(wǎng)站中涂佃,通常會選擇強化分布式存儲系統(tǒng)的可用性A和伸縮性P励翼,而在某種程度上放棄一致性C。
所說的數(shù)據(jù)一致性就是C辜荠,而可用性就是A汽抚。而性能不在CAP里。所以伯病,其實數(shù)據(jù)一致性和性能(用戶感知的性能)是可以兼顧的造烁。
數(shù)據(jù)一致性和可用性怎么權(quán)衡,如上所述午笛,一般是放棄一致性C惭蟋,那就是:一般互聯(lián)網(wǎng)高并發(fā)系統(tǒng)不會使用分布式事務(wù)(強一致性),因為使用分布式事務(wù)的系統(tǒng)復雜且性能低(系統(tǒng)執(zhí)行時間長)药磺,這樣很容易會由于資源占有時間過長不釋放而造成網(wǎng)絡(luò)擁塞告组、連接池爆滿、拒絕訪問(可用性)癌佩。
所以木缝,一般的互聯(lián)網(wǎng)高并發(fā)系統(tǒng)會采用數(shù)據(jù)的最終一致性便锨,而保護系統(tǒng)的可用性和“高性能”。數(shù)據(jù)最終一致性的方案有:定時校對補償我碟、消息隊列等異步處理等放案。