如何从Apache Cassandra CommitLogReplayException中恢复

4

在运行apache-cassandra 3.3时,我的Mac OS X出现了意外的关机。当我在新的引导加载程序中重新启动cassandra时,我遇到了以下错误:

INFO  15:25:15 Replaying /Users/eswenson/opt/apache-cassandra-3.5/bin/../data/commitlog/CommitLog-6-1461717351786.log, /Users/eswenson/opt/apache-cassandra-3.5/bin/../data/commitlog/CommitLog-6-1461717351787.log, /Users/eswenson/opt/apache-cassandra-3.5/bin/../data/commitlog/CommitLog-6-1461942807785.log, /Users/eswenson/opt/apache-cassandra-3.5/bin/../data/commitlog/CommitLog-6-1461943004975.log
ERROR 15:25:15 Exiting due to error while processing commit log during initialization.
org.apache.cassandra.db.commitlog.CommitLogReplayer$CommitLogReplayException: Encountered bad header at position 542295 of commit log /Users/eswenson/opt/apache-cassandra-3.5/bin/../data/commitlog/CommitLog-6-1461717351786.log, with bad position but valid CRC
        at org.apache.cassandra.db.commitlog.CommitLogReplayer.handleReplayError(CommitLogReplayer.java:611) [apache-cassandra-3.5.jar:3.5]
        at org.apache.cassandra.db.commitlog.SegmentReader$SegmentIterator.computeNext(SegmentReader.java:105) [apache-cassandra-3.5.jar:3.5]
        at org.apache.cassandra.db.commitlog.SegmentReader$SegmentIterator.computeNext(SegmentReader.java:78) [apache-cassandra-3.5.jar:3.5]
        at com.google.common.collect.AbstractIterator.tryToComputeNext(AbstractIterator.java:143) [guava-18.0.jar:na]
        at com.google.common.collect.AbstractIterator.hasNext(AbstractIterator.java:138) [guava-18.0.jar:na]
        at org.apache.cassandra.db.commitlog.CommitLogReplayer.recover(CommitLogReplayer.java:399) [apache-cassandra-3.5.jar:3.5]
        at org.apache.cassandra.db.commitlog.CommitLogReplayer.recover(CommitLogReplayer.java:236) [apache-cassandra-3.5.jar:3.5]
        at org.apache.cassandra.db.commitlog.CommitLog.recover(CommitLog.java:192) [apache-cassandra-3.5.jar:3.5]
        at org.apache.cassandra.db.commitlog.CommitLog.recover(CommitLog.java:172) [apache-cassandra-3.5.jar:3.5]
        at org.apache.cassandra.service.CassandraDaemon.setup(CassandraDaemon.java:283) [apache-cassandra-3.5.jar:3.5]
        at org.apache.cassandra.service.CassandraDaemon.activate(CassandraDaemon.java:551) [apache-cassandra-3.5.jar:3.5]
        at org.apache.cassandra.service.CassandraDaemon.main(CassandraDaemon.java:680) [apache-cassandra-3.5.jar:3.5]

我在Stack Overflow和Google上搜索,没有找到与此问题相同的帖子。我发现了一个相关问题https://issues.apache.org/jira/browse/CASSANDRA-9749,但这个问题已经解决了,与在检测到问题后继续执行而不是使用异常失败有关。
在这种情况下,我该怎么做?是否有恢复路径(假设没有快照可用)?是否有办法在有问题的记录处截断提交日志?是否有可用的工具来修复错误的头部(例如删除记录)?
谢谢。
3个回答

9

我在本地Mac OS上使用Cassandra时也遇到过这个异常。

如果您不关心提交日志中的数据或者您有备份,只需停止Cassandra,清理commitlog文件夹并重新启动即可。

恐怕没有其他选择。顺便问一下,您是在Mac OS上部署Cassandra用于生产吗?

  • 如果是,您应该知道Mac OS没有官方支持
  • 如果不是用于生产,那就无所谓了,清理commitlog并重新启动即可

