Skip to main content
 首页 » 编程设计

logging之ZooKeeper不断获取EndOfStreamException,从而导致崩溃

2025年05月04日299exmyth

我的Zookeeper通过在每个节点中保存相关的作业数据,直到计算机准备处理为止,从而为不同的作业控制几个不同的队列。
如果我停止了总体服务,则无法启动任何作业,ZooKeeper在重新启动后可以正常运行。但是,其中一些作业似乎导致ZooKeeper崩溃,并在ZooKeeper日志中显示以下消息:

WARN  [NIOServerCxn.Factory:0.0.0.0/0.0.0.0:2181:NIOServerCnxn@349] - caught end of stream exception 
EndOfStreamException: Unable to read additional data from client sessionid 0x15677f740ad002a, likely client has closed socket 
        at org.apache.zookeeper.server.NIOServerCnxn.doIO(NIOServerCnxn.java:220) 
        at org.apache.zookeeper.server.NIOServerCnxnFactory.run(NIOServerCnxnFactory.java:208) 
        at java.lang.Thread.run(Thread.java:745) 
INFO  [NIOServerCxn.Factory:0.0.0.0/0.0.0.0:2181:NIOServerCnxn@1001] - Closed socket connection for client /127.0.0.1:46998 which had sessionid 0x15677f740ad002a 

我的ZooKeeper知识非常有限,因为我是从最初设置它的人那里接手的。

我试图在zookeeper shell 中删除许多带有 rmr [path]的节点,这似乎有一定效果(删除了剩余的50k +个节点/没有用),但是它每天都崩溃,昨晚我无法让它运行超过几分钟,然后再发生相同的错误/崩溃。

我如何找出造成这种情况的原因?

我很确定这是收到的数据或存储的数据/节点的一些普遍问题。磁盘仅占92%。
我也找到了这篇文章: Zookeeper keeps getting the WARN: "caught end of stream exception",但是该解决方案对我而言并没有多大意义。另外,我很确定znodes中保存的所有消息都不会超过1MB,但是我不确定如何确认这一点。

是否可以通过某种方式更改ZooKeeper日志,以便打印其他信息,例如在崩溃之前运行的znode的内容/名称?

请您参考如下方法:

我能够通过从运行ZooKeeper的服务器上删除所有Zookeeper快照和日志文件来解决此问题。我不知道为什么会有所不同,但最近22个小时一直运行良好。