运行复制的ZooKeeper
这是一个意外发现的问题,查了一下后发现并无大碍,但也要记录一下。
在三台机器上启动zk后jps进程正常,选举正常,但是查看日志却发现有报错。
详细错误:[myid:1] - WARN [QuorumConnectionThread-[myid=1]-2:QuorumCnxManager@401] - Cannot open channel to 3 at election address worker2/192.168.221.103:3888
java.net.ConnectException: Connection refused (Connection refused)
起初我以为是防火墙、端口占用的原因,但我仔细一想不对啊,如果这种原因应该启动不来才对。在报了一堆警告后,又回归正常了
说明这个问题在中途被自动解决了???
要搞懂它,首先得从这个3888端口说起,3888是我在conf/zoo.cfg中手动指定的,官网着详细说明
tickTime=2000
dataDir=/var/lib/zookeeper
clientPort=2181
initLimit=5
syncLimit=2
server.1=zoo1:2888:3888
server.2=zoo2:2888:3888
server.3=zoo3:2888:3888
2888端口用来通信,准确的说是用来将follwer连接至leader的。而leader就是通过3888端口选举出来的。
所以最终这个问题的根源就是ZK的选举机制,有一篇文章写的很好,我直接拿过来
目前有5台服务器,每台服务器均没有数据,它们的编号分别是1,2,3,4,5,按编号依次启动,它们的选择举过程如下:
由于我的启动脚本是用一个while循环遍历三台机器去启动ZK的,所以worker2的ZK启动要等待worker1的ZK启动,而worker1的ZK启动又要等待master的ZK启动。这就造成了当一个ZK先启动时(master),会不断连接其他未启动的两台机器进行选举,等待剩下的机器ZK全部开启,选举过程结束,错误自然就消失了,各自切换成follower或leader的状态。
即使三台机器同时输入启动ZK的命令,也不能保证ZK的同时启动,所以这个警告不可避免,无需解决。
ZooKeeper Cannot open channel to 2 at election address worker1/192.168.221.102:3888
原文:https://www.cnblogs.com/pineapple-py/p/14773286.html