Je dois renommer plusieurs index dans un cluster (leur nom doit être changé, je ne peux pas utiliser aliases ).
J'ai vu qu'il n'y avait pas de moyens supportés pour le faire, le plus proche que j'ai trouvé est de renommer le répertoire de l'index , j'ai essayé cela dans un cluster.
Le cluster a 3 machines A
, B
et C
et les fragments sont répliqués sur chacune d’elles. J'ai arrêté elasticsearch sur A
, renommé /var/lib/elasticsearch/security/nodes/0/indices/oldindexname
en /var/lib/elasticsearch/security/nodes/0/indices/newindexname
et redémarré A
.
L'état du cluster était jaune et elasticsearch faisait de la magie pour rétablir un état correct. Après quelque temps je me suis retrouvé avec
oldindexname
disponible et entièrement répliqué (récupéré de B
et C
je suppose)newindexname
étant disponible (je peux le rechercher) mais le plug-in head montre que ses fragments sont dans un état "Unassigned" et qu'ils sont grisés (non répliqués)Au cours de la récupération, security.log
a affiché le message suivant:
[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
Alors que newindexname
est interrogeable, il n’est certainement pas dans un état normal.
Je suis revenu à l'état précédent en supprimant newindexname
. Le cluster est redevenu vert sans aucune entrée "Unassigned".
Dans ce cas, comment puis-je renommer oldindexname
en newindexname
dans un cluster?
Remarque: La solution ultime que je me propose est de faire défiler-copier oldindex
dans newindex
et supprimer oldindex
ensuite. Cela va prendre du temps, donc s'il y avait une solution plus directe, ce serait génial.
Pour renommer votre index, vous pouvez utiliser le module Elasticsearch Snapshot.
Vous devez d’abord prendre un instantané de votre index. En le restaurant, vous pouvez renommer votre index.
POST /_snapshot/my_backup/snapshot_1/_restore
{
"indices": "jal",
"ignore_unavailable": "true",
"include_global_state": false,
"rename_pattern": "jal",
"rename_replacement": "jal1"
}
rename_replacement: -Nouveau nom-index dans lequel vous voulez sauvegarder vos données.
Vous pouvez utiliser REINDEX pour le faire.
Réindexer ne tente pas de configurer l'index de destination. Il ne copie pas les paramètres de l'index source. Vous devez configurer l’index de destination avant d’exécuter une action _reindex, y compris la configuration de mappages, de comptes de fragments, de réplicas, etc.
POST /_reindex
{
"source": {
"index": "Twitter"
},
"dest": {
"index": "new_Twitter"
}
}
DELETE /Twitter
Si vous ne pouvez pas utiliser REINDEX, une solution de contournement consiste à utiliser des alias . De la documentation officielle :
Dans elasticsearch, les API acceptent un nom d'index lorsque vous travaillez contre un index spécifique et plusieurs index, le cas échéant. L'API des alias d'index permet d'aliaser un index avec un nom. Toutes les API convertissent automatiquement le nom d'alias en nom d'index. Un alias peut également être mappé sur plusieurs index et, lors de sa spécification, il se développera automatiquement sur les index des alias. Un alias peut également être associé à un filtre qui sera automatiquement appliqué lors de la recherche et du routage des valeurs. Un alias ne peut pas avoir le même nom qu'un index.
Sachez que cette solution ne fonctionne pas si vous utilisez la fonctionnalité More Like This. https://github.com/elastic/elasticsearch/issues/1656
Une autre façon de renommer ou de modifier les mappages d'un index consiste à réindexer à l'aide de logstash. Voici un exemple de la configuration 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"
}
}
En tant que tel, il n’existe pas de méthode directe pour copier ou renommer l’index dans ES (j’ai longuement cherché mon propre projet).
Cependant, une option très simple consiste à utiliser un outil de migration populaire [Elastic-Exporter].
http://www.retailmenot.com/corp/eng/posts/2014/12/02/elasticsearch-cluster-migration/
[PS: ce n'est pas mon blog, je suis tombé dessus et je l'ai trouvé bon]
Ainsi, vous pouvez copier index/type puis supprimer l'ancien.
Comme indiqué dans référence Elasticsearch pour le module d'instantané ,
Les options rename_pattern et rename_replacement peuvent également être utilisées pour renommer l'index lors d'une restauration à l'aide d'une expression régulière
La commande suivante a fonctionné pour moi:
POST /_aliases
{
"actions": [
{
"add": {
"index": "new_index",
"alias": "old_index"
}
},
{
"remove_index": {
"index": "old_index"
}
}
]
}