ZooKeeper Cannot open channel to 2 at election address worker1/192.168.221.102:3888


項目場景

運行復制的ZooKeeper

問題描述

這是一個意外發現的問題,查了一下后發現並無大礙,但也要記錄一下。

在三台機器上啟動zk后jps進程正常,選舉正常,但是查看日志卻發現有報錯。

image-20210514230900355

image-20210514231049378

詳細錯誤:[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)

原因分析

起初我以為是防火牆、端口占用的原因,但我仔細一想不對啊,如果這種原因應該啟動不來才對。在報了一堆警告后,又回歸正常了

image-20210514231422554

說明這個問題在中途被自動解決了???

要搞懂它,首先得從這個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,按編號依次啟動,它們的選擇舉過程如下:

  • 服務器1啟動,給自己投票,然后發投票信息,由於其它機器還沒有啟動所以它收不到反饋信息,服務器1的狀態一直屬於Looking(選舉狀態)。
  • 服務器2啟動,給自己投票,同時與之前啟動的服務器1交換結果,由於服務器2的編號大所以服務器2勝出,但此時投票數沒有大於半數,所以兩個服務器的狀態依然是LOOKING。
  • 服務器3啟動,給自己投票,同時與之前啟動的服務器1,2交換信息,由於服務器3的編號最大所以服務器3勝出,此時投票數正好大於半數,所以服務器3成為領導者,服務器1,2成為小弟。
  • 服務器4啟動,給自己投票,同時與之前啟動的服務器1,2,3交換信息,盡管服務器4的編號大,但之前服務器3已經勝出,所以服務器4只能成為小弟。
  • 服務器5啟動,后面的邏輯同服務器4成為小弟。

由於我的啟動腳本是用一個while循環遍歷三台機器去啟動ZK的,所以worker2的ZK啟動要等待worker1的ZK啟動,而worker1的ZK啟動又要等待master的ZK啟動。這就造成了當一個ZK先啟動時(master),會不斷連接其他未啟動的兩台機器進行選舉,等待剩下的機器ZK全部開啟,選舉過程結束,錯誤自然就消失了,各自切換成follower或leader的狀態。

解決方案

即使三台機器同時輸入啟動ZK的命令,也不能保證ZK的同時啟動,所以這個警告不可避免,無需解決。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM