很多中間件灿椅,比如Kafka、Hadoop九孩、HBase先馆,都用到了 Zookeeper,于是很多人就會(huì)去了解這個(gè) Zookeeper 到底是什么躺彬,為什么它在分布式系統(tǒng)里有著如此無可替代的地位煤墙。
其實(shí)學(xué)任何一項(xiàng)技術(shù),首先都要弄明白宪拥,為什么需要這項(xiàng)技術(shù)仿野。
so,我們?yōu)槭裁葱枰?Zookeeper?
直白點(diǎn)兒說,我們之所以需要zookeeper她君,就是我們需要一個(gè)用起來像單機(jī)但是又比單機(jī)更可靠的東西脚作。
下面我們舉一個(gè)可能不太恰當(dāng),但是相對(duì)形象的例子來具體說明:
一個(gè)團(tuán)隊(duì)里面缔刹,需要一個(gè)leader球涛,leader是干嘛用的?管理什么的咱不說校镐,就說如果外面的人亿扁,想問關(guān)于這個(gè)團(tuán)隊(duì)的一切事情,首先就會(huì)去找這個(gè)leader鸟廓,因?yàn)樗赖淖疃啻幼#宜幕卮鹱羁孔V。
比如產(chǎn)品經(jīng)理小P過來要人引谜,作為leader牍陌,老L發(fā)現(xiàn)小A最近沒有項(xiàng)目安排,于是把小A安排給了小P的項(xiàng)目员咽;
過了一會(huì)毒涧,另一個(gè)產(chǎn)品小Q也過來要人,老L發(fā)現(xiàn)剛剛把小A安排走了贝室,已經(jīng)沒人契讲,于是就跟小Q說,人都被你們產(chǎn)品要走了档玻,你們產(chǎn)品自己去協(xié)調(diào)去怀泊。
如果老L這時(shí)候忘了小耀已經(jīng)被安排走了茫藏,把小耀也分配給小西误趴,那到時(shí)兩個(gè)產(chǎn)品就要打架了。
這就是leader在團(tuán)隊(duì)里的協(xié)調(diào)作用务傲。
同樣的凉当,在分布式系統(tǒng)中枣申,也需要這樣的協(xié)調(diào)者,來應(yīng)答系統(tǒng)下各個(gè)節(jié)點(diǎn)的請(qǐng)求看杭。
比如我們搭建了一個(gè)數(shù)據(jù)庫(kù)集群忠藤,里面有一個(gè)Master,多個(gè)Slave楼雹,Master負(fù)責(zé)寫模孩,Slave只讀,我們需要一個(gè)系統(tǒng)贮缅,來告訴客戶端榨咐,哪個(gè)是Master。
有人說谴供,很簡(jiǎn)單块茁,我們把這個(gè)信息寫到一個(gè)Java服務(wù)器的內(nèi)存就好了,用一個(gè)map桂肌,
key:master数焊,
value:master機(jī)器對(duì)應(yīng)的ip
但是別忘了,這是個(gè)單機(jī)崎场,一旦這個(gè)機(jī)器掛了佩耳,就完蛋了,客戶端將無法知道到底哪個(gè)是Master照雁。
于是開始進(jìn)行拓展蚕愤,拓展成三臺(tái)服務(wù)器的集群。
這下問題來了饺蚊,如果我在其中一臺(tái)機(jī)器修改了Master的ip萍诱,數(shù)據(jù)還沒同步到其他兩臺(tái),這時(shí)候客戶端過來查詢污呼,如果查詢走的是另外兩臺(tái)還沒有同步到的機(jī)器裕坊,就會(huì)拿到舊的數(shù)據(jù),往已經(jīng)不是master的機(jī)器寫數(shù)據(jù)燕酷。
所以我們需要這個(gè)存儲(chǔ)master信息的服務(wù)器集群籍凝,做到當(dāng)信息還沒同步完成時(shí),不對(duì)外提供服務(wù)苗缩,阻塞住查詢請(qǐng)求饵蒂,等待信息同步完成,再給查詢請(qǐng)求返回信息酱讶。
這樣一來退盯,請(qǐng)求就會(huì)變慢,變慢的時(shí)間取決于什么時(shí)候這個(gè)集群認(rèn)為數(shù)據(jù)同步完成了。
假設(shè)這個(gè)數(shù)據(jù)同步時(shí)間無限短渊迁,比如是1微妙慰照,可以忽略不計(jì),那么其實(shí)這個(gè)分布式系統(tǒng)琉朽,就和我們之前單機(jī)的系統(tǒng)一樣毒租,既可以保證數(shù)據(jù)的一致,又讓外界感知不到請(qǐng)求阻塞箱叁,同時(shí)墅垮,又不會(huì)有SPOF(Single Point of Failure)的風(fēng)險(xiǎn),即不會(huì)因?yàn)橐慌_(tái)機(jī)器的宕機(jī)耕漱,導(dǎo)致整個(gè)系統(tǒng)不可用噩斟。
這樣的系統(tǒng),就叫分布式協(xié)調(diào)系統(tǒng)孤个。誰能把這個(gè)數(shù)據(jù)同步的時(shí)間壓縮的更短剃允,誰的請(qǐng)求響應(yīng)就更快,誰就更出色齐鲤,Zookeeper就是其中的佼佼者斥废。
它用起來像單機(jī)一樣,能夠提供數(shù)據(jù)強(qiáng)一致性给郊,但是其實(shí)背后是多臺(tái)機(jī)器構(gòu)成的集群牡肉,不會(huì)有SPOF。
其實(shí)就是CAP理論中淆九,滿足CP统锤,不滿足A的那類分布式系統(tǒng)。
如果把各個(gè)節(jié)點(diǎn)比作各種小動(dòng)物炭庙,那協(xié)調(diào)者饲窿,就是動(dòng)物園管理員,這也就是Zookeeper名稱的由來了焕蹄,從名字就可以看出來它的雄心勃勃逾雄。
講完了上面這些,現(xiàn)在再來看官網(wǎng)這句話腻脏,就很能理解了:
ZooKeeper: A Distributed Coordination Service for Distributed Applications
當(dāng)然還有這句:
而以往的很多ZK教程鸦泳,上來就是“Zookeeper是開源的分布式應(yīng)用協(xié)調(diào)系統(tǒng)”blabla,很多像我這樣的小年輕看到就會(huì)很費(fèi)解永品,到底什么是分布式協(xié)調(diào)做鹰,為什么分布式就需要協(xié)調(diào) …
上面只是回答了我自己提出的問題,為什么需要Zookeeper鼎姐,或者說钾麸,為什么需要分布式協(xié)調(diào)系統(tǒng)掉弛,如果想進(jìn)一步學(xué)習(xí) ZK,你還需要了解下 Zookeeper 的內(nèi)部實(shí)現(xiàn)原理喂走。
比如 ZK 的宏觀結(jié)構(gòu):
到 ZK 的微觀:
再到 ZK 是如何實(shí)現(xiàn)高性能的強(qiáng)一致的,即ZAB協(xié)議的原理谋作,很多教程上來就開始介紹ZAB協(xié)議芋肠,很容易讓人一頭霧水,不知道為什么需要這樣一個(gè)分布式一致性協(xié)議遵蚜,有了上述介紹的背景帖池,就好懂許多。