【问题标题】:How to recover Zookeeper from java.io.EOFException after a server crash?服务器崩溃后如何从 java.io.EOFException 恢复 Zookeeper?
【发布时间】:2017-10-28 07:07:23
【问题描述】:

如何从服务器崩溃后开始发生的以下错误中恢复? Zookeeper 不会启动,并且在日志中重复显示以下消息。

2017-05-27 01:02:08,072 [myid:] - INFO [main:Environment@100] - Server environment:java.library.path=/usr/java/packages/lib/amd64:/usr/lib64:/lib64:/lib:/usr/lib 
2017-05-27 01:02:08,072 [myid:] - INFO [main:Environment@100] - Server environment:java.io.tmpdir=/tmp 
2017-05-27 01:02:08,072 [myid:] - INFO [main:Environment@100] - Server environment:java.compiler=<NA> 
2017-05-27 01:02:08,072 [myid:] - INFO [main:Environment@100] - Server environment:os.name=Linux 
2017-05-27 01:02:08,072 [myid:] - INFO [main:Environment@100] - Server environment:os.arch=amd64 
2017-05-27 01:02:08,073 [myid:] - INFO [main:Environment@100] - Server environment:os.version=3.10.0-514.16.1.el7.x86_64 
2017-05-27 01:02:08,073 [myid:] - INFO [main:Environment@100] - Server environment:user.name=zookeeper 
2017-05-27 01:02:08,073 [myid:] - INFO [main:Environment@100] - Server environment:user.home=/opt/zookeeper 
2017-05-27 01:02:08,073 [myid:] - INFO [main:Environment@100] - Server environment:user.dir=/ 
2017-05-27 01:02:08,074 [myid:] - INFO [main:ZooKeeperServer@829] - tickTime set to 2000 
2017-05-27 01:02:08,074 [myid:] - INFO [main:ZooKeeperServer@838] - minSessionTimeout set to -1 
2017-05-27 01:02:08,074 [myid:] - INFO [main:ZooKeeperServer@847] - maxSessionTimeout set to -1 
2017-05-27 01:02:08,080 [myid:] - INFO [main:NIOServerCnxnFactory@89] - binding to port 0.0.0.0/0.0.0.0:2181 
2017-05-27 01:02:08,385 [myid:] - ERROR [main:Util@239] - Last transaction was partial. 
2017-05-27 01:02:08,400 [myid:] - ERROR [main:Util@239] - Last transaction was partial. 
2017-05-27 01:02:08,403 [myid:] - ERROR [main:Util@239] - Last transaction was partial. 
2017-05-27 01:02:08,403 [myid:] - ERROR [main:Util@239] - Last transaction was partial. 
2017-05-27 01:02:08,404 [myid:] - ERROR [main:Util@239] - Last transaction was partial. 
2017-05-27 01:02:08,404 [myid:] - ERROR [main:ZooKeeperServerMain@64] - Unexpected exception, exiting abnormally 
java.io.EOFException 
at java.io.DataInputStream.readInt(DataInputStream.java:392) 
at org.apache.jute.BinaryInputArchive.readInt(BinaryInputArchive.java:63) 
at org.apache.zookeeper.server.persistence.FileHeader.deserialize(FileHeader.java:64) 
at org.apache.zookeeper.server.persistence.FileTxnLog$FileTxnIterator.inStreamCreated(FileTxnLog.java:585) 
at org.apache.zookeeper.server.persistence.FileTxnLog$FileTxnIterator.createInputArchive(FileTxnLog.java:604) 
at org.apache.zookeeper.server.persistence.FileTxnLog$FileTxnIterator.goToNextLog(FileTxnLog.java:570) 
at org.apache.zookeeper.server.persistence.FileTxnLog$FileTxnIterator.next(FileTxnLog.java:652) 
at org.apache.zookeeper.server.persistence.FileTxnSnapLog.restore(FileTxnSnapLog.java:166) 
at org.apache.zookeeper.server.ZKDatabase.loadDataBase(ZKDatabase.java:223) 
at org.apache.zookeeper.server.ZooKeeperServer.loadData(ZooKeeperServer.java:283) 
at org.apache.zookeeper.server.ZooKeeperServer.startdata(ZooKeeperServer.java:410) 
at org.apache.zookeeper.server.NIOServerCnxnFactory.startup(NIOServerCnxnFactory.java:118) 
at org.apache.zookeeper.server.ZooKeeperServerMain.runFromConfig(ZooKeeperServerMain.java:119) 
at org.apache.zookeeper.server.ZooKeeperServerMain.initializeAndRun(ZooKeeperServerMain.java:87) 
at org.apache.zookeeper.server.ZooKeeperServerMain.main(ZooKeeperServerMain.java:53) 
at org.apache.zookeeper.server.quorum.QuorumPeerMain.initializeAndRun(QuorumPeerMain.java:116) 
at org.apache.zookeeper.server.quorum.QuorumPeerMain.main(QuorumPeerMain.java:78)

谢谢 IPVP

【问题讨论】:

    标签: apache-zookeeper


    【解决方案1】:

    我的解决方案是找到 last 日志文件(长度为 0 字节)

    您会在version-2 目录中找到它

    ls -l -r --sort=time
    
    -rw-r--r-- 1 chris chris  67108880 Jan 24 10:37 log.23c6a70
    -rw-r--r-- 1 chris chris         0 Jan 24 10:37 log.23d3fb4
    

    我首先尝试删除快照和最后 2 个日志文件,它们也可以正常工作,但你会得到“有点”旧的版本。

    -rw-r--r-- 1 chris chris  3685904 Jan 24 00:56 snapshot.23c6a6e
    

    也许你必须同时删除最后一个快照文件和最后一个日志文件以及 0 长度的日志文件才能安全。

    顺便说一句。日志文件和快照具有相同的 HEX 模式,必须匹配

    日志。23c6a70

    快照。23c6a6e

    它们必须匹配并保持一致,您应该解决此问题。

    【讨论】:

      【解决方案2】:

      我的解决方案是在 /hadoop/zookeeper/version-2 (或您的 dataDir 所在的任何位置)中找到长度为 0 的日志文件并将其删除。 之后启动 ZooKeeper。

      【讨论】:

      • 当我收到这条消息时,包含我的数据目录的分区已满,所以我也必须给它一些空间。
      • 这部分对我有用。删除该文件后,我看到了@GordonGustafson 所述的java.io.IOException: No space left on device 实际错误
      【解决方案3】:

      您似乎遇到了一个已知的 Apache ZooKeeper 错误。有几个不同的 Apache JIRA 问题与此相关:ZOOKEEPER-1621ZOOKEEPER-2332。如果您对根本原因分析和一些潜在的建议修复感兴趣,请查看这些问题中的 cmets。

      不幸的是,目前没有包含该错误修复的 Apache ZooKeeper 版本。您可以尝试一些潜在的解决方法:

      1. 使用附加到链接的 JIRA 问题的补丁之一创建您自己的 ZooKeeper 本地版本。请注意,ZooKeeper 社区尚未接受这些补丁,因此使用风险自负。
      2. 删除有问题的日志文件。问题的根本原因是之前运行 ZooKeeper 的日志文件使用不完整的标头写入。由于标头位于文件的开头,并且标头本身不完整,因此我们可以假设在该点之后的日志文件中没有事务数据。因此,删除应该是安全的,不会造成任何数据丢失。
      3. 如果更简单,您可以考虑重新格式化这个 ZooKeeper 集群。如果 ZooKeeper 安装中的所有数据都是短暂的并且不需要长期持久性,这可能是一个合适的解决方案。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-03-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-05-18
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多