關(guān)于ZooKeeper原理剖析
1. ZooKeeper簡(jiǎn)介
ZooKeeper是一個(gè)分布式、高可用性的協(xié)調(diào)服務(wù)。在大數(shù)據(jù)產(chǎn)品中主要提供兩個(gè)功能:
- 幫助系統(tǒng)避免單點(diǎn)故障,建立可靠的應(yīng)用程序。
- 提供分布式協(xié)作服務(wù)和維護(hù)配置信息。
2. ZooKeeper結(jié)構(gòu)
ZooKeeper集群中的節(jié)點(diǎn)分為三種角色:Leader、Follower和Observer,其結(jié)構(gòu)和相互關(guān)系如下圖所示。通常來(lái)說(shuō),需要在集群中配置奇數(shù)個(gè)(2N+1)ZooKeeper服務(wù),至少(N+1)個(gè)投票才能成功的執(zhí)行寫(xiě)操作。
ZooKeeper結(jié)構(gòu)

上圖中各部分的功能說(shuō)明如下表所示。
| 名稱 | 描述 |
|---|---|
| Leader | 在ZooKeeper集群中只有一個(gè)節(jié)點(diǎn)作為集群的領(lǐng)導(dǎo)者,由各Follower通過(guò)ZooKeeper Atomic Broadcast(ZAB)協(xié)議選舉產(chǎn)生,主要負(fù)責(zé)接收和協(xié)調(diào)所有寫(xiě)請(qǐng)求,并把寫(xiě)入的信息同步到Follower和Observer。 |
| Follower | Follower的功能有兩個(gè):1.每個(gè)Follower都作為L(zhǎng)eader的儲(chǔ)備,當(dāng)Leader故障時(shí)重新選舉Leader,避免單點(diǎn)故障。2.處理讀請(qǐng)求,并配合Leader一起進(jìn)行寫(xiě)請(qǐng)求處理。 |
| Observer | Observer不參與選舉和寫(xiě)請(qǐng)求的投票,只負(fù)責(zé)處理讀請(qǐng)求、并向Leader轉(zhuǎn)發(fā)寫(xiě)請(qǐng)求,避免系統(tǒng)處理能力浪費(fèi)。 |
| Client | ZooKeeper集群的客戶端,對(duì)ZooKeeper集群進(jìn)行讀寫(xiě)操作。例如HBase可以作為ZooKeeper集群的客戶端,利用ZooKeeper集群的仲裁功能,控制其HMaster的“Active”和“Standby”狀態(tài)。 |
如果集群?jiǎn)⒂昧税踩?wù),在連接ZooKeeper時(shí)需要進(jìn)行身份認(rèn)證,認(rèn)證方式有以下兩種:
- keytab方式:需要從MRS集群管理員處獲取一個(gè)“人機(jī)”用戶,用于登錄MRS平臺(tái)并通過(guò)認(rèn)證,并且獲取到該用戶的keytab文件。
- 票據(jù)方式:從MRS集群管理員處獲取一個(gè)“人機(jī)”用戶,用于后續(xù)的安全登錄,開(kāi)啟Kerberos服務(wù)的renewable和forwardable開(kāi)關(guān)并且設(shè)置票據(jù)刷新周期,開(kāi)啟成功后重啟kerberos及相關(guān)組件。
注意:
- 默認(rèn)情況下,用戶的密碼有效期是90天,所以獲取的keytab文件的有效期是90天。
- Kerberos服務(wù)的renewable、forwardable開(kāi)關(guān)和票據(jù)刷新周期的設(shè)置在Kerberos服務(wù)的配置頁(yè)面的“系統(tǒng)”標(biāo)簽下,票據(jù)刷新周期的修改可以根據(jù)實(shí)際情況修改“kdc_renew_lifetime”和“kdc_max_renewable_life”的值。
3. ZooKeeper原理
寫(xiě)請(qǐng)求
- Follower或Observer接收到寫(xiě)請(qǐng)求后,轉(zhuǎn)發(fā)給Leader。
- Leader協(xié)調(diào)各Follower,通過(guò)投票機(jī)制決定是否接受該寫(xiě)請(qǐng)求。
- 如果超過(guò)半數(shù)以上的Leader、Follower節(jié)點(diǎn)返回寫(xiě)入成功,那么Leader提交該請(qǐng)求并返回成功,否則返回失敗。
- Follower或Observer返回寫(xiě)請(qǐng)求處理結(jié)果。
只讀請(qǐng)求
- 客戶端直接向Leader、Follower或Observer讀取數(shù)據(jù)。
4. ZooKeeper和HDFS的關(guān)系
ZooKeeper與HDFS的關(guān)系如下圖所示。

ZKFC(ZKFailoverController)作為一個(gè)ZooKeeper集群的客戶端,用來(lái)監(jiān)控NameNode的狀態(tài)信息。ZKFC進(jìn)程僅在部署了NameNode的節(jié)點(diǎn)中存在。HDFS NameNode的Active和Standby節(jié)點(diǎn)均部署有zkfc進(jìn)程。
- HDFS NameNode的ZKFC連接到ZooKeeper,把主機(jī)名等信息保存到ZooKeeper中,即“/hadoop-ha”下的znode目錄里。先創(chuàng)建znode目錄的NameNode節(jié)點(diǎn)為主節(jié)點(diǎn),另一個(gè)為備節(jié)點(diǎn)。HDFS NameNode Standby通過(guò)ZooKeeper定時(shí)讀取NameNode信息。
- 當(dāng)主節(jié)點(diǎn)進(jìn)程異常結(jié)束時(shí),HDFS NameNode Standby通過(guò)ZooKeeper感知“/hadoop-ha”目錄下發(fā)生了變化,NameNode會(huì)進(jìn)行主備切換。
5. ZooKeeper和YARN的關(guān)系
ZooKeeper與YARN的關(guān)系如下圖所示。

