1、zookeeper是什么蜜氨?
zookeeper是一個(gè)分布式服務(wù)框架械筛,基于文件系統(tǒng)+通知機(jī)制,解決分布式應(yīng)用的數(shù)據(jù)管理和協(xié)調(diào)問題飒炎,如:統(tǒng)一命名埋哟、狀態(tài)同步、集群管理厌丑、應(yīng)用配置項(xiàng)管理等定欧。
2、zookeeper工作機(jī)制
Zookeeper是基于觀察者模式設(shè)計(jì)的管理框架怒竿,它負(fù)責(zé)存儲(chǔ)和管理大家都關(guān)心的數(shù)據(jù)砍鸠,然后接受被觀察者的注冊,一旦這些數(shù)據(jù)的狀態(tài)發(fā)生變化耕驰,Zookeeper負(fù)責(zé)通知已注冊的被觀察者做出反應(yīng)爷辱。
雖然Zookeeper集群在配置時(shí),并不指定Master和Slave朦肘,但是在集群工作時(shí)饭弓,通過內(nèi)部選舉機(jī)制產(chǎn)生一個(gè)Leader,其他節(jié)點(diǎn)作為Follower媒抠。集群需要半數(shù)以上節(jié)點(diǎn)存活才可用弟断,所以適合安裝奇數(shù)臺(tái)server。
每個(gè)server保存一份相同的數(shù)據(jù)副本趴生,client無論連接到哪個(gè)server阀趴,數(shù)據(jù)都是一致的,同一個(gè)client的更新請求苍匆,按其發(fā)送順序依次執(zhí)行刘急,一次數(shù)據(jù)更新要么成功,要么失敗浸踩,在一定時(shí)間范圍內(nèi)叔汁,client能讀到最新數(shù)據(jù),保證數(shù)據(jù)一定的實(shí)時(shí)性。
3据块、應(yīng)用場景
1码邻、Hadoop的應(yīng)用
Hadoop采用排他鎖,來完成master的選舉瑰钮,控制同時(shí)只有一個(gè)active狀態(tài)的namenode和resourcemanager在工作冒滩。在yarn上跑任務(wù)時(shí),所有任務(wù)啟動(dòng)過程中都會(huì)把任務(wù)信息寫入zookeeper里面浪谴,假如執(zhí)行中active狀態(tài)的resourcemanager突然宕機(jī)了,standby狀態(tài)的節(jié)點(diǎn)轉(zhuǎn)換成active后因苹,會(huì)接管掛之前的任務(wù)苟耻,這樣resourcemanager主從的切換不會(huì)影響正在yarn運(yùn)行的任務(wù)。
2扶檐、hbase的應(yīng)用
zookeeper是hbase集群的"協(xié)調(diào)器"凶杖,hbase regionserver啟動(dòng)時(shí)會(huì)向zookeeper注冊,提供hbase regionserver的狀態(tài)信息(是否在線)款筑,HMaster通過watcher監(jiān)聽regionserver的存活情況智蝠。在HMaster啟動(dòng)時(shí),會(huì)將hbase系統(tǒng)表-ROOT- 加載到zookeeper cluster奈梳,通過zookeeper cluster可以獲取杈湾,當(dāng)前系統(tǒng)表.META.存儲(chǔ)的對應(yīng)的regionserver信息。
3攘须、kafka的應(yīng)用
kafka通過zookeeper做集群的管理漆撞,所有的broker在啟動(dòng)時(shí),會(huì)在zookeeper里面創(chuàng)建Znode于宙,通過事件監(jiān)聽的機(jī)制浮驳,在各個(gè)broker之間同步其他broker的存活狀態(tài)。在新topic創(chuàng)建時(shí)捞魁,kafka會(huì)把topic的name至会、partition、leader谱俭、topic分布信息等寫入zookeeper奉件,當(dāng)broker退出時(shí),會(huì)觸發(fā)zookeeper更新其對應(yīng)topic分區(qū)的isr列表旺上,并決定是否需要做消費(fèi)者的負(fù)載均衡瓶蚂。在新消費(fèi)者注冊時(shí),會(huì)在zookeeper中創(chuàng)建Znode保存信息宣吱,設(shè)置消費(fèi)者參數(shù)enable.auto.commit為true窃这,應(yīng)用消費(fèi)kafka數(shù)據(jù)時(shí)會(huì)自動(dòng)更新offset信息。
4、hive的應(yīng)用
hiveserver2使用zookeeper共享鎖進(jìn)行選舉杭攻,當(dāng)多個(gè)節(jié)點(diǎn)在zookeeper中注冊時(shí)祟敛,會(huì)創(chuàng)建有序的Znode臨時(shí)節(jié)點(diǎn),每個(gè)Znode都有一串?dāng)?shù)字后綴兆解,zookeeper默認(rèn)是從同一個(gè)鎖路徑下id最小的那個(gè)znode獲取鎖馆铁,設(shè)定對應(yīng)hiveserver2節(jié)點(diǎn)是主的狀態(tài)。假如這個(gè)節(jié)點(diǎn)掛了锅睛,這個(gè)znode會(huì)自動(dòng)刪除埠巨,watcher機(jī)制會(huì)通知另一個(gè)hiveserver2上位。同時(shí)现拒,為了支持并發(fā)讀寫的原子性辣垒,Hive使用表數(shù)據(jù)鎖機(jī)制,當(dāng)一個(gè)sql在insert數(shù)據(jù)時(shí)鎖住表印蔬,不讓其它sql去讀取表數(shù)據(jù)勋桶,等到釋放鎖之后,其它客戶端才能讀取這個(gè)表侥猬,hive表的鎖機(jī)制可通過hive.support.concurrency=true配置來開啟例驹。
4、Zookeeper分布式安裝
在三節(jié)點(diǎn)集群hadoop1退唠、hadoop2鹃锈、hadoop3上,進(jìn)行Zookeeper分布式部署铜邮,開始前確保jdk1.8已安裝仪召。
1、訪問zookeeper官網(wǎng)https://zookeeper.apache.org/releases.html松蒜,下載最新版二進(jìn)制安裝包扔茅,如apache-zookeeper-3.8.0-bin.tar.gz。
2秸苗、上傳安裝包到三個(gè)節(jié)點(diǎn)上召娜,分別進(jìn)行解壓安裝。
tar -zxvf apache-zookeeper-3.8.0-bin.tar.gz -C /usr
mv /usr/apache-zookeeper-3.8.0-bin /usr/zookeeper-3.8.0
cd /usr/zookeeper-3.8.0/conf
cp zoo_sample.cfg zoo.cfg
3惊楼、三個(gè)節(jié)點(diǎn)上玖瘸,修改vim zoo.cfg文件,配置以下內(nèi)容:
server1=hadoop1:2888:3888
server2=hadoop2:2888:3888
server3=hadoop3:2888:3888
4檀咙、三個(gè)節(jié)點(diǎn)雅倒,執(zhí)行啟動(dòng)zookeeper命令,查看狀態(tài)弧可。
bin/zkServer.sh start #啟動(dòng)服務(wù)
bin/zkServer.sh status #查看狀態(tài)
5蔑匣、zookeeper客戶端操作
新打開一個(gè)終端,執(zhí)行以下命令:
bin/zkCli.sh #啟動(dòng)客戶端
ls / #查看znode包含的內(nèi)容
ls2 / #查看znode節(jié)點(diǎn)詳細(xì)數(shù)據(jù)
create /test "mynode" #創(chuàng)建znode節(jié)點(diǎn)test
set /test "testnode" #修改節(jié)點(diǎn)值
get /test watch #監(jiān)聽節(jié)點(diǎn)的值的變化
delete /test #刪除節(jié)點(diǎn)