崩溃后,Elasticsearch无法恢复



磁盘空间用完,导致弹性搜索碎片被破坏。三个节点现在为红色,两个已恢复,状态为黄色。ES正在运行150%的CPU和高内存,试图恢复它们。但看起来有一些版本匹配冲突。

我清理了磁盘空间,并删除了translog作为碎片,以停止从translog加载。但令人惊讶的是,translog又被创建了!

请分享我如何停止从translog恢复并恢复正常索引操作的尝试。我不想删除碎片数据。

[2014-10-31 03:11:43,742][WARN ][cluster.action.shard     ] [Angela Cairn] [western_europe][4] sending failed shard for [western_europe][4], node[x5M73qVXS5eZIBdz40boEg], [P], s[INITIALIZING], indexUUID [wy-tIJqdQiynz5SGQ2IrGA], reason [Failed to start shard, message [IndexShardGatewayRecoveryException[[western_europe][4] failed to recover shard]; nested: ElasticsearchException[failed to read [tweet][527924645014818817]]; nested: ElasticsearchIllegalArgumentException[No version type match [101]]; ]]
[2014-10-31 03:11:43,742][WARN ][cluster.action.shard     ] [Angela Cairn] [western_europe][4] received shard failed for [western_europe][4], node[x5M73qVXS5eZIBdz40boEg], [P], s[INITIALIZING], indexUUID [wy-tIJqdQiynz5SGQ2IrGA], reason [Failed to start shard, message [IndexShardGatewayRecoveryException[[western_europe][4] failed to recover shard]; nested: ElasticsearchException[failed to read [tweet][527924645014818817]]; nested: ElasticsearchIllegalArgumentException[No version type match [101]]; ]]
[2014-10-31 03:11:43,859][WARN ][indices.cluster          ] [Angela Cairn] [western_europe][2] failed to start shard
org.elasticsearch.index.gateway.IndexShardGatewayRecoveryException: [western_europe][2] failed to recover shard
    at org.elasticsearch.index.gateway.local.LocalIndexShardGateway.recover(LocalIndexShardGateway.java:269)
    at org.elasticsearch.index.gateway.IndexShardGatewayService$1.run(IndexShardGatewayService.java:132)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
    at java.lang.Thread.run(Thread.java:744)
Caused by: org.elasticsearch.ElasticsearchException: failed to read [tweet][527936245440065536]
    at org.elasticsearch.index.translog.Translog$Index.readFrom(Translog.java:511)
    at org.elasticsearch.index.translog.TranslogStreams.readTranslogOperation(TranslogStreams.java:52)
    at org.elasticsearch.index.gateway.local.LocalIndexShardGateway.recover(LocalIndexShardGateway.java:241)
    ... 4 more
Caused by: org.elasticsearch.ElasticsearchIllegalArgumentException: No version type match [116]
    at org.elasticsearch.index.VersionType.fromValue(VersionType.java:307)
    at org.elasticsearch.index.translog.Translog$Index.readFrom(Translog.java:508)

首先,检查碎片本身是否真的没有问题。cd到yout /usr/share/elasticsearch/lib目录或等效目录,并使用Lucene的CheckIndex,如下所示:

java -cp "*" -ea:org.apache.lucene... org.apache.lucene.index.CheckIndex /var/lib/elasticsearch/<ES-NAME>/nodes/<NODE-NUMBER>/indices/<INDEX-NAME>/<SHARD-NUMBER/index/

这将检查碎片是否有问题,如果碎片很大,则需要一段时间。

请注意,如果Java类路径错误,一些所需的jar文件将丢失,CheckIndex可能会抛出错误,并错误地声明碎片中的所有段都已损坏,因此请仔细阅读输出。

如果碎片有问题,并且您没有其他方法来恢复它,则使用-fix参数运行相同的命令将修复碎片,但会丢失数据。CheckIndex将警告您将从碎片中丢失多少文档(如果有的话)。

如果CheckIndex报告碎片一切正常,那么希望您的问题只是在translog中。事务日志是一个写前日志,ElasticSearch用于原子性。崩溃后,ES将尝试恢复碎片,包括尚未刷新到碎片索引本身的写入。这些都在translog中,因此如果删除它,您将丢失它们。然而,这比失去碎片要好得多。在你的情况下,translog已经出现损坏,我不知道任何方法来恢复它。

要删除用于恢复的损坏事务日志,只需删除每个受影响节点的每个相关碎片的/var/lib/elasticsearch/<ES-NAME>/nodes/<NODE-NUMBER>/indices/<INDEX-NAME>/<SHARD-NUMBER>/translog/中的translog文件即可删除translog。后一部分很重要,因为您可能会看到集群在从另一个节点删除碎片后,试图从另一节点重新生成碎片的translog。

然后碎片应该正确初始化,尽管像往常一样可能需要一段时间才能完成。

相关内容

  • 没有找到相关文章

最新更新