Zookeeper- Error contacting service. It is probably not running解決方案和原理


 搭建啟動Zookeeper集群出現Error contacting service. It is probably not running解決方案和原理

1.關閉防火牆 

[root@srv01 bin]# zkServer.sh start
JMX enabled by default
Using config: /usr/zookeeper/bin/../conf/zoo.cfg
Starting zookeeper ... STARTED

 2.檢查zookeeper狀態 

[root@srv01 bin]# zkServer.sh status
JMX enabled by default
Using config: /usr/zookeeper/bin/../conf/zoo.cfg
Error contacting service. It is probably not running.

 3.查看log日志文件

[root@srv01 bin]# cat zookeeper.out

以下是相關Exception:

2017-08-04 14:39:01,523 [myid:1] - INFO  [QuorumPeer[myid=1]/0:0:0:0:0:0:0:0:2181:FastLeaderElection@849] - Notification time out: 60000
2017-08-04 14:40:01,525 [myid:1] - WARN  [QuorumPeer[myid=1]/0:0:0:0:0:0:0:0:2181:QuorumCnxManager@382] - Cannot open channel to 2 at election address srv02/192.168.1.89:3888 java.net.ConnectException: 拒絕連接 (Connection refused)
	at java.net.PlainSocketImpl.socketConnect(Native Method)
	at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:350)
	at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:206)
	at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:188)
	at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392)
	at java.net.Socket.connect(Socket.java:589)
	at org.apache.zookeeper.server.quorum.QuorumCnxManager.connectOne(QuorumCnxManager.java:368)
	at org.apache.zookeeper.server.quorum.QuorumCnxManager.connectAll(QuorumCnxManager.java:402)
	at org.apache.zookeeper.server.quorum.FastLeaderElection.lookForLeader(FastLeaderElection.java:840)
	at org.apache.zookeeper.server.quorum.QuorumPeer.run(QuorumPeer.java:762)
2017-08-04 14:40:01,528 [myid:1] - WARN  [QuorumPeer[myid=1]/0:0:0:0:0:0:0:0:2181:QuorumCnxManager@382] - Cannot open channel to 3 at election address srv03/192.168.1.90:3888
java.net.ConnectException: 拒絕連接 (Connection refused)
	at java.net.PlainSocketImpl.socketConnect(Native Method)
	at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:350)
	at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:206)
	at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:188)
	at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392)
	at java.net.Socket.connect(Socket.java:589)
	at org.apache.zookeeper.server.quorum.QuorumCnxManager.connectOne(QuorumCnxManager.java:368)
	at org.apache.zookeeper.server.quorum.QuorumCnxManager.connectAll(QuorumCnxManager.java:402)
	at org.apache.zookeeper.server.quorum.FastLeaderElection.lookForLeader(FastLeaderElection.java:840)
	at org.apache.zookeeper.server.quorum.QuorumPeer.run(QuorumPeer.java:762)
2017-08-04 14:40:01,529 [myid:1] - INFO  [QuorumPeer[myid=1]/0:0:0:0:0:0:0:0:2181:FastLeaderElection@849] - Notification time out: 60000
2017-08-04 14:40:43,444 [myid:1] - INFO  [NIOServerCxn.Factory:0.0.0.0/0.0.0.0:2181:NIOServerCnxnFactory@197] - Accepted socket connection from /127.0.0.1:58217
2017-08-04 14:40:43,444 [myid:1] - INFO  [NIOServerCxn.Factory:0.0.0.0/0.0.0.0:2181:NIOServerCnxn@827] - Processing srvr command from /127.0.0.1:58217
2017-08-04 14:40:43,445 [myid:1] - INFO  [Thread-3:NIOServerCnxn@1007] - Closed socket connection for client /127.0.0.1:58217 (no session established for client)

注意顏色字體,意思是無法打開選舉通道2和3,造成的原因是,zookeeper集群開啟時有個選舉過程,此時我僅開啟一台機器,由於其他兩台機器沒有開啟,它發出去的報文沒有任何響應,導致它的選舉狀態一直處於LOOKING狀態。

同時把另外兩台機器srv02,srv03開啟,3台機器組網形成集群,立即選舉出leader就能清晰地看到zookeeper集群的狀態了。

用命令 jps 查看進程是否開啟

 

要清晰的處理這個問題就要從zookeeper的選舉機制來了解

 簡單的例子來說明整個選舉的過程.

 

zookeeper的選舉機制(全新集群paxos)
以一個簡單的例子來說明整個選舉的過程. 假設有五台服務器組成的zookeeper集群,它們的id從1-5,同時它們都是最新啟動的,也就是沒有歷史數據,在存放數據量這一點上,都是一樣的.假設這些服務器依序啟動,來看看會發生什么. 1) 服務器1啟動,此時只有它一台服務器啟動了,它發出去的報沒有任何響應,所以它的選舉狀態一直是LOOKING狀態 2) 服務器2啟動,它與最開始啟動的服務器1進行通信,互相交換自己的選舉結果,由於兩者都沒有歷史數據,所以id值較大的服務器2勝出,但是由於沒有達到超過半數以上的服務器都同意選舉它(這個例子中的半數以上是3),所以服務器1,2還是繼續保持LOOKING狀態. 3) 服務器3啟動,根據前面的理論分析,服務器3成為服務器1,2,3中的老大,而與上面不同的是,此時有三台服務器選舉了它,所以它成為了這次選舉的leader. 4) 服務器4啟動,根據前面的分析,理論上服務器4應該是服務器1,2,3,4中最大的,但是由於前面已經有半數以上的服務器選舉了服務器3,所以它只能接收當小弟的命了. 5) 服務器5啟動,同4一樣,當小弟. 

非全新集群的選舉機制(數據恢復)

那么,初始化的時候,是按照上述的說明進行選舉的,但是當zookeeper運行了一段時間之后,有機器down掉,重新選舉時,選舉過程就相對復雜了。 需要加入數據id、leader id和邏輯時鍾。 數據id:數據新的id就大,數據每次更新都會更新id。 Leader id:就是我們配置的myid中的值,每個機器一個。 邏輯時鍾:這個值從0開始遞增,每次選舉對應一個值,也就是說: 如果在同一次選舉中,那么這個值應該是一致的 ; 邏輯時鍾值越大,說明這一次選舉leader的進程更新. 選舉的標准就變成:

    1、邏輯時鍾小的選舉結果被忽略,重新投票     2、統一邏輯時鍾后,數據id大的勝出     3、數據id相同的情況下,leader id大的勝出 根據這個規則選出leader。

 


免責聲明!

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



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