2014-09-08 10 views
9

Ho ricevuto questo errore, nel mio registro ES sto utilizzando tre nodi.Impossibile avviare il frammento in ElasticSearch IndexShardGatewayRecoveryException "invio non riuscito"

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; ]] 

Ciò significa che lo stato di ES è rosso e mi mancano quasi 10 milioni di documenti. Cosa significa questo errore, in modo che possa essere in grado di recuperare?

risposta

12

Sembra che avessi un frammento incasinato, che doveva essere riparato. È una cosa Lucene, dove dici a Lucene di aggiustare il frammento.

Per Ubuntu, la soluzione era quella di andare nella directory /usr/share/elasticsearch/lib e scoprire quale versione di nucleo Lucene si era in esecuzione (esecuzione ls vi mostrerà un file chiamato qualcosa come Lucene-core-4.8.1.jar) e quindi digitare :

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 

Sostituire il xxx con la versione di base Lucene, con il clustername, indice con il nome dell'indice e, naturalmente, con il numero di frammento in mancanza.

Ciò può potenzialmente dare una perdita di documenti

Ma è fisso il nostro problema.

+1

Avete altre informazioni sul perché questo è successo? Ci sono delle misure preventive che hai preso ?? –

+0

@EricUldall Sono il mio caso il mio server ha esaurito lo spazio su disco, il che probabilmente ha portato a ES scrivere dati parziali su disco. – Oleander

+1

Grazie per questo, hai salvato qualche problema. Ho creato un semplice [script ruby] (https://gist.github.com/atmosx/54a7e4904d4b36aea3bb) per correggerlo automaticamente. –

2

Indicazioni da Repox. In Centos 6.5 con ElasticSearch incorporato nel logstash fornito con Chef.

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

Ma anche con il fissaggio I vedi ancora Impossibile avviare shard, messaggio ... impossibile recuperare il frammento. Devo cancellare distruttivamente usando ad esempio curator delete --older-than 3.

5

Ho affrontato questo problema più volte. Poiché il mio set up è leggere i dati clickstream (12-20 milioni di accessi al giorno), non posso permettermi perdite di dati.

Quindi questa è stata la mia soluzione e funziona in modo bello:

Soluzione:

  1. arresto elasticsearch esecuzione
  2. andare a/path/to/my/dati/mycluster_name/nodi/0/indici/nomeindex/indice
  3. elimina segmenti.il file gen
  4. Inizio elasticsearch

Problema Root Cause

  1. Frammenti fallire per vari motivi, soprattutto quando frammenti non sono in grado di soddisfare le richieste Kibana.

  2. Lucene non è direttamente collegato a questo processo. Quindi quando ci sono problemi, elasticsearch non è in grado di selezionare in modo efficiente il valore shards dai riferimenti dei segmenti Lucene che sono memorizzati in segments.gen

  3. Lucene imposta nuovamente questo valore nella prossima esecuzione. Quindi elasticsearch è in grado di fare riferimento ai valori correttamente. E il problema relativo ai frammenti è stato risolto.

Problemi correlati