我是Cassandra的新手...请告诉我如何开始使用Cassandra。 - H Raval

2

在 Windows 7(本地机器)环境下运行 Cassandra 时,我遇到了类似的问题。从日志中找到的异常是:

ERROR 07:14:35 初始化期间处理提交日志时出错而退出。 org.apache.cassandra.db.commitlog.CommitLogReplayer$CommitLogReplayException: 无法读取文件 C:\Program Files\DataStax-DDC\data\commitlog\CommitLog-6-1470969948498.log 中的提交日志描述符 at org.apache.cassandra.db.commitlog.CommitLogReplayer.handleReplayError(CommitLogReplayer.java:616) [apache-cassandra-3.7.0.jar:3.7.0] at org.apache.cassandra.db.commitlog.CommitLogReplayer.recover(CommitLogReplayer.java:378) [apache-cassandra-3.7.0.jar:3.7.0]

由于这只是一个测试设置,我删除了特定的提交日志文件,并通过 Windows 服务管理器重新启动它,它完美地启动了。如果在生产环境中出现此问题,我不确定该怎么办。


0

这是我在我的单节点开发系统上第二次遇到这个问题。如果jvm意外终止,似乎会出现这种情况。清除commitlog目录解决了这个问题。使用的是Windows 10。

让我担心的是,即使没有对数据库进行任何更新,我仍然会遇到这些错误问题。Cassandra不定期刷新吗?我不想因为服务器崩溃或类似的原因而在生产中遇到这样的问题,即使我有副本节点。

在stdout日志中,最后一部分是

INFO  06:17:39 Replaying C:\Program Files\DataStax-DDC\data\commitlog\CommitLog-6-1471353812251.log, C:\Program Files\DataStax-DDC\data\commitlog\CommitLog-6-1471353812252.log, C:\Program Files\DataStax-DDC\data\commitlog\CommitLog-6-1471411951134.log, C:\Program Files\DataStax-DDC\data\commitlog\CommitLog-6-1471454506802.log, C:\Program Files\DataStax-DDC\data\commitlog\CommitLog-6-1471532812678.log
ERROR 06:17:39 Exiting due to error while processing commit log during initialization.
org.apache.cassandra.db.commitlog.CommitLogReplayer$CommitLogReplayException: Could not read commit log descriptor in file C:\Program Files\DataStax-DDC\data\commitlog\CommitLog-6-1471353812252.log
    at org.apache.cassandra.db.commitlog.CommitLogReplayer.handleReplayError(CommitLogReplayer.java:611) [apache-cassandra-3.4.0.jar:3.4.0]
    at org.apache.cassandra.db.commitlog.CommitLogReplayer.recover(CommitLogReplayer.java:373) [apache-cassandra-3.4.0.jar:3.4.0]
    at org.apache.cassandra.db.commitlog.CommitLogReplayer.recover(CommitLogReplayer.java:236) [apache-cassandra-3.4.0.jar:3.4.0]
    at org.apache.cassandra.db.commitlog.CommitLog.recover(CommitLog.java:192) [apache-cassandra-3.4.0.jar:3.4.0]
    at org.apache.cassandra.db.commitlog.CommitLog.recover(CommitLog.java:172) [apache-cassandra-3.4.0.jar:3.4.0]
    at org.apache.cassandra.service.CassandraDaemon.setup(CassandraDaemon.java:283) [apache-cassandra-3.4.0.jar:3.4.0]
    at org.apache.cassandra.service.CassandraDaemon.activate(CassandraDaemon.java:551) [apache-cassandra-3.4.0.jar:3.4.0]
    at org.apache.cassandra.service.CassandraDaemon.main(CassandraDaemon.java:680) [apache-cassandra-3.4.0.jar:3.4.0]

我的配置文件显示,commitlog 每 10 秒同步一次,因此除非在这些 10 秒内发生崩溃,否则文件怎么会损坏呢? - mattias

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接