Zookeeper節(jié)點(diǎn)部署越多,服務(wù)的可靠性越高,建議部署奇數(shù)個(gè)節(jié)點(diǎn),因?yàn)閦ookeeper集群是以宕機(jī)個(gè)數(shù)過(guò)半才會(huì)讓整個(gè)集群宕機(jī)的.
但是隨著zookeeper的集群機(jī)器增多,讀請(qǐng)求的吞吐會(huì)提高但是寫(xiě)請(qǐng)求的吞吐會(huì)下降.
由于主機(jī)資源有限,這里只演示四臺(tái)zk主機(jī)的偽集群部署方式,真實(shí)的集群部署類似.
注意:我這里增加了第四臺(tái)zk服務(wù)器,這臺(tái)zk服務(wù)器比較特殊,他是作為觀察者存在的,不參與leader選舉.
1.修改配置文件/conf
由于這里是偽集群,所以不能使用默認(rèn)的配置文件zoo.cfg,這里創(chuàng)建四個(gè)配置文件
cp zoo.cfg zoo-1.cfg
cp zoo.cfg zoo-2.cfg
cp zoo.cfg zoo-3.cfg
cp zoo.cfg zoo-4.cfg
分別修改四個(gè)配置文件,主要修改數(shù)據(jù)目錄在跳、端口號(hào)、集群配置
比如zoo-1.cfg
dataDir=ZOOKEEPER_HOME/tmp/zookeeper/1
clientPort=2182
server.1=IP:2886:3886
server.2=IP:2887:3887
server.3=IP:2888:3888
server.4=IP:2889:3889:observer
其他3個(gè)配置文件類似,保證每個(gè)zk服務(wù)器的數(shù)據(jù)目錄和端口號(hào)不一樣,集群配置必須一致.
這里需要關(guān)注下zk集群的配置,格式:server.A=B:C:D[:observer]
A是一個(gè)數(shù)字,表示這個(gè)是第幾個(gè)zk服務(wù)器,這個(gè)數(shù)字后面集群選舉leader的時(shí)候會(huì)用到
B是這個(gè)zk服務(wù)器的IP地址,也可以設(shè)置為主機(jī)名
C是端口號(hào),用來(lái)集群成員的信息交換,表示這個(gè)服務(wù)器與集群中的leader服務(wù)器交換信息的端口
D是在leader掛掉時(shí)專門(mén)用來(lái)進(jìn)行選舉leader所用的端口
observer表示這臺(tái)zk服務(wù)器只作為觀察者存在,不參與leader選舉
2.在數(shù)據(jù)目錄下創(chuàng)建ServerID標(biāo)志
我們需要在zk的數(shù)據(jù)目錄下新建myid文件,文件內(nèi)如即當(dāng)前zk的A值.
在這里對(duì)第一個(gè)zk即在數(shù)據(jù)目錄ZOOKEEPER_HOME/tmp/zookeeper/1
下新建myid文件,文件內(nèi)容為1.其他幾個(gè)zk服務(wù)器配置類似.
3.啟動(dòng)深员、查看区匠、停止zk集群
由于是偽集群模式,我們需要告訴zk服務(wù)器使用的是哪個(gè)配置文件,默認(rèn)用的是conf/zoo.cfg
.
./zkServer.sh start ../conf/zoo-1.cfg
./zkServer.sh status ../conf/zoo-1.cfg
./zkServer.sh stop ../conf/zoo-1.cfg
我們分別啟動(dòng)zk1,zk2,zk3,zk4,查看zk集群的狀態(tài)
./zkServer.sh status ../conf/zoo-1.cfg
ZooKeeper JMX enabled by default
Using config: ../conf/zoo-1.cfg
Mode: follower
./zkServer.sh status ../conf/zoo-2.cfg
ZooKeeper JMX enabled by default
Using config: ../conf/zoo-2.cfg
Mode: leader
./zkServer.sh status ../conf/zoo-3.cfg
ZooKeeper JMX enabled by default
Using config: ../conf/zoo-3.cfg
Mode: follower
./zkServer.sh status ../conf/zoo-4.cfg
ZooKeeper JMX enabled by default
Using config: ../conf/zoo-4.cfg
Mode: observer
這個(gè)結(jié)果是可預(yù)知的.
當(dāng)啟動(dòng)zk1的時(shí)候,通過(guò)配置文件中配的端口號(hào)D嘗試與集群中的其他zk服務(wù)器通信進(jìn)行l(wèi)eader選舉.由于其他zk服務(wù)器都未啟動(dòng),zk1一直在嘗試連接然后被拒絕.
啟動(dòng)zk2,此時(shí)滿足了仲裁法定人數(shù)(集群服務(wù)器數(shù)量至少需要大于所有服務(wù)器一半數(shù)量,由于zk4是觀察者,不參與leader選舉,這里有效的zk服務(wù)器數(shù)2大于所有服務(wù)器3的一半)
zk1和zk2可以進(jìn)行l(wèi)eader選舉.
zookeeper的leader選舉規(guī)則很簡(jiǎn)單:優(yōu)先選zxid值最大的zk服務(wù)器,如果多個(gè)zk服務(wù)器擁有最新的zxid值,則取sid值最大的zk服務(wù)器. 注意,這里的sid即我們配置zk集群時(shí)的A值.
基于這個(gè)leader選舉規(guī)則,zk2被選舉為leader,zk1成為follower.
啟動(dòng)zk3,尋找到leader,跟隨leader,zk3成為follower.
啟動(dòng)zk4,成為observer.
注意:可以通過(guò)啟動(dòng)日志bin/zookeeper.out看到這個(gè)過(guò)程.