ZooKeeper之引言

1、 產(chǎn)生背景

當(dāng)今是個(gè)分布式、集群、云計(jì)算等名詞滿天飛的時(shí)代。造成這種局面的一個(gè)重要因素就是,單一機(jī)器的處理能力已經(jīng)不能滿足我們的需求,不得不采用由多臺(tái)機(jī)器組成的服務(wù)集群。服務(wù)集群對(duì)外提供服務(wù)的過程中,可以分解處理壓力,在一定程度上打破性能瓶頸,并提高服務(wù)的可用性(不會(huì)因?yàn)橐慌_(tái)機(jī)器宕機(jī)而造成服務(wù)不可用)。

1.png

上圖中有三臺(tái)機(jī)器,每臺(tái)機(jī)器跑同樣的一個(gè)應(yīng)用程序。然后我們將這三臺(tái)機(jī)器通過網(wǎng)絡(luò)將其連接起來,構(gòu)成一個(gè)系統(tǒng)來為用戶提供服務(wù),對(duì)用戶來說這個(gè)系統(tǒng)的架構(gòu)是透明的,他感覺不到這個(gè)系統(tǒng)是一個(gè)什么樣的架構(gòu)。那么我們就可以把這種系統(tǒng)稱作一個(gè)分布式系統(tǒng)。
那么,問題來了:

  • 程序的運(yùn)行往往依賴很多配置文件,比如數(shù)據(jù)庫(kù)地址、黑名單控制、服務(wù)地址列表等,而且有些配置信息需要頻繁地進(jìn)行動(dòng)態(tài)變更,這時(shí)候怎么保證所有機(jī)器共享的配置信息保持一致?
  • 如果有一臺(tái)機(jī)器掛掉了,其他機(jī)器如何感知到這一變化并接管任務(wù)?如果用戶激增,需要增加機(jī)器來緩解壓力,如何做到不重啟集群而完成機(jī)器的添加?
  • 用戶數(shù)量增加或者減少,會(huì)出現(xiàn)有的機(jī)器資源使用率繁忙,有的卻空閑,如何讓每臺(tái)機(jī)器感知到其他機(jī)器的負(fù)載狀態(tài)從而實(shí)現(xiàn)負(fù)載均衡?
  • 在一臺(tái)機(jī)器上要多個(gè)進(jìn)程或者多個(gè)線程操作同一資源比較簡(jiǎn)單,因?yàn)榭梢杂写罅康臓顟B(tài)信息或者日志信息提供保證,比如兩個(gè)A和B進(jìn)程同時(shí)寫一個(gè)文件,加鎖就可以實(shí)現(xiàn)。但是分布式系統(tǒng)怎么辦?需要一個(gè)三方的分配鎖的機(jī)制,幾百臺(tái)worker都對(duì)同一個(gè)網(wǎng)絡(luò)中的文件寫操作,怎么協(xié)同?還有怎么保證高效的運(yùn)行?

除了上面列舉的幾種,還有很多細(xì)思極恐的問題,分布式系統(tǒng)到底有多然人抓狂,可以想想你第一次接觸多線程的感覺;
計(jì)劃中的多線程

2.png

現(xiàn)實(shí)中的多線程

3.png

分布式系統(tǒng)可以看作多線程的N級(jí)加強(qiáng)版……

2、 ZooKeeper的前世今生

分布式系統(tǒng)的很多難題,都是由于缺少協(xié)調(diào)機(jī)制造成的。

目前,在分布式協(xié)調(diào)技術(shù)方面做得比較好的就是Google的Chubby還有Apache的ZooKeeper。有人會(huì)問既然有了Chubby為什么還要弄一個(gè)ZooKeeper,難道Chubby做得不夠好嗎?主要是Chubby是非開源的,Google自家用。后來雅虎模仿Chubby開發(fā)出了ZooKeeper,也實(shí)現(xiàn)了類似的分布式鎖的功能,并且將ZooKeeper作為一種開源的程序捐獻(xiàn)給了Apache,那么這樣就可以使用ZooKeeper所提供鎖服務(wù)。而且在分布式領(lǐng)域久經(jīng)考驗(yàn),它的可靠性,可用性都是經(jīng)過理論和實(shí)踐的驗(yàn)證的。

4.png
5.png

至于這個(gè)神器為什么叫ZooKeeper,與外國(guó)人一貫的幽默精神有關(guān)。

眾所周知,外國(guó)人喜歡給用一個(gè)動(dòng)物作為吉祥物,在IT界也不例外。比如,負(fù)責(zé)大數(shù)據(jù)工作的Hadoop是一個(gè)黃色的大象;負(fù)責(zé)數(shù)據(jù)倉(cāng)庫(kù)的Hive是一個(gè)虛擬蜂巢;負(fù)責(zé)數(shù)據(jù)分析的Apache Pig是一頭聰明的豬;負(fù)責(zé)管理web容器的tomcat是一只雄貓……那好,負(fù)責(zé)分布式協(xié)調(diào)工作的角色就叫ZooKeeper(動(dòng)物園飼養(yǎng)員)吧。

3、 ZooKeeper能干什么

官方說辭是:

ZooKeeper 分布式服務(wù)框架是Apache Hadoop 的一個(gè)子項(xiàng)目,它主要是用來解決分布式應(yīng)用中經(jīng)常遇到的一些數(shù)據(jù)管理問題,如:統(tǒng)一命名服務(wù)、狀態(tài)同步服務(wù)、集群管理、分布式應(yīng)用配置項(xiàng)的管理等。簡(jiǎn)化分布式應(yīng)用協(xié)調(diào)及其管理的難度,提供高性能的分布式服務(wù)。ZooKeeper的目標(biāo)就是封裝好復(fù)雜 易出錯(cuò)的關(guān)鍵服務(wù),將簡(jiǎn)單易用的接口和性能高效、功能穩(wěn)定的系統(tǒng)提供給用戶。

ZooKeeper在一致性、可用性、容錯(cuò)性的保證,也是ZooKeeper的成功之處,它獲得的一切成功都與它采用的協(xié)議——Zab協(xié)議是密不可分的,這些內(nèi)容將會(huì)在后面介紹。

為了實(shí)現(xiàn)前面提到的各種服務(wù),比如分布式鎖、配置維護(hù)、組服務(wù)等,ZooKeeper設(shè)計(jì)了一種新的數(shù)據(jù)結(jié)構(gòu)——Znode,然后在該數(shù)據(jù)結(jié)構(gòu)的基礎(chǔ)上定義了一些原語,也就是一些關(guān)于該數(shù)據(jù)結(jié)構(gòu)的一些操作。有了這些數(shù)據(jù)結(jié)構(gòu)和原語還不夠,因?yàn)閆ooKeeper工作在分布式環(huán)境下,服務(wù)是通過消息以網(wǎng)絡(luò)的形式發(fā)送給分布式應(yīng)用程序,所以還需要一個(gè)通知機(jī)制——Watcher機(jī)制??偨Y(jié)一下,ZooKeeper所提供的服務(wù)主要是通過:數(shù)據(jù)結(jié)構(gòu) + 原語 + watcher機(jī)制,三個(gè)部分來實(shí)現(xiàn)的。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容