ZooKeeper命令基本操作
cd /opt/module/zookeeper-3.5.7/bin
#啟動(dòng)服務(wù)端
./zkServer.sh start
#啟動(dòng)客戶(hù)端
./zkCli.sh
#查看zookeeper狀態(tài)
./zkServer.sh status
#退出客戶(hù)端
quit
#關(guān)閉zookeeper
./zkServer.sh stop
#查看當(dāng)前進(jìn)程的全限定名
./jps -l
配置文件說(shuō)明
# 通信心跳時(shí)間,zookeeper服務(wù)器和客戶(hù)端心跳時(shí)間(單位ms)
tickTime=2000
# LF初始化通信時(shí)限,Leader和Flower初始連接時(shí)最長(zhǎng)的等待時(shí)間(10*tickTime),也就是20s還未建立連接則認(rèn)為通信失敗
initLimit=10
# LF同步通信時(shí)限,Leader和Flower建立連接后仍然保持心跳聯(lián)系,超過(guò)(5*syncLimit)認(rèn)為Flower死亡,從服務(wù)器目錄刪除Flower。
syncLimit=5
# 保存zookeeper數(shù)據(jù)的目錄
dataDir=/opt/module/zookeeper-3.5.7/zkData
# 客戶(hù)端端口號(hào)
clientPort=2181
集群配置
????????在zookeeper的zkData目錄(我們自己指定的存放zookeeper數(shù)據(jù)的目錄)下創(chuàng)建一個(gè)名為"myid"的文件(必須為myid)。
????????在myid中添加與服務(wù)器對(duì)應(yīng)的數(shù)字編號(hào),比如hadoop102就配置數(shù)字編號(hào) "2" (在整個(gè)zookeeper集群中唯一,所以分發(fā)zookeeper后,必須修改自己的myid)。我們需要在zoo.cfg的末行增加配置信息:
server.2=hadoop102:2888:3888
server.3=hadoop103:2888:3888
server.4=hadoop104:2888:3888
#server.2代表myid=2的服務(wù)器
#hadoop102對(duì)應(yīng)我們hadoop102的地址:192.168.88.134
#2888: Leader和Flower的通信端口
#3888: 如果集群中唯一的Leader掛了,通過(guò)這個(gè)端口來(lái)重新選舉Leader
????????因?yàn)槲覀兣渲昧巳_(tái)服務(wù)器,所以根據(jù)上一節(jié)說(shuō)到的要求,我們必須啟動(dòng)半數(shù)以上(至少兩臺(tái))的服務(wù)器zookeeper才能啟動(dòng)成功。
ZooKeeper的選舉機(jī)制
三個(gè)屬性
SID
????????服務(wù)器ID。用來(lái)唯一標(biāo)識(shí)每一臺(tái)ZooKeeper集群中的機(jī)器,和myid一致。
ZXID
????????它可以用來(lái)確保ZooKeeper的數(shù)據(jù)一致性。zxid是一個(gè)單調(diào)遞增的計(jì)數(shù)器,它是由ZooKeeper服務(wù)器在處理每個(gè)事務(wù)時(shí)生成。
Epoch
????????每個(gè)Leader任期的代號(hào)。
第一次啟動(dòng)時(shí)
以我們的集群為例(三臺(tái)服務(wù)器hadoop102、hadoop103、hadoop104)
- hadoop102啟動(dòng),發(fā)起選舉,hadoop102投自己一票。但是此時(shí)hadoop102只有一票,不夠半數(shù)以上(1<3/2=1.5),選舉無(wú)法完成,hadoop102保持LOOKING狀態(tài)(觀望狀態(tài));
- hadoop103啟動(dòng),此時(shí)zookeeper集群中服務(wù)器節(jié)點(diǎn)數(shù)量(2)>半數(shù)(1.5),zookeeper啟動(dòng)成功,這時(shí)候就需要選舉出一個(gè)Leader了。
- 于是再次發(fā)起選舉,hadoop102已經(jīng)投過(guò)了(投給了自己),hadoop103也投自己一票,此時(shí)hadoop102和hadoop103各自一票。為了避免僵持狀態(tài),hadoop102和hadoop103互相交換選票信息,此時(shí)hadoop102發(fā)現(xiàn)hadoop103的myid (3) 比自己 (2) 大,于是hadoop102將自己的選票投給hadoop103,此時(shí)hadoop103票數(shù)=2,hadoop102票數(shù)=0,hadoop103成功選為L(zhǎng)eader,狀態(tài)改為L(zhǎng)EADING,而hadoop102自動(dòng)變?yōu)镕lower,狀態(tài)改為L(zhǎng)EADING。
- 這時(shí)候,hadoop104姍姍來(lái)遲,才剛剛啟動(dòng),于是又發(fā)起一次選舉,hadoop104同樣投給自己,但這時(shí)候已經(jīng)存在Leader了,所以自己只能做Flower了。
zookeeper的選舉機(jī)制是:只要投票過(guò)半數(shù),服務(wù)器 id(myid)大的 直接勝出。
????????比如這個(gè)案例,盡管hadoop104比hadoop102和hadoop103的myid和服務(wù)器id都要大,但是因?yàn)楫?dāng)hadoop102和hadoop103啟動(dòng)的時(shí)候,已經(jīng)超過(guò)了半數(shù)的要求,直接就開(kāi)始選舉并且hadoop103勝出,所以即使hadoop104的myid比hadoop103更大也沒(méi)用。
非第一次啟動(dòng)
除了服務(wù)器初始化啟動(dòng),當(dāng)服務(wù)器節(jié)點(diǎn)無(wú)法和Leader保持連接的時(shí)候,也會(huì)進(jìn)行Leader選舉。
集群中確實(shí)不存在Leader(比如 Leader掛掉了)?
選舉Leader的規(guī)則:
前提:節(jié)點(diǎn)數(shù)達(dá)到一半以上
比較優(yōu)先級(jí):
- Epoch大的直接勝出
- Epoch相同,ZXID大的勝出
- ZXID相同,SID大的勝出
集群中存在Leader,但是節(jié)點(diǎn)沒(méi)有連接上
????????這種情況下,某個(gè)節(jié)點(diǎn)自認(rèn)為L(zhǎng)eader不存在,想要試圖去選舉Leader,當(dāng)它向其它節(jié)點(diǎn)交換選票的時(shí)候,會(huì)被告知Leader是存在的并告訴Leader的信息,該節(jié)點(diǎn)只需要與Leader建立連接即可。
安裝ZooKeeper服務(wù)器的個(gè)數(shù)
基本原則是安裝奇數(shù)臺(tái)。
生產(chǎn)經(jīng)驗(yàn):
- 10 臺(tái)服務(wù)器:3 臺(tái) zk;
- 20 臺(tái)服務(wù)器:5 臺(tái) zk;
- 100 臺(tái)服務(wù)器:11 臺(tái) zk;
- 200 臺(tái)服務(wù)器:11 臺(tái) zk;
服務(wù)器臺(tái)數(shù)多:好處:提高可靠性;壞處:提高通信延時(shí)。所以不見(jiàn)得越多越好。
ZooKeeper群起腳本
#!/bin/bash
case $1 in
"start"){
for i in hadoop102 hadoop103 hadoop104
do
echo "========== zookeeper $i 啟動(dòng) ============"
ssh $i "/opt/module/zookeeper-3.5.7/bin/zkServer.sh start"
done
}
;;
"stop"){
for i in hadoop102 hadoop103 hadoop104
do
echo "========== zookeeper $i 關(guān)閉 ============"
ssh $i "/opt/module/zookeeper-3.5.7/bin/zkServer.sh stop"
done
}
;;
"status"){
for i in hadoop102 hadoop103 hadoop104
do
echo "========== zookeeper $i 狀態(tài) ============"
ssh $i "/opt/module/zookeeper-3.5.7/bin/zkServer.sh status"
done
}
;;
esac
注意:
????????不能直接從windows復(fù)制腳本文件過(guò)去,會(huì)報(bào)錯(cuò)文件中有windows的換行符。文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-481348.html
????????可以從windows復(fù)制腳本內(nèi)容,然后粘貼到linux的vim編輯器這樣是沒(méi)問(wèn)題的。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-481348.html
到了這里,關(guān)于ZooKeeper【集群模式】的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!