Zookeeper字面上理解就是動(dòng)物管理員,Hadoop生態(tài)圈中很多開(kāi)源項(xiàng)目使用動(dòng)物命名,那么需要一個(gè)管理員來(lái)管理這些“動(dòng)物”。
在集群的管理中Zookeeper起到非常重要的角色,他負(fù)責(zé)分布式應(yīng)用程序協(xié)調(diào)的工作。
Zookeeper管理集群會(huì)選舉一個(gè)Leader節(jié)點(diǎn)(可參考FastLeader選舉算法,即快速選舉Leader節(jié)點(diǎn)),Leader節(jié)點(diǎn)主要負(fù)責(zé)整個(gè)Zookeeper集群的運(yùn)行管理,F(xiàn)ollower負(fù)責(zé)管理具體的數(shù)據(jù)存儲(chǔ)與讀取。
Zookeeper是一款通用的集群管理工具,不僅適用于Hadoop集群,在其他的集群中也可能被用到,比如ESB集群。
搭建Zookeeper集群要求整個(gè)集群節(jié)點(diǎn)為奇數(shù),這樣可以避免選舉中選票相同的兩個(gè)節(jié)點(diǎn)出現(xiàn),類(lèi)似于7大常委或11個(gè)國(guó)會(huì)成員在進(jìn)行選舉時(shí)不允許棄權(quán),兩個(gè)備選的節(jié)點(diǎn)總有一個(gè)會(huì)勝出。
Zookeeper主要提供以下四點(diǎn)功能:統(tǒng)一命名服務(wù)、配置管理、集群管理、共享鎖和隊(duì)列管理,用于高效的管理集群的運(yùn)行。
1.統(tǒng)一命名服務(wù)
命名服務(wù)指通過(guò)指定的名字獲取資源或者服務(wù)提供者的信息。分布式應(yīng)用中,通常需要有一套完整的命名規(guī)則,既能夠產(chǎn)生唯一的名稱(chēng)又便于識(shí)別和記憶。通常情況下使用樹(shù)形的名稱(chēng)結(jié)構(gòu)是一個(gè)理想的選擇,樹(shù)形的名稱(chēng)結(jié)構(gòu)是一個(gè)有層次的目錄結(jié)構(gòu),即對(duì)人友好又不會(huì)重復(fù)。
Zookeeper集群中統(tǒng)一由Leader節(jié)點(diǎn)(圖中M節(jié)點(diǎn))來(lái)管理所有Follower節(jié)點(diǎn)(圖中的S1和S2節(jié)點(diǎn))的命名空間。Zookeeper提供統(tǒng)一的命名服務(wù),他不對(duì)外提供數(shù)據(jù)也不存儲(chǔ)數(shù)據(jù),他只提供一套統(tǒng)一的命名規(guī)則,運(yùn)行在Zookeeper之上的服務(wù)需要遵循這一套命名規(guī)則。其中較為常見(jiàn)的就是一些分布式服務(wù)框架中的服務(wù)地址列表。通過(guò)調(diào)用ZK提供的創(chuàng)建節(jié)點(diǎn)的接口(API),能夠很容易創(chuàng)建一個(gè)全局唯一的路徑(path),這個(gè)path就可以作為一個(gè)名稱(chēng)。命名服務(wù)(NameService)已經(jīng)是Zookeeper內(nèi)置的功能,你只要調(diào)用Zookeeper的API就能實(shí)現(xiàn)。如調(diào)用create接口就可以很容易創(chuàng)建一個(gè)目錄節(jié)點(diǎn)。
阿里巴巴集團(tuán)開(kāi)源的分布式服務(wù)框架Dubbo中使用ZooKeeper來(lái)作為其命名服務(wù),維護(hù)全局的服務(wù)地址列表。
在Dubbo實(shí)現(xiàn)中:服務(wù)提供者在啟動(dòng)的時(shí)候,向ZK上的指定節(jié)點(diǎn)/dubbo/${serviceName}/providers目錄下寫(xiě)入自己的URL地址,這個(gè)操作就完成了服務(wù)的發(fā)布。
服務(wù)消費(fèi)者啟動(dòng)的時(shí)候,訂閱/dubbo/{serviceName}/providers目錄下的提供者URL地址,并向/dubbo/{serviceName} /consumers目錄下寫(xiě)入自己的URL地址
遵循Leader統(tǒng)一管理命名規(guī)則下,集群中數(shù)據(jù)讀寫(xiě)的方式:
1.1.寫(xiě)數(shù)據(jù),一個(gè)客戶(hù)端進(jìn)行寫(xiě)數(shù)據(jù)請(qǐng)求時(shí),會(huì)指定Zookeeper集群節(jié)點(diǎn),如果是Follower接收到寫(xiě)請(qǐng)求,會(huì)把請(qǐng)求轉(zhuǎn)發(fā)給Leader,Leader通過(guò)內(nèi)部的Zab協(xié)議進(jìn)行原子廣播,直到所有Zookeeper節(jié)點(diǎn)都成功寫(xiě)了數(shù)據(jù),然后Zookeeper會(huì)給Client發(fā)回寫(xiě)完響應(yīng)。
1.2.讀數(shù)據(jù),因?yàn)榧褐衂ookeeper按照統(tǒng)一的命名空間,所有Zookeeper節(jié)點(diǎn)呈現(xiàn)相同的命名空間視圖(文件目錄名稱(chēng)結(jié)構(gòu)),所以讀數(shù)據(jù)的時(shí)候請(qǐng)求任意一臺(tái)Zookeeper節(jié)點(diǎn)都一樣。
集群中寫(xiě)數(shù)據(jù)的問(wèn)題,存在數(shù)據(jù)并沒(méi)有在集群中完成寫(xiě)入,集群數(shù)據(jù)還未同步,就已經(jīng)更新了命名空間。這個(gè)時(shí)候使用最新的名稱(chēng)去讀取數(shù)據(jù)會(huì)讀到錯(cuò)誤的數(shù)據(jù),解決數(shù)據(jù)不同步問(wèn)題,只能通過(guò)同步機(jī)制(定時(shí)執(zhí)行sync()方法)解決。
2.配置管理
配置的管理在分布式應(yīng)用環(huán)境中很常見(jiàn),例如同一個(gè)應(yīng)用需要在多臺(tái)服務(wù)器上運(yùn)行,但是它們的應(yīng)用系統(tǒng)的某些配置相同的,如果要修改這些相同的配置項(xiàng),就必須同時(shí)修改每臺(tái)運(yùn)行這個(gè)應(yīng)用系統(tǒng)的PC Server,這樣非常麻煩而且容易出錯(cuò)。像這樣的配置信息完全可以交給Zookeeper來(lái)管理,處理起來(lái)非常便捷。
配置的管理包含發(fā)布和訂閱兩個(gè)過(guò)程,顧名思義就是將數(shù)據(jù)發(fā)布到ZK節(jié)點(diǎn)上,供訂閱者動(dòng)態(tài)獲取數(shù)據(jù),實(shí)現(xiàn)配置信息的集中管理和動(dòng)態(tài)更新。
如圖所示,將配置信息保存在Zookeeper(Leader節(jié)點(diǎn))的某一個(gè)目錄中,然后將所有需要修改的應(yīng)用機(jī)器訂閱該Zookeeper(Leader節(jié)點(diǎn))節(jié)點(diǎn),一旦Leader節(jié)點(diǎn)發(fā)布新配置信息,每臺(tái)訂閱的機(jī)器就會(huì)收到Zookeeper的通知,然后從Zookeeper獲取新的配置信息應(yīng)用到系統(tǒng)中,完成配置的集中統(tǒng)一管理。
3.集群管理
Zookeeper在集群管理中主要是集群監(jiān)控和Leader選舉。
3.1.集群管理
這通常用于那種對(duì)集群中機(jī)器狀態(tài)、,機(jī)器在線(xiàn)率有較高要求的場(chǎng)景,能夠快速對(duì)集群中機(jī)器變化做出響應(yīng)。這樣的場(chǎng)景中,往往有一個(gè)監(jiān)控系統(tǒng),實(shí)時(shí)檢測(cè)集群機(jī)器是否存活。過(guò)去的做法通常是:監(jiān)控系統(tǒng)通過(guò)某種手段(比如ping)定時(shí)檢測(cè)每個(gè)機(jī)器,或者每個(gè)機(jī)器自己定時(shí)向監(jiān)控系統(tǒng)匯報(bào)"我還活著"。
這種做法可行,但是存在兩個(gè)比較明顯的問(wèn)題:
1).集群中機(jī)器有變動(dòng)的時(shí)候,牽連修改的東西比較多。
2).有一定的延時(shí)。
利用ZooKeeper中兩個(gè)特性,就可以實(shí)施另一種集群機(jī)器存活性監(jiān)控系統(tǒng):
1).客戶(hù)端在示例節(jié)點(diǎn)A上注冊(cè)一個(gè)監(jiān)控者(Watcher),那么如果A的子節(jié)點(diǎn)變化了,會(huì)通知該客戶(hù)端。
2).創(chuàng)建EPHEMERAL類(lèi)型的節(jié)點(diǎn),一旦客戶(hù)端和服務(wù)器的會(huì)話(huà)結(jié)束或過(guò)期,那么該節(jié)點(diǎn)就會(huì)消失。
3.2.Leader選舉:
Leader選舉即從大量集群節(jié)點(diǎn)中選舉一個(gè)Leader節(jié)點(diǎn),是zookeeper中最為經(jīng)典的使用場(chǎng)景,在分布式環(huán)境中選舉的Leader節(jié)點(diǎn)好快會(huì)直接影響集群的效率。Leader節(jié)點(diǎn)主要負(fù)責(zé)相同的業(yè)務(wù)應(yīng)用分布在不同的機(jī)器上共用的邏輯模型和數(shù)據(jù)的調(diào)配,優(yōu)秀的調(diào)配方案可以大大減少重復(fù)運(yùn)算,提高性能降低集群的負(fù)載。
如一些耗時(shí)的計(jì)算,要求提高集群計(jì)算能力的使用,而網(wǎng)絡(luò)I/O處往往只需要讓整個(gè)集群中的某一臺(tái)機(jī)器進(jìn)行執(zhí)行,其余機(jī)器可以共享這個(gè)結(jié)果。如果Leader節(jié)點(diǎn)將I/O處理分配到每一個(gè)計(jì)算節(jié)點(diǎn)進(jìn)行處理,處理I/O消耗計(jì)算資源勢(shì)必會(huì)降低集群運(yùn)算效率。
利用ZooKeeper中兩個(gè)特性,就可以實(shí)施另一種集群中Leader選舉:
1).利用ZooKeeper的強(qiáng)一致性,能夠保證在分布式高并發(fā)情況下節(jié)點(diǎn)創(chuàng)建的全局唯一性,即:同時(shí)有多個(gè)客戶(hù)端請(qǐng)求創(chuàng)建Leader節(jié)點(diǎn),最終一定只有一個(gè)客戶(hù)端請(qǐng)求能夠創(chuàng)建成功。利用這個(gè)特性,就能很輕易的在分布式環(huán)境中進(jìn)行集群的Leader選舉了。
2).另外,這種場(chǎng)景演化一下,就是動(dòng)態(tài)Leader選舉。這就要用到EPHEMERAL_SEQUENTIAL類(lèi)型節(jié)點(diǎn)的特性了,這樣每個(gè)節(jié)點(diǎn)會(huì)自動(dòng)被編號(hào)。允許所有請(qǐng)求都能夠創(chuàng)建成功,但是創(chuàng)建節(jié)點(diǎn)會(huì)為每個(gè)節(jié)點(diǎn)安排順序,每次選取序列號(hào)最小的那個(gè)機(jī)器作為L(zhǎng)eader。
小結(jié)
Zookeeper作為Hadoop主要的組件,在集群管理方面為我們提供了解決方案。通過(guò)對(duì)統(tǒng)一命名服務(wù)、配置管理和集群管理的閱讀,我們能夠清晰的理解Zookeeper的核心內(nèi)容。針對(duì)共享鎖和隊(duì)列服務(wù)偏技術(shù)實(shí)現(xiàn),有興趣的可以進(jìn)一步研究。
Zookeeper在大數(shù)據(jù)集群中解決集群管理的問(wèn)題,磨刀不誤砍柴工,了解完工具我們下一次分享一些具體的實(shí)效應(yīng)用。