¿Cómo cambiar el nombre de un índice en un clúster?

110

Necesito cambiar el nombre de varios índices en un clúster (su nombre debe cambiarse, no puedo usar alias ).

Vi que no hay formas compatibles de hacer eso, lo más cercano que encontré es cambiar el nombre del directorio del índice , probé esto en un clúster.

El clúster tiene 3 máquinas A, By Cy los fragmentos se replican en cada uno de ellos. Apago el elasticsearch A, rebautizado /var/lib/elasticsearch/security/nodes/0/indices/oldindexnamea /var/lib/elasticsearch/security/nodes/0/indices/newindexnamey reiniciado A.

El estado del clúster era amarillo y elasticsearch estaba haciendo algo de magia para restaurar un estado correcto. Después de un tiempo terminé con

  • oldindexnameestar disponible y completamente replicado (recuperado de By Csupongo)
  • newindexname estando disponible (puedo buscarlo) pero el complemento principal muestra que sus fragmentos están en un estado "Sin asignar" y que están atenuados (no replicados)

Durante la recuperación security.logmostró el siguiente mensaje:

[2015-02-20 11:02:33,461][INFO ][gateway.local.state.meta ] [A.example.com] dangled index directory name is [newindexname], state name is [oldindexname], renaming to directory name

Si bien newindexnamese puede buscar, ciertamente no se encuentra en un estado normal.

Volví al estado anterior eliminando newindexname. El clúster vuelve a ponerse verde sin ninguna entrada "No asignada".

Dado eso, ¿cómo puedo cambiar el nombre oldindexnamea newindexnameen un clúster?

Nota: la solución definitiva que tengo en mente es al desplazamiento de copias oldindexen newindexy eliminar oldindexdespués. Esto llevará tiempo, así que si hay una solución más directa, sería genial.

WoJ
fuente

Respuestas:

19

A partir de ElasticSearch 7.4, el mejor método para cambiar el nombre de un índice es copiar el índice usando la API Clone Index recién introducida , luego eliminar el índice original usando la API Delete Index .

La principal ventaja de Clone Index API sobre el uso de Snapshot API o Reindex API para el mismo propósito es la velocidad, ya que Clone Index API hardlinks segmenta desde el índice de origen al índice de destino, sin reprocesar ninguno de sus contenidos (en sistemas de archivos que soportan enlaces duros, obviamente; de ​​lo contrario, los archivos se copian a nivel del sistema de archivos, que sigue siendo mucho más eficiente que las alternativas). Clone Index también garantiza que el índice de destino sea idéntico en todos los puntos al índice de origen (es decir, no es necesario copiar manualmente la configuración y las asignaciones, al contrario del enfoque Reindex), y no requiere que se configure un directorio de instantáneas local .

Nota al margen: aunque este procedimiento es mucho más rápido que las soluciones anteriores, todavía implica tiempo de inactividad. Hay casos de uso reales que justifican el cambio de nombre de los índices (por ejemplo, como un paso en un flujo de trabajo de división, reducción o copia de seguridad), pero el cambio de nombre de los índices no debe ser parte de las operaciones diarias. Si su flujo de trabajo requiere un cambio de nombre de índice frecuente, entonces debería considerar usar Alias ​​de índices en su lugar.

Aquí está un ejemplo de una secuencia completa de operaciones para cambiar el nombre de índice source_indexa target_index. Se puede ejecutar utilizando alguna consola específica de ElasticSearch, como la integrada en Kibana . Consulte esta esencia para obtener una versión alternativa de este ejemplo, utilizando en curllugar de una consola de Elastic Search.

# Make sure the source index is actually open
POST /source_index/_open

# Put the source index in read-only mode
PUT /source_index/_settings
{
  "settings": {
    "index.blocks.write": "true"
  }
}

# Clone the source index to the target name, and set the target to read-write mode
POST /source_index/_clone/target_index
{
  "settings": {
    "index.blocks.write": null 
  }
}

