web-dev-qa-db-ja.com

サーバーがクラッシュした後、Java.io.EOFExceptionからZookeeperを回復する方法は?

サーバーがクラッシュした後に発生した次のエラーから回復するにはどうすればよいですか? 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に感謝

12
user3395041

既知のApache ZooKeeperバグに遭遇したようです。これに関連するいくつかの異なるApache JIRA問題があります: ZOOKEEPER-1621 および ZOOKEEPER-2332 。根本原因の分析といくつかの潜在的な修正案に興味がある場合は、これらの問題のコメントを参照してください。

残念ながら、現時点ではバグの修正を含むApache ZooKeeperリリースはありません。あなたが試すことができるいくつかの潜在的な回避策があります:

  1. リンクされたJIRA課題に適用されたパッチの1つを適用して、ZooKeeperの独自のローカルビルドを作成します。これらのパッチはまだZooKeeperコミュニティに受け入れられていないため、自己責任で使用してください。
  2. 問題のあるログファイルを削除します。この問題の根本的な原因は、ZooKeeperの以前の実行からのログファイルが不完全なヘッダーで書き込まれたことです。ヘッダーはファイルの先頭にあり、ヘッダー自体は不完全であるため、その時点以降、ログファイルにトランザクションデータはないと想定できます。したがって、データを失うことなく削除しても安全です。
  3. 簡単な場合は、このZooKeeperクラスターを再フォーマットすることを検討してください。これは、ZooKeeperインストールのすべてのデータが一時的なものであり、長期間の永続化を必要としない場合に適切なソリューションになる場合があります。
7
Chris Nauroth

私にとっての解決策は、/ hadoop/zookeeper/version-2(またはdataDirがどこにあるかにかかわらず)で長さ0のログファイルを見つけて削除することでした。その後ZooKeeperを起動します。

21
Roshan Summun

私の解決策は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パターンを持っています

ログ.23c6a 70

スナップショット.23c6a 6e

それらは一致し、一貫している必要があり、この問題を修正する必要があります。

14
Chris