- 在系統(tǒng)啟動(dòng)時(shí),ResourceManager會(huì)嘗試把選舉信息寫(xiě)入ZooKeeper,第一個(gè)成功寫(xiě)入ZooKeeper的ResourceManager被選舉為Active ResourceManager,另一個(gè)為Standby ResourceManager。Standby ResourceManager定時(shí)去ZooKeeper監(jiān)控Active ResourceManager選舉信息。
- Active ResourceManager還會(huì)在ZooKeeper中創(chuàng)建Statestore目錄,存儲(chǔ)Application相關(guān)信息。當(dāng)Active ResourceManager產(chǎn)生故障時(shí),Standby ResourceManager會(huì)從Statestore目錄獲取Application相關(guān)信息,恢復(fù)數(shù)據(jù)。
6. ZooKeeper和HBase的關(guān)系
ZooKeeper與HBase的關(guān)系如下圖所示。

- HRegionServer以Ephemeral node的方式注冊(cè)到ZooKeeper中。其中ZooKeeper存儲(chǔ)HBase的如下信息:HBase元數(shù)據(jù)、HMaster地址。
- HMaster通過(guò)ZooKeeper隨時(shí)感知各個(gè)HRegionServer的健康狀況,以便進(jìn)行控制管理。
- .HBase也可以部署多個(gè)HMaster,類似HDFS NameNode,當(dāng)HMaster主節(jié)點(diǎn)出現(xiàn)故障時(shí),HMaster備用節(jié)點(diǎn)會(huì)通過(guò)ZooKeeper獲取主HMaster存儲(chǔ)的整個(gè)HBase集群狀態(tài)信息。即通過(guò)ZooKeeper實(shí)現(xiàn)避免HBase單點(diǎn)故障問(wèn)題的問(wèn)題。
7. Zookeeper和SmallFS的配合關(guān)系
FGCService的部署模式為HA模式。HA(High Availability)模式目的是防止單節(jié)點(diǎn)故障導(dǎo)致服務(wù)不可用。為了支持HA模式,F(xiàn)GCService依賴于ZooKeeper。

8. ZooKeeper和Kafka的配合關(guān)系
ZooKeeper與Kafka的關(guān)系如下圖 ZooKeeper和Kafka的關(guān)系所示。

Broker端使用ZooKeeper用來(lái)注冊(cè)broker信息,并進(jìn)行partition leader選舉Consumer端使用ZooKeeper用來(lái)注冊(cè)consumer信息,其中包括consumer·消費(fèi)的partition列表等,同時(shí)也用來(lái)發(fā)現(xiàn)broker列表,并和partition leader建立socket連接,并獲取消息。
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
RabbitMQ 在 Spring Boot 項(xiàng)目中的深度應(yīng)用與實(shí)戰(zhàn)解析
RabbitMQ 作為一款廣受歡迎的開(kāi)源消息隊(duì)列系統(tǒng),遵循 AMQP 協(xié)議,能夠在分布式系統(tǒng)里實(shí)現(xiàn)應(yīng)用程序之間的異步通信、解耦以及流量削峰等關(guān)鍵功能,這篇文章主要介紹了RabbitMQ 在 Spring Boot 項(xiàng)目中的深度應(yīng)用與實(shí)戰(zhàn)解析,需要的朋友可以參考下2025-01-01
java實(shí)現(xiàn)簡(jiǎn)單登錄界面的實(shí)戰(zhàn)過(guò)程
學(xué)習(xí)JAVA的過(guò)程當(dāng)中,登陸界面是多數(shù)人第一個(gè)實(shí)現(xiàn)的小程序,下面這篇文章主要給大家介紹了關(guān)于利用java實(shí)現(xiàn)簡(jiǎn)單登錄界面的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-05-05
java增強(qiáng)for循環(huán)的實(shí)現(xiàn)方法
下面小編就為大家?guī)?lái)一篇java增強(qiáng)for循環(huán)的實(shí)現(xiàn)方法。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2016-09-09
java實(shí)現(xiàn)python session功能代碼實(shí)例
這篇文章主要介紹了java實(shí)現(xiàn)python session功能代碼實(shí)例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-11-11
阿里SpringBoot應(yīng)用自動(dòng)化部署實(shí)現(xiàn)IDEA版Jenkins
這篇文章主要為大家介紹了阿里SpringBoot應(yīng)用自動(dòng)化部署實(shí)現(xiàn)IDEA版Jenkins過(guò)程詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-07-07
Java核心庫(kù)實(shí)現(xiàn)簡(jiǎn)單的AOP
這篇文章主要介紹了如何用Java核心庫(kù)實(shí)現(xiàn)簡(jiǎn)單的AOP,幫助大家為了更好的理解和學(xué)習(xí)AOP的思想,感興趣的朋友可以了解下2020-08-08
Java獲取文件的類型和擴(kuò)展名的實(shí)現(xiàn)方法
這篇文章主要介紹了Java獲取文件的類型和擴(kuò)展名的實(shí)現(xiàn)方法的相關(guān)資料,需要的朋友可以參考下2017-02-02
用Java將字符串的首字母轉(zhuǎn)換大小寫(xiě)
在項(xiàng)目開(kāi)發(fā)的時(shí)候會(huì)需要統(tǒng)一字符串的格式,比如首字母要求統(tǒng)一大寫(xiě)或小寫(xiě),那用Java如何實(shí)現(xiàn)這一功能?下面一起來(lái)學(xué)習(xí)學(xué)習(xí)。2016-08-08