# Wait until the target index is green;
# it should usually be fast (assuming your filesystem supports hard links).
GET /_cluster/health/target_index?wait_for_status=green&timeout=30s

# If it appears to be taking too much time for the cluster to get back to green,
# the following requests might help you identify eventual outstanding issues (if any)
GET /_cat/indices/target_index
GET /_cat/recovery/target_index
GET /_cluster/allocation/explain

# Delete the source index
DELETE /source_index
jwatkins
fuente
163

Puede usar REINDEX para hacer eso.

Reindex no intenta configurar el índice de destino. No copia la configuración del índice de origen. Debe configurar el índice de destino antes de ejecutar una acción _reindex, incluida la configuración de asignaciones, recuentos de fragmentos, réplicas, etc.

  1. Primero copie el índice a un nuevo nombre
POST /_reindex
{
  "source": {
    "index": "twitter"
  },
  "dest": {
    "index": "new_twitter"
  }
}
  1. Ahora borre el índice
DELETE /twitter
réplica
fuente
Si bien esto requiere tener espacio para ambos índices (temporalmente), esto es simple y completamente en el servidor, por lo que parece ser la mejor solución hasta ahora (aunque el documento advierte sobre un estado 'experimental'). Gracias.
WoJ
2
¿Funciona esto si el mapeo tiene _source: {enabled: false}?
Harald
2
@Harald No, _reindexutiliza _sourcecomo datos del documento original.
Agop
6
Esto no va a copiar el mapeo de twitterque new_twitterpor lo que yo sé.
Nick
3
Estoy de acuerdo con la solución de _reindex, pero la pregunta debería cambiarse. Reindexar no es simplemente un cambio de nombre. Incluso puede cambiar la forma en que se indexan los datos.
lucabelluccini
62

Para cambiar el nombre de su índice, puede usar el módulo Elasticsearch Snapshot.

Primero debe tomar una instantánea de su índice. Mientras lo restaura, puede cambiar el nombre de su índice.

    POST /_snapshot/my_backup/snapshot_1/_restore
    {
     "indices": "jal",
     "ignore_unavailable": "true",
     "include_global_state": false,
     "rename_pattern": "jal",
     "rename_replacement": "jal1"
     }

rename_replacement: -Nuevo nombre de índice en el que desea hacer una copia de seguridad de sus datos.

Krishna Kumar
fuente
4
Holycrap, eso es increíblemente útil. ¡Gracias!
Chris Cogdon
1
¡Mucho mejor que la solución aceptada! Esta es en realidad una copia binaria del índice, por lo que no hay riesgo de perder nada y no requiere _sourceestar habilitado en el índice. He cambiado el nombre de algunos índices de múltiples TB de esta manera sin ningún problema.
Chaqueta
2
@Jacket: me alegra saber que mi respuesta realmente te ayuda.
krishna kumar
1
Estoy de acuerdo, una solución mucho mejor, sin problemas de pérdida de datos, mucho MÁS RÁPIDO también para índices grandes que reindexar
Romain Hautefeuille
1
¿Conserva el mapeo?
Amogh Mishra
5

Como tal, no existe un método directo para copiar o cambiar el nombre del índice en ES (busqué extensamente mi propio proyecto)

Sin embargo, una opción muy fácil es utilizar una herramienta de migración popular [Elastic-Exporter].

http://www.retailmenot.com/corp/eng/posts/2014/12/02/elasticsearch-cluster-migration/

[PD: este no es mi blog, solo lo encontré y lo encontré bien]

De este modo, puede copiar el índice / tipo y luego eliminar el anterior.

perezoso
fuente
El enlace ya no funciona. ¿Algún otro lugar donde podamos encontrarlo o tener esta información?
elachell
5

Si no puede REINDEX, una solución alternativa es usar alias . Del oficial documentación :

