docker 搭建zookeeper Notification timeout

问题现象:

按照docker搭建zookeeper集群中步骤,安装完docker,配置好三台容器后,启动zookeeper环境。发现两台正常,一台报Notification timeout的日志。

《docker 搭建zookeeper Notification timeout》
《docker 搭建zookeeper Notification timeout》
《docker 搭建zookeeper Notification timeout》
《docker 搭建zookeeper Notification timeout》
《docker 搭建zookeeper Notification timeout》

而异常的原因是cannot assign requested address。该问题要么ip、port不通要么就是开启监听的server地址和发送消息的地址不对。

解决思路:

查看源码位置,发现在QuorumCnxManager.java文件中抛的异常

grep -r “Exception while listening” *

java/main/org/apache/zookeeper/server/quorum/QuorumCnxManager.java:                    LOG.error(“Exception while listening”, e);

找到异常,去上下看看是否有迹可循

《docker 搭建zookeeper Notification timeout》

然后,去日志看下绑定的ip、port是什么。发现Slave1的日志里打印出了信息

2018-06-15 01:28:53,612 [myid:3] – INFO [Slave2/172.17.0.4:3890:QuorumCnxManager$Listener@534] – My election bind port: Slave2/172.17.0.4:3890

我的zoo.cfg server配置如下

server.1=Master:2888:3888

server.2=Slave1:2889:3889

server.3=Slave2:2890:3890

参考“艾伦蓝”的博客介绍了

server.A=B:C:D:其中 A 是一个数字,表示这个是第几号服务器;B 是这个服务器的 ip 地址;C 表示的是这个服务器与集群中的 Leader 服务器交换信息的端口;D 表示的是万一集群中的 Leader 服务器挂了,需要一个端口来重新进行选举,选出一个新的 Leader,而这个端口就是用来执行选举时服务器相互通信的端口。如果是伪集群的配置方式,由于 B 都是一样,所以不同的 Zookeeper 实例通信端口号不能一样,所以要给它们分配不同的端口号。

也就是说我本地绑定的端口是server.3的端口。(看日志感觉应该起的server.2的3889才对!)

剩下的工作就是看看zookeeper配置文件如何加载,为什么解析的不正确!

回到刚才的源码,获取addr的地方:

addr = self.quorumPeers.get(self.getId()).electionAddr;

查看QuorumPeerConfig.java发现quorumPeers存的是server1,2,3的信息。那id是哪来的?

public long getId() {

        return myid;

    }

myid又是从哪里来的?

《docker 搭建zookeeper Notification timeout》

这个myid是解析myid的文件来的。

莫非是这个myid还要和server.#的值必须匹配起来?

server.2的myid必须是2。

查看Slave1和Slave2的myid文件,果然Slave1 写的3,Slave2写的2。

以上!得出结论修改Slave1和Slave2的myid文件为2,3。

问题解决!!

    原文作者:静息态
    原文地址: https://www.jianshu.com/p/4b0731ad9098
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