問題現(xiàn)象:
按照docker搭建zookeeper集群中步驟矮瘟,安裝完docker瞳脓,配置好三臺容器后,啟動zookeeper環(huán)境澈侠。發(fā)現(xiàn)兩臺正常劫侧,一臺報Notification timeout的日志。
而異常的原因是cannot assign requested address。該問題要么ip烧栋、port不通要么就是開啟監(jiān)聽的server地址和發(fā)送消息的地址不對写妥。
解決思路:
查看源碼位置,發(fā)現(xiàn)在QuorumCnxManager.java文件中拋的異常
grep -r "Exception while listening" *
java/main/org/apache/zookeeper/server/quorum/QuorumCnxManager.java:? ? ? ? ? ? ? ? ? ? LOG.error("Exception while listening", e);
找到異常劲弦,去上下看看是否有跡可循
然后耳标,去日志看下綁定的ip、port是什么邑跪。發(fā)現(xiàn)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 是一個數(shù)字次坡,表示這個是第幾號服務(wù)器;B 是這個服務(wù)器的 ip 地址画畅;C 表示的是這個服務(wù)器與集群中的 Leader 服務(wù)器交換信息的端口砸琅;D 表示的是萬一集群中的 Leader 服務(wù)器掛了,需要一個端口來重新進行選舉轴踱,選出一個新的 Leader症脂,而這個端口就是用來執(zhí)行選舉時服務(wù)器相互通信的端口。如果是偽集群的配置方式淫僻,由于 B 都是一樣诱篷,所以不同的 Zookeeper 實例通信端口號不能一樣,所以要給它們分配不同的端口號雳灵。
也就是說我本地綁定的端口是server.3的端口棕所。(看日志感覺應(yīng)該起的server.2的3889才對!)
剩下的工作就是看看zookeeper配置文件如何加載悯辙,為什么解析的不正確琳省!
回到剛才的源碼,獲取addr的地方:
addr = self.quorumPeers.get(self.getId()).electionAddr;
查看QuorumPeerConfig.java發(fā)現(xiàn)quorumPeers存的是server1躲撰,2针贬,3的信息。那id是哪來的拢蛋?
public long getId() {
? ? ? ? return myid;
? ? }
myid又是從哪里來的桦他?
這個myid是解析myid的文件來的。
莫非是這個myid還要和server.#的值必須匹配起來谆棱?
server.2的myid必須是2快压。
查看Slave1和Slave2的myid文件,果然Slave1 寫的3础锐,Slave2寫的2。
以上荧缘!得出結(jié)論修改Slave1和Slave2的myid文件為2皆警,3。
問題解決=卮帧信姓!