【问题标题】:Elasticsearch failed to recover after crashElasticsearch 崩溃后无法恢复
【发布时间】:2023-03-24 19:41:01
【问题描述】:

磁盘空间用完,导致 elasticsearch 分片崩溃。三个节点现在是红色的,两个已经恢复并且它们的状态是黄色的。 ES 在 CPU 和内存上运行 150%,试图恢复它们。但看起来有一些版本匹配冲突。

我清理了磁盘空间并删除了一个分片的 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)

【问题讨论】:

  • 我不认为你可以在不丢失 translog 中的任何数据的情况下恢复。尝试从日志中指定的两个分片中删除 translog:索引 west_europe 的分片 4 和 2。

标签: elasticsearch recovery


【解决方案1】:

首先,检查分片本身是否存在问题。 cd/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/&lt;ES-NAME&gt;/nodes/&lt;NODE-NUMBER&gt;/indices/&lt;INDEX-NAME&gt;/&lt;SHARD-NUMBER&gt;/translog/中的translog文件每个受影响节点的每个相关分片删除translog。后一部分很重要,因为您可能会看到集群在从另一个节点删除分片后尝试从另一个节点重新生成分片的事务日志。

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

【讨论】:

  • 非常感谢。对于初学者来说,这是一个非常简单的清单!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-29
  • 1970-01-01
  • 1970-01-01
  • 2011-05-23
  • 2016-05-21
  • 1970-01-01
相关资源
最近更新 更多