1.概述
一个环境zookeeper总是无故停止,然后我去手动拉起后过一段时间就会挂掉了。今天终于忍不住去看看为什么总是挂在,日志里里面看到有如下报错
2017-10-01 11:36:55,983 [myid:0] - WARN [RecvWorker:0:QuorumCnxManager$RecvWorker@762] - Connection broken for id 0, my id = 0, error =
java.io.EOFException
at java.io.DataInputStream.readInt(DataInputStream.java:392)
at org.apache.zookeeper.server.quorum.QuorumCnxManager$RecvWorker.run(QuorumCnxManager.java:747)
2017-10-01 11:36:55,983 [myid:0] - WARN [RecvWorker:0:QuorumCnxManager$RecvWorker@765] - Interrupting SendWorker
2017-10-01 11:36:55,984 [myid:0] - WARN [SendWorker:0:QuorumCnxManager$SendWorker@679] - Interrupted while waiting for message on queue
java.lang.InterruptedException
at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.reportInterruptAfterWait(AbstractQueuedSynchronizer.java:2
017)
at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.awaitNanos(AbstractQueuedSynchronizer.java:2095)
at java.util.concurrent.ArrayBlockingQueue.poll(ArrayBlockingQueue.java:389)
at org.apache.zookeeper.server.quorum.QuorumCnxManager.pollSendQueue(QuorumCnxManager.java:831)
at org.apache.zookeeper.server.quorum.QuorumCnxManager.access$500(QuorumCnxManager.java:62)
at org.apache.zookeeper.server.quorum.QuorumCnxManager$SendWorker.run(QuorumCnxManager.java:667)
2017-10-01 11:36:55,985 [myid:0] - WARN [SendWorker:0:QuorumCnxManager$SendWorker@688] - Send worker leaving thread
2017-10-01 11:37:00,222 [myid:0] - ERROR [QuorumPeer[myid=0]/0:0:0:0:0:0:0:0:2181:Learner@229] - Unexpected exception
java.net.ConnectException: Connection refused
at java.net.PlainSocketImpl.socketConnect(Native Method)
at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:339)
at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:200)
at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:182)
at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392)
at java.net.Socket.connect(Socket.java:579)
at org.apache.zookeeper.server.quorum.Learner.connectToLeader(Learner.java:224)
at org.apache.zookeeper.server.quorum.Follower.followLeader(Follower.java:71)
at org.apache.zookeeper.server.quorum.QuorumPeer.run(QuorumPeer.java:740)
还没找到相关解决方案
相似的问题参考:zookeeper 重启报错 发送数据报错
- 网络通信问题:
java.io.EOFException 表示在读取数据时遇到了文件结束符,通常意味着在预期的数据未完全到达时连接被关闭。这可能是因为Zookeeper集群中的节点之间网络不稳定或有节点异常下线导致的。
java.net.ConnectException: Connection refused 表明尝试连接到Leader节点时被拒绝,可能是由于Leader节点不可达或者网络层面的问题。
- 选举与同步问题:
当节点间通信中断时,Zookeeper的仲裁机制会受到影响,节点无法正常进行选举和数据同步,进而可能导致整个集群服务不可用。
解决此类问题可以按照以下步骤进行排查和处理:
检查Zookeeper集群中所有节点的网络状况,确保它们之间能够正常通信,没有防火墙、安全组规则或其他网络配置的阻隔。
查看集群配置文件(zoo.cfg),确认各个节点的myid设置是否正确,以及server列表配置无误。
检查服务器资源使用情况(CPU、内存、磁盘空间等),避免因资源耗尽导致节点崩溃。
验证集群中其他节点的日志,了解是否有类似错误以及是否存在潜在的 Leader 节点故障。
如果是临时性的网络波动造成的问题,可以适当增加Zookeeper的session超时时间和重试次数等相关配置参数,提高其对网络抖动的容忍度。根据这些信息,建议您重点检查集群节点间的网络连接,并确保Zookeeper集群配置正确无误。