Las API en elasticsearch aceptan un nombre de índice cuando se trabaja con un índice específico y varios índices cuando corresponde. La API de alias de índice permite alias de un índice con un nombre, y todas las API convierten automáticamente el nombre de alias en el nombre del índice real. Un alias también se puede asignar a más de un índice y, al especificarlo, el alias se expandirá automáticamente a los índices de alias. También se puede asociar un alias con un filtro que se aplicará automáticamente al buscar y enrutar valores. Un alias no puede tener el mismo nombre que un índice.

Tenga en cuenta que esta solución no funciona si utiliza la función Más como este. https://github.com/elastic/elasticsearch/issues/16560

León
fuente
1
I need to rename several indexes in a cluster (their name must be changed I cannot use aliases).Por @WoJ
Thales P
El alias de motivo no funciona : el uso alias requiere que planifique con anticipación y cree el nombre del índice original as an aliasen un índice real. Luego, puede crear un nuevo nombre de alias y reutilizar el nombre de alias anterior para otra cosa. Pero pierde el acceso a old_data si solo tiene un real_index, cree un alias, elimine el antiguo real_index. El alias ahora no apunta a nada.
Jesse Chisholm
@JesseChrisholm Creo que no se puede tener un "alias que no apunte a nada". Intente eliminar real_index, verá que el alias "un alias" también se eliminará.
mgaert
5

Otra forma diferente de lograr el cambio de nombre o las asignaciones de un índice es reindexar usando logstash. Aquí hay una muestra de la configuración de logstash 2.1:

input {
  elasticsearch {
   hosts => ["es01.example.com", "es02.example.com"]
   index => "old-index-name"
   size => 500
   scroll => "5m"
  }
}
filter {

 mutate {
  remove_field => [ "@version" ]
 }

 date {
   "match" => [ "custom_timestamp", "MM/dd/YYYY HH:mm:ss" ]
   target => "@timestamp"
 }

}
output {
 elasticsearch {
   hosts => ["es01.example.com", "es02.example.com" ]
   manage_template => false
   index => "new-index-name"
 }
}
Gabriel Rosca
fuente
4
Entonces, ¿estás diciendo que la mejor manera de reindexar un índice de Elasticsearch es instalar Logstash y luego usarlo para reindexar? Parece un poco exagerado, especialmente si en realidad no quiere / usa Logstash ...
M. Justin
El único problema en la respuesta es la parte "La mejor". Yo diría "De otra manera". Aparte de eso, es una buena respuesta.
Robert
-5

Por si acaso alguien todavía lo necesita. La forma exitosa, no oficial, de cambiar el nombre de los índices es:

  1. Cerrar índices que necesitan ser renombrados
  2. Cambie el nombre de las carpetas de los índices en todos los directorios de datos de los nodos maestros y de datos.
  3. Vuelva a abrir los índices cerrados antiguos (yo uso el complemento kofp). Los índices antiguos se volverán a abrir, pero permanecerán sin asignar. Los nuevos índices aparecerán en estado cerrado
  4. Reabrir nuevos índices
  5. Eliminar índices antiguos

Si obtiene este error "el nombre del directorio de índice colgante es", elimine la carpeta de índice en todos los nodos maestros (no en los nodos de datos) y reinicie uno de los nodos de datos.

Anh Le
fuente
2
Fuertemente desanimado por Elastic. Asegúrese de tener copias de seguridad si lo hace.
lucabelluccini
No entiendo dónde aparece el nombre del índice en el directorio de datos. Cuando miro en / var / lib / elasticsearch / nodes / 0 / indices / los nombres de los directorios se generan aleatoriamente, como "1aS4RusHSYWLdt-Wx7NnBw" (Elasticsearch versión 5.6.3)
Johan Boulé
1
@ JohanBoulé, este método ya no es válido desde la versión 5 de Elasticsearch.
Anh Le
@lucabelluccini, estuvo de acuerdo. Es mejor dejarlos como están y usar alias.
Anh Le