互聯(lián)網(wǎng)發(fā)展到現(xiàn)在衬廷,由于數(shù)據(jù)量大摇予、操作并發(fā)高等問題,大部分網(wǎng)站項目都采用分布式的架構(gòu)吗跋。
而分布式系統(tǒng)最大的特點數(shù)據(jù)分散侧戴,在不同網(wǎng)絡(luò)節(jié)點在某些時刻(數(shù)據(jù)未同步完,數(shù)據(jù)丟失)跌宛,數(shù)據(jù)會不一致酗宋。
在2000年,Eric Brewer教授在PODC的研討會上提出了一個猜想:一致性疆拘、可用性和分區(qū)容錯性三者無法在分布式系統(tǒng)中被同時滿足蜕猫,并且最多只能滿足其中兩個!
在2002年哎迄,Lynch證明其猜想回右,上升為定理隆圆。被這就是大家所認(rèn)知的CAP定理。
CAP是所有分布式數(shù)據(jù)庫的設(shè)計標(biāo)準(zhǔn)翔烁。例如Zookeeper渺氧、Redis、HBase等的設(shè)計都是基于CAP理論的蹬屹。
CAP定義
所謂的CAP就是分布式系統(tǒng)的三個特性:
- Consistency侣背,一致性。所有分布式節(jié)點的數(shù)據(jù)是否一致慨默。
- Availability贩耐,可用性。在部分節(jié)點有問題的情況(數(shù)據(jù)不一致业筏、節(jié)點故障)下,是否能繼續(xù)響應(yīng)服務(wù)(可用)鸟赫。
- Partition tolerance蒜胖,分區(qū)容錯性。允許在節(jié)點(分區(qū))數(shù)據(jù)不一致的情況抛蚤。
深入理解
有A台谢、B、C三個分布式數(shù)據(jù)庫岁经。
當(dāng)A朋沮、B、C的數(shù)據(jù)是完全相同缀壤,那么就符合定理中的Consistency(一致性)樊拓。
假如A的數(shù)據(jù)與B的數(shù)據(jù)不相同,但是整體的服務(wù)(包含A塘慕、B筋夏、C的整體)沒有宕機(jī),依然可以對外系統(tǒng)服務(wù)图呢,那么就符合定理中的Availability(可用性)条篷。
分布式數(shù)據(jù)庫是沒有辦法百分百時刻保持各個節(jié)點數(shù)據(jù)一致的。假設(shè)一個用戶再A庫上更新了一條記錄蛤织,在更新完這一刻赴叹,A與B、C庫的數(shù)據(jù)是不一致的指蚜。這種情況在分布式數(shù)據(jù)庫上是必然存在的乞巧。這就是Partition tolerance(分區(qū)容錯性)
當(dāng)數(shù)據(jù)不一致的時候,必定是滿足分區(qū)容錯性摊鸡,如果不滿足摊欠,那么這個就不是一個可靠的分布式系統(tǒng)丢烘。
然而在數(shù)據(jù)不一致的情況下,系統(tǒng)要么選擇優(yōu)先保持?jǐn)?shù)據(jù)一致性些椒,這樣的話播瞳。系統(tǒng)首先要做的是數(shù)據(jù)的同步操作,此時需要暫停系統(tǒng)的響應(yīng)免糕。這就是滿足CP赢乓。
若系統(tǒng)優(yōu)先選擇可用性,那么在數(shù)據(jù)不一致的情況下石窑,會在第一時間放棄一致性牌芋,讓整體系統(tǒng)依然能運轉(zhuǎn)工作。這就是AP松逊。
所以躺屁,分布式系統(tǒng)在通常情況下,要不就滿足CP经宏,要不就滿足AP犀暑。
那么有沒有滿足CA的呢?有烁兰,當(dāng)分布式節(jié)點為1的時候耐亏,不存在P,自然就會滿足CA了沪斟。
例子
上面說到广辰,分區(qū)容錯性是分布式系統(tǒng)中必定要滿足的,需要權(quán)衡的是系統(tǒng)的一致性與可用性主之。那么常見的分布式系統(tǒng)是基于怎樣的權(quán)衡設(shè)計的择吊。
- Zookeeper
保證CP。當(dāng)主節(jié)點故障的時候槽奕,Zookeeper會重新選主干发。此時Zookeeper是不可用的,需要等待選主結(jié)束才能重新提供注冊服務(wù)史翘。顯然枉长,Zookeeper在節(jié)點故障的時候,并沒有滿足可用性的特性琼讽。在網(wǎng)絡(luò)情況復(fù)雜的生產(chǎn)環(huán)境下必峰,這樣的的情況出現(xiàn)的概率也是有的。一旦出現(xiàn)钻蹬,如果依賴Zookeeper的部分會卡頓吼蚁,在大型系統(tǒng)上,很容易引起系統(tǒng)的雪崩。這也是大型項目不選Zookeeper當(dāng)注冊中心的原因肝匆。 - Eureka
保證AP粒蜈。在Eureka中旗国,各個節(jié)點是平等的枯怖,它們相互注冊。掛掉幾個節(jié)點依然可以提供注冊服務(wù)的(可以配置成掛掉的比例)能曾,如果連接的Eureka發(fā)現(xiàn)不可用度硝,會自動切換到其他可用的幾點上。另外寿冕,當(dāng)一個服務(wù)嘗試連接Eureka發(fā)現(xiàn)不可用的時候蕊程,切換到另外一個Eureka服務(wù)上,有可能由于故障節(jié)點未來得及同步最新配置驼唱,所以這個服務(wù)讀取的數(shù)據(jù)可能不是最新的藻茂。所以當(dāng)不要求強(qiáng)一致性的情況下,Eureka作為注冊中心更為可靠玫恳。 - Git
其實Git也是也是分布式數(shù)據(jù)庫辨赐。它保證的是CP。很容易猜想到纽窟,云端的Git倉庫于本地倉庫必定是要保證數(shù)據(jù)的一致性的肖油,如果不一致會先讓數(shù)據(jù)一致再工作兼吓。當(dāng)你修改完本地代碼臂港,想push代碼到Git倉庫上時,假如云端的HEAD與本地的HEAD不一致的時候视搏,會先同步云端的HEAD到本地HEAD审孽,再把本地的HEAD同步到云端。最終保證數(shù)據(jù)的一致性浑娜。
更多技術(shù)文章佑力、精彩干貨,請關(guān)注
博客:zackku.com
微信公眾號:Zack說碼