下载zookeeper-3.4.14 并解压
复制conf文件夹下zoo_sample.cfg 并重命名为zoo.cfg
并修改成如下配置
tickTime=2000 dataDir=/usr/local/zookeeper-3.4.14/data dataLogDir=/usr/local/zookeeper-3.4.14/logs clientPort=2181 initLimit=5 syncLimit=2
server.1=172.16.129.83:2888:3888 server.2=172.16.129.86:2888:3888 server.3=172.16.129.207:2888:3888 server.4=172.16.129.6:2888:3888 server.5=172.16.129.32:2888:3888 server.6=172.16.129.14:2888:3888 |
这样启动之后 发现zookeeper 显示启动成功但是查看status 是不正常启动
查看端口发现3888并没有启动
2181是zookeeper客户端连接的端口,所以进程号32143启动起来的,监听37271端口,但是zookeeper没有配置这个端口,而是配置2888,3888端口,正常情况下作为follower的时候是3888端口监听中,用于选举leader通讯。出现这个情况不得而知。重新启动该进程,上面一个端口号在不断的变化。至此问题是找到了,就是服务端进程没有监听配置的3888端口,而是监听了随机端口导致其它服务器进程无法与之通讯,所以看到了这个异常。
后来找到了一篇大佬分析源码的文章,
https://blog.csdn.net/u014284000/article/details/74508963#commentBox
ip地址不是本机网卡
原因很简单,这是云服务器,云服务器采用虚拟化的技术,监听的网卡是属于物理网关的网卡,而虚拟化机内部自然没有这个网卡。
这个时候真正的原因找到了,解决办法就是让服务器进程监听0.0.0.0的ip地址,也就是监听所有网卡。
QuorumCnxManager.java
发现前边有一个listenOnAllIPs这个参数,如果他是true,那么问题就解决了。于是向上级跟踪。找到QuorumPeerConfig.java中
于是在zoo.cfg中添加了
quorumListenOnAllIPs=true 解决
tickTime=2000 dataDir=/usr/local/zookeeper-3.4.14/data dataLogDir=/usr/local/zookeeper-3.4.14/logs clientPort=2181 initLimit=5 syncLimit=2 #server.1=172.16.129.83:3888 #server.2=172.16.129.86:3888 #server.3=172.16.129.207:3888 #server.4=172.16.129.6:3888 #server.5=172.16.129.32:3888 #server.6=172.16.129.14:3888 quorumListenOnAllIPs=true server.1=172.16.129.83:2888:3888 server.2=172.16.129.86:2888:3888 server.3=172.16.129.207:2888:3888 server.4=172.16.129.6:2888:3888 server.5=172.16.129.32:2888:3888 server.6=172.16.129.14:2888:3888 |
大佬原文
https://blog.csdn.net/u014284000/article/details/74508963#commentBox