无法在ElasticSearch IndexShardGatewayRecoveryException中启动分片"发送失败"

时间:2014-09-08 13:57:36

标签: elasticsearch sharding

我收到此错误,在我的ES日志中我使用了三个节点。

Caused by: java.lang.ArrayIndexOutOfBoundsException
[2014-09-08 13:53:56,167][WARN ][cluster.action.shard     ] [Dancing Destroyer] [events][3] sending failed shard for [events][3], node[RDZy21y7SRep7n6oWT8ogg], [P], s[INITIALIZING], indexUUID [gzj1aHTnQX6XDc0SxkvxDQ], reason [Failed to start shard, message [IndexShardGatewayRecoveryException[[events][3] failed recovery]; nested: FlushFailedEngineException[[events][3] Flush failed]; nested: ArrayIndexOutOfBoundsException; ]]
[2014-09-08 13:53:56,357][WARN ][indices.cluster          ] [Dancing Destroyer] [events][3] failed to start shard
org.elasticsearch.index.gateway.IndexShardGatewayRecoveryException: [events][3] failed recovery
        at org.elasticsearch.index.gateway.IndexShardGatewayService$1.run(IndexShardGatewayService.java:185)
        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.index.engine.FlushFailedEngineException: [events][3] Flush failed
        at org.elasticsearch.index.engine.internal.InternalEngine.flush(InternalEngine.java:805)
        at org.elasticsearch.index.shard.service.InternalIndexShard.performRecoveryFinalization(InternalIndexShard.java:726)
        at org.elasticsearch.index.gateway.local.LocalIndexShardGateway.recover(LocalIndexShardGateway.java:249)
        at org.elasticsearch.index.gateway.IndexShardGatewayService$1.run(IndexShardGatewayService.java:132)
        ... 3 more
Caused by: java.lang.ArrayIndexOutOfBoundsException
[2014-09-08 13:53:56,381][WARN ][cluster.action.shard     ] [Dancing Destroyer] [events][3] sending failed shard for [events][3], node[RDZy21y7SRep7n6oWT8ogg], [P], s[INITIALIZING], indexUUID [gzj1aHTnQX6XDc0SxkvxDQ], reason [Failed to start shard, message [IndexShardGatewayRecoveryException[[events][3] failed recovery]; nested: FlushFailedEngineException[[events][3] Flush failed]; nested: ArrayIndexOutOfBoundsException; ]]

这意味着ES的状态为红色,我丢失了近1000万份文档。 这个错误意味着什么,以便我能够恢复?

3 个答案:

答案 0 :(得分:12)

似乎我有一个混乱的碎片,需要修复。 这是Lucene的事情,你告诉Lucene修复碎片。

对于Ubuntu,解决方案是转到/usr/share/elasticsearch/lib目录并找出正在运行的Lucene核心版本(运行ls将显示一个名为lucene-core-4.8的文件。 1.jar)然后键入:

java -cp lucene-core-x.x.x.jar -ea:org.apache.lucene... org.apache.lucene.index.CheckIndex /var/lib/elasticsearch/<clustername>/nodes/0/indices/<index>/<shard>/index/ -fix

将x.x.x替换为Lucene核心版本,将您的clustername,索引替换为索引名称,当然还有失败的分片编号。

这可能会丢失文件

但它解决了我们的问题。

答案 1 :(得分:6)

我多次遇到这个问题。由于我的设置是阅读点击流数据(每天12-20M点击),我无法承受数据丢失。

所以这是我的解决方案,它运行得很漂亮:

<强>解决方案

  1. 停止运行的弹性搜索
  2. 转至/ path / to / my / data / mycluster_name / nodes / 0 / indices / myindex_name / index
  3. 删除segments.gen文件
  4. 启动elasticsearch
  5. 问题根本原因

    1. 由于各种原因,碎片失败,尤其是当碎片无法满足Kibana请求时。

    2. Lucene与此流程没有直接关系。因此,当存在问题时,elasticsearch无法有效地从存储在segments中的Lucene段引用中选择分片值.gen

    3. Lucene在下次运行中再次将此值设置为新值。因此,elasticsearch能够正确地引用这些值。并且碎片问题已解决。

答案 2 :(得分:2)

Repox获取提示。在Centos 6.5中,在使用Chef。

配置的logstash中内置了ElasticSearch

java -cp /opt/logstash/forwarder/vendor/jar/elasticsearch-1.1.1/lib/lucene-core-4.7.2.jar -ea:org.apache.lucene... org.apache.lucene.index.CheckIndex /opt/logstash/forwarder/data/elasticsearch/nodes/0/indices/logstash-2014.11.01/3/index/ -fix

但即使修复我仍然看到无法启动分片,消息...无法恢复分片。我必须使用例如curator delete --older-than 3破坏性地删除。