一,用來作為demo操作的zookeeper集群中的實例:
機器名:zk1 server.1=172.18.1.1:2888:3888 機器名:zk2 server.2=172.18.1.2:2888:3888 機器名:zk3 server.3=172.18.1.3:2888:3888
說明:劉宏締的架構森林是一個專注架構的博客,地址:https://www.cnblogs.com/architectforest
對應的源碼可以訪問這里獲取: https://github.com/liuhongdi/
說明:作者:劉宏締 郵箱: 371125307@qq.com
二,在zookeeper集群中動態添加實例
1,我們的目標:添加兩台實例:
機器名:zk4 server.4=172.18.1.4:2888:3888 機器名:zk5 server.5=172.18.1.5:2888:3888
2,在兩台新機器上安裝zookeeper,
使非集群相關的配置與之前的三台:zk1,zk2,zk3相一致
3,設置兩個容器中zookeeper的cluster配置,使加入集群
修改zoo.cfg,集群的配置為:(新加的兩台機器上相同)
[root@zk4 conf]# vi zoo.cfg
集群配置的內容為:
#cluster server.1=172.18.1.1:2888:3888 server.2=172.18.1.2:2888:3888 server.3=172.18.1.3:2888:3888 server.4=172.18.1.4:2888:3888 server.5=172.18.1.5:2888:3888
配置myid
[root@zk4 conf]# cd /data/zookeeper/data [root@zk4 data]# vi myid
說明:
myid要區分開,
172.18.1.4上面,把myid設置為4
172.18.1.5上面,把myid設置為5
必須與zoo.cfg中的配置序號4、5保持一致
配置完成后,分別重啟兩個zookeeper服務:
zk4
[root@zk4 data]# systemctl stop zookeeper
[root@zk4 data]# systemctl start zookeeper
zk5
[root@zk5 data]# systemctl stop zookeeper
[root@zk5 data]# systemctl start zookeeper
4,查看效果
zk4
[root@zk4 data]# echo srvr | nc 127.0.0.1 2181 Zookeeper version: 3.6.0--b4c89dc7f6083829e18fae6e446907ae0b1f22d7, built on 02/25/2020 14:38 GMT Latency min/avg/max: 0/0.0/0 Received: 1 Sent: 0 Connections: 1 Outstanding: 0 Zxid: 0x100000000 Mode: follower Node count: 5
mode是follower,證明已加入集群
zk5:
[root@zk5 data]# echo srvr | nc 127.0.0.1 2181 Zookeeper version: 3.6.0--b4c89dc7f6083829e18fae6e446907ae0b1f22d7, built on 02/25/2020 14:38 GMT Latency min/avg/max: 0/0.0/0 Received: 1 Sent: 0 Connections: 1 Outstanding: 0 Zxid: 0x100000000 Mode: follower Node count: 5
兩個實例的mode都是follower
5,集群中原有的三台機器的處理:
zk1,zk2,zk3
以zk1為例:
修改集群的配置,使與新加入的機器zk4\zk5的配置一致:
[root@zk1 conf]# vi zoo.cfg
內容:
#cluster server.1=172.18.1.1:2888:3888 server.2=172.18.1.2:2888:3888 server.3=172.18.1.3:2888:3888 server.4=172.18.1.4:2888:3888 server.5=172.18.1.5:2888:3888
重啟服務:
[root@zk1 conf]# systemctl stop zookeeper
[root@zk1 conf]# systemctl start zookeeper
zk2/zk3上,依次進行相同的操作即可
說明:從leader實例上查詢follower的數量:
[root@zk4 data]# echo mntr | nc 127.0.0.1 2181 | grep follower zk_synced_followers 4
說明:有4個follower
這個數值是根據集群中的成員數量實時得到的,
如果有實例宕掉,此數量會改變
三,zookeeper集群中動態刪除實例:
1,我們的目標:刪除兩台實例:
機器名:zk5 server.5=172.18.1.5:2888:3888 機器名:zk4 server.4=172.18.1.4:2888:3888
說明:這兩台里面zk4是leader,zk5是follower
說明:如果不關閉zk5/zk4,直接修改zk1/zk2/zk3的配置后重啟,會發生問題:
以zk1為例:重啟后會因為集群中沒有leader,而導致zk1無法訪問.
2,操作步驟:
先關閉zk4和zk5
[root@zk4 conf]# systemctl stop zookeeper
[root@zk5 data]# systemctl stop zookeeper
說明:先關閉這兩台,這樣leader會自動從剩下的三台中選出,
可以避免因為沒有leader導致集群無法訪問的情況
再查看各個實例上的狀態
zk1:follower
zk2:follower
zk3:leader
再給zk1,zk2,zk3修改配置重啟
以zk1為例:
修改配置文件
[root@zk1 conf]# vi zoo.cfg
修改內容為:
#cluster server.1=172.18.1.1:2888:3888 server.2=172.18.1.2:2888:3888 server.3=172.18.1.3:2888:3888 #server.4=172.18.1.4:2888:3888 #server.5=172.18.1.5:2888:3888
說明:注釋掉了4和5
重啟服務:
[root@zk1 conf]# systemctl stop zookeeper
[root@zk1 conf]# systemctl start zookeeper
查看狀態:
[root@zk1 conf]# echo stat | nc 127.0.0.1 2181 Zookeeper version: 3.6.0--b4c89dc7f6083829e18fae6e446907ae0b1f22d7, built on 02/25/2020 14:38 GMT Clients: /127.0.0.1:53110[0](queued=0,recved=1,sent=0) Latency min/avg/max: 0/0.0/0 Received: 2 Sent: 1 Connections: 1 Outstanding: 0 Zxid: 0x700000000 Mode: follower Node count: 10
訪問正常,mode還是follower
zk2/zk3上的操作與之相同
四,zookeeper cluster報錯信息:
例:
[root@zk1 conf]# echo stat | nc 127.0.0.1 2181 This ZooKeeper instance is not currently serving requests
報錯原因:集群里面沒有選出來leader,
如果集群里的結點只剩下一台,或不足半數時,會給出這個錯誤提示
解決:
1,
檢查各節點:如果有誤關閉的或宕機的實例,重新啟動,保證其正常工作
2,
檢查防火牆,是否打開集群之間通信的2888/3888端口
如果這兩個端口被關閉,打開它
五,查看zookeeper的版本
[root@zk1 ~]# echo stat|nc 127.0.0.1 2181 Zookeeper version: 3.6.0--b4c89dc7f6083829e18fae6e446907ae0b1f22d7, built on 02/25/2020 14:38 GMT