Blog

Elasticsearch - Recuperar shard de índice corrupto

Los datos indexados por Elasticsearch pueden quedar corruptos por multitud de motivos: problemas de escritura en disco, pérdida de conectividad entre nodos del cluster, saturación del procesamiento en la actualización de un índice..etc.

 

Percibimos que algo no va bien en el funcionamiento del cluster y podemos ver trazas de error en el log de Elasticsearch con esta pinta:

 

[2015-09-11 15:38:08,966][WARN ][indices.cluster          ] [node02-es] [.marvel-2015.09.08][0] failed to start shard

org.apache.lucene.index.CorruptIndexException: [.marvel-2015.09.08][0] Preexisting corrupted index [corrupted_X3JsoXgtTUCnkG9CZMpxTQ] caused by: CorruptIndexE

xception[codec footer mismatch: actual footer=67117057 vs expected footer=-1071082520 (resource: NIOFSIndexInput(path="/elasticsearch-data/es-blink-eu/nodes/0

/indices/.marvel-2015.09.08/0/index/_ffo_es090_0.doc"))]

[2015-09-11 15:38:09,174][WARN ][index.engine.internal    ] [node02-es] [.marvel-2015.09.08][0] failed engine [corrupted preexisting index]

org.apache.lucene.index.CorruptIndexException: [.marvel-2015.09.08][0] Preexisting corrupted index [corrupted_ukrNlPgARIiFqa8tWgFbLg] caused by: CorruptIndexE

xception[codec footer mismatch: actual footer=84346119 vs expected footer=-1071082520 (resource: NIOFSIndexInput(path="/elasticsearch-data/es-blink-eu/nodes/0

/indices/.marvel-2015.09.08/0/index/_dhx_es090_0.pos"))]

 

Normalmente detectamos estos errores en los logs de elasticsearch porque no puede "recolocar" un fragmento (shard) de un índice en un nodo y lo da por corrupto. Al consultar la salud del cluster recibimos status "yellow" o "red" en el peor de los casos con shards sin nodo asignado.

 

Comprobamos el estado del cluster:

 # curl 'localhost:9200/_cluster/health?&pretty'

{

 "cluster_name" : "cluster-name-es",

 "status" : "yellow",

 "timed_out" : false,

 "number_of_nodes" : 2,

 "number_of_data_nodes" : 2,

 "active_primary_shards" : 106,

 "active_shards" : 212,

 "relocating_shards" : 0,

 "initializing_shards" : 0,

 "unassigned_shards" : 3

}

 

Para repararlo lo que tenemos que hacer es "reenrutarlo" a un nodo de forma manual. Para ello vemos los índices que están en estado UNASSIGNED:

 

curl -XGET http://localhost:9200/_cat/shards

.marvel-2015.09.07  0 r STARTED  555970 544.1mb 10.0.5.189 node02-es

.marvel-2015.09.07  0 p STARTED  555970 544.1mb 10.0.4.150 node01-es

.marvel-2015.09.08  0 r UNASSIGNED

.marvel-2015.09.08  0 p STARTED  544992 537.5mb 10.0.4.150 node01-es

logstash-2015.08.31 0 r STARTED 3536373   1.3gb 10.0.5.189 node02-es

logstash-2015.08.31 0 p STARTED 3536373   1.3gb 10.0.4.150 node01-es

logstash-2015.08.31 3 r UNASSIGNED

logstash-2015.08.31 3 p STARTED 3536596   1.3gb 10.0.4.150 node01-es

 

En este ejemplo vemos que el índice ".marvel-2015.09.08" shard "0" de tipo recovery (r) no tiene nodo asignado.

 

Para solucionarlo haremos lo siguiente:

 

  • Localizamos los ficheros de metadatos del shard afectado en la ruta donde almacenamos los datos de elasticsearch y lo renombramos:

 

 

root@node02-es:/elasticsearch-data/cluster-name-es/nodes/0/indices/.marvel-2015.09.08# ls -l

total 8

drwxr-xr-x 5 elasticsearch elasticsearch 4096 Sep  8 02:00 0

drwxr-xr-x 2 elasticsearch elasticsearch 4096 Sep  8 02:00 _state

root@node02-es:/elasticsearch-data/cluster-name-es/nodes/0/indices/.marvel-2015.09.08# mv 0 0.backup

 

  • Reenrutamos manualmente el shard que lo buscará en la copia (recovery) o del shard primario si está correcto. Lo reconstruirá en el nodo que le indicamos en el comando: 

curl -XPOST 'localhost:9200/_cluster/reroute' -d '{

   "commands" : [ {

       "allocate" : {

           "index" : ".marvel-2015.09.08",

           "shard" : 0,

           "node" : "node02-es",

           "allow_primary" : true

       }

     } ]

}'

 

 

  • Esto creará denuevo el shard y lo asigna al nodo. Después podremos borrar el backup anterior.

 

root@node02-es:/elasticsearch-data/cluster-name-es/nodes/0/indices/.marvel-2015.09.08# rm -rf 0.backup

 

No es necesario reiniciar elasticsearch de este nodo pero es recomendable para verificar que lo dejamos en un estado estable. Comprobaremos que todos los shard están correctos si recibimos el status "green" en la salud del cluster:

 

# curl 'localhost:9200/_cluster/health?&pretty'

{

 "cluster_name" : "cluster-name-es",

 "status" : "green",

 "timed_out" : false,

 "number_of_nodes" : 2,

 "number_of_data_nodes" : 2,

 "active_primary_shards" : 106,

 "active_shards" : 212,

 "relocating_shards" : 0,

 "initializing_shards" : 0,

 "unassigned_shards" : 0

}

 

En sistemas, como en otros ámbitos del mundo tecnológico, no siempre funcionan bien las cosas a la primera. Si no os permite recuperar en el nodo seleccionado probad a cambiar de nodo de datos siguiendo el mismo procedimiento anterior.

 

Cuando lo anterior no funciona, es necesario recuperar el índice desde el último snapshot.

 

  • Buscamos el nombre del último snapshot del repositorio configurado en los backups. 

curl -XGET "localhost:9200/_snapshot/backup_diario/_all"

 

 

  • Una vez tenemos el nombre del último snapshot, cerramos el índice afectado y lo recuperamos:

 

# repository: backup_diario

# snapshot: snapshot-2015-09-21_020004

# index: .marvel-2015.09.08

 

curl -XPOST 'localhost:9200/.marvel-2015.09.08/_close'

curl -XPOST "localhost:9200/_snapshot/backup_diario/snapshot-2015-09-21_020004/_restore?wait_for_completion=true&pretty" -d '{

   "indices": ".marvel-2015.09.08",

   "ignore_unavailable": "true",

   "include_global_state": "false"

}'

 

Ya recuperado correctamente volvemos a abrir el índice para que pueda aceptar nuevos datos:

 

# repository: backup_diario

# snapshot: snapshot-2015-09-21_020004

# index: .marvel-2015.09.08

curl -XPOST 'localhost:9200/.marvel-2015.09.08/_open' 

 
 
Espero que leer este artículo os haga la vida más fácil :-) .
 

Añadir nuevo comentario

Suscríbete a nuestra newsletter

Mantente al día y no te pierdas nada

¡Usamos cookies propias y de terceros para mejorar tu experiencia en esta web! Si sigues navegando, consientes y aceptas estas cookies en tu ordenador, móvil o tablet.

Más información sobre las cookies y cómo cambiar su configuración en tu navegador aquí.

x