問題之由來
我第一次聽說mongodb诽嘉、hbase這些分布式數(shù)據(jù)庫的時(shí)候进每,正是我學(xué)習(xí)mysql的時(shí)候,在那個(gè)遙遠(yuǎn)的年代射亏,mysql可是java web項(xiàng)目的標(biāo)配近忙,恰如今日hadoop之于大數(shù)據(jù)。高可用智润、彈性擴(kuò)展及舍,分布式數(shù)據(jù)庫帶來了種種眼花繚亂令人目眩的特性,深深吸引著當(dāng)時(shí)涉世未深而又孤陋寡聞的我窟绷,然而零基礎(chǔ)轉(zhuǎn)行大數(shù)據(jù)又處處碰壁锯玛,屢戰(zhàn)屢敗之后,才有一個(gè)大數(shù)據(jù)項(xiàng)目組給了一個(gè)降薪的offer讓去給他們做前端。
囊中羞澀前途未卜攘残,應(yīng)該接受這個(gè)降薪的offer么拙友?幾乎毫不猶豫的,我開始了flash開發(fā)之旅歼郭。
學(xué)習(xí)大數(shù)據(jù)時(shí)遗契,CAP定理是我最早接觸的概念,在一段時(shí)間里病曾,它對(duì)我一直都是金科玉律牍蜂,每看到一個(gè)系統(tǒng),我都會(huì)推斷它到底是AP的還是CP的知态,直到我最近突然想到一個(gè)問題:
一直都說zookeeper是強(qiáng)一致性的(實(shí)際上捷兰,zookeeper的一致性是Sequential consistency,等有機(jī)會(huì)了再講)负敏,mongodb的replica set也可以設(shè)置為強(qiáng)一致性贡茅,但是它們又能通過leader選舉等方法保證高可用,那么豈不是說zookeeper和mongodb完全滿足了CAP的三個(gè)特性其做?
一時(shí)間云波詭譎撲朔迷離顶考,于是我決定重新審視一下CAP定理。
CAP定理的來龍去脈
CAP定理(CAP theorem)既然叫做“定理”而不是公理或者猜想妖泄,那就說明它是可以被證明的【匝兀現(xiàn)在比較流行的說法是,Brewer最早做出了推測蹈胡,而Seth Gilbert和Nancy Lynch在《Brewer’s Conjecture and the Feasibility of Consistent, Available, Partition-Tolerant Web Services》中做出了證明渊季。
zookeeper、mongodb和CAP的A
在證明里罚渐,A是被定義為every request received by a non-failing node in the system must result in a response却汉。總體來說荷并,定義過于簡潔合砂,理解過于多樣。
- 比如源织,在mongodb里翩伪,使用它的客戶端以后,所有的寫請(qǐng)求都發(fā)給了primary谈息,但是假如我能把一個(gè)寫請(qǐng)求直接發(fā)給secondary缘屹,它會(huì)怎么處理?如果secondary返回了一個(gè)錯(cuò)誤侠仇,說“喂囊颅,我們secondary不接受寫請(qǐng)求”,這種情況算不算它“result in a response”?
- 再比如踢代,如果發(fā)生網(wǎng)絡(luò)隔離盲憎,一臺(tái)被孤立的zookeeper服務(wù)器就變成了looking狀態(tài),把一個(gè)讀或者寫請(qǐng)求發(fā)給了它胳挎,它返回一個(gè)錯(cuò)誤饼疙,說“我已經(jīng)六神無主了,你還是找別人吧”慕爬,這種情況算不算它“result in a response”窑眯?
如果這些都不算的話,那么zookeeper和mongodb replica set都不滿足CAP的A医窿,但是它們又都是高可用的磅甩,因?yàn)樯鲜銮闆r下,client都能正確處理姥卢,應(yīng)用程序都能正常運(yùn)行卷要。
關(guān)于CAP中A的正確理解,還敬請(qǐng)持續(xù)關(guān)注這個(gè)問題独榴。
CAP定理的嚴(yán)格證明
CAP定理正確不正確呢僧叉?在我看來,從公理上來看是顯而易見的棺榔,從定理上來看是曖昧不明的瓶堕。
為了讀懂《Brewer’s Conjecture and the Feasibility of Consistent, Available, Partition-Tolerant Web Services》,我先找了Lynch阿姨的《Distributed Algorithms》看了兩天症歇,然而發(fā)現(xiàn)異步網(wǎng)絡(luò)的定理1還算合理郎笆,然而推論1.1就云山霧罩,半同步網(wǎng)絡(luò)的定理2更是不知所云忘晤。實(shí)在才疏學(xué)淺宛蚓,所以這個(gè)問題也forward給其他大神了,期待更好的回答德频。
同時(shí)苍息,外國幾位老哥也對(duì)CAP定理的證明存在著質(zhì)疑缩幸,大家有興趣可以圍觀一下壹置。
https://maniagnosis.crsr.net/2010/09/some-misconceptions-about-cap-theorem.html
http://markburgess.org/blog_cap.html
后記
經(jīng)過這件小事,我產(chǎn)生了系統(tǒng)性的學(xué)習(xí)分布式系統(tǒng)的想法表谊,倒是讓我始料未及钞护。
原文作者:大神帶我來搬磚
愛好歷史和武俠,專注java爆办、大數(shù)據(jù)的程序員小哥哥难咕。
學(xué)習(xí)資料共享,技術(shù)問題討論,希望和大家一起交流進(jìn)步余佃。