Elasticsearch在崩溃后无法恢复
超出了磁盘空间并拧紧了elasticsearch碎片。现在有三个节点处于红色状态,两个节点已恢复并且状态为黄色。 ES在CPU上运行150%,内存高,试图恢复它们。但看起来像有一些版本匹配冲突。Elasticsearch在崩溃后无法恢复
我清理了磁盘空间并删除了分片的超时日志以停止从超时日志加载。但令人惊讶的是,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将尝试恢复碎片,包括尚未刷新到碎片索引本身的写入。这些都在超时日志中,所以如果您将其删除,您将丢失它们。然而,这比丢失碎片要好得多。在你的情况下,超时日志已经显示损坏,我不知道有任何方法来恢复它。
要除去被用于恢复损坏的事务日志,只是去除的超越对文件删除超越对中/var/lib/elasticsearch/<ES-NAME>/nodes/<NODE-NUMBER>/indices/<INDEX-NAME>/<SHARD-NUMBER>/translog/
为每个受影响的节点每个相关碎片。后面的部分很重要,因为您可能会看到集群尝试从另一个节点中删除碎片后从另一个节点重新生成碎片的转储日志。
碎片应该正确初始化,尽管通常可能需要一段时间才能完成。
非常感谢。这是一个非常简单的初学者清单! – ivspenna 2017-07-14 17:09:55
我不认为你可以恢复,而不失去任何数据从translog。尝试从日志中指定的两个分片中删除超时日志:分片4和分母2用于索引western_europe。 – 2014-10-31 06:24:07