comment renommer un index en cluster?
J'ai besoin de renommer plusieurs indices dans un cluster (leur nom doit être changé, je ne peux pas utiliser alias).
J'ai vu qu'il n'y a pas soutenu les façons de le faire, le plus proche que j'ai trouvé est de renommer le répertoire de l'index, j'ai essayé ceci dans un cluster.
, Le cluster a 3 machines A
, B
et C
, et les fragments sont répliquées sur chacun d'eux. J'ai arrêté elasticsearch sur A
, renommé /var/lib/elasticsearch/security/nodes/0/indices/oldindexname
à /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 restaurer un état correct. Après un certain temps, je me suis retrouvé avec
-
oldindexname
étant disponible et entièrement répliqué (récupéré à partir deB
etC
je suppose) - {[11] } étant disponible (je peux le rechercher) mais le plugin head montre que ses fragments sont dans un état "non affecté" et qu'ils sont grisés (Non répliqués)
Pendant la récupération security.log
a montré ce qui suit message:
[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 consultable, il n'est certainement pas dans un état normal.
Je suis revenu à l'état précédent en supprimant newindexname
. Le cluster est de retour au vert sans aucune entrée "non assignée".
, étant Donné que, comment puis-je renommer oldindexname
à newindexname
dans un cluster?
Note: la solution ultime que j'ai en tête est de faire défiler-copier oldindex
dans newindex
et supprimer oldindex
après. Cela va prendre du temps donc s'il y a un plus direct la solution ce serait génial.
7 réponses
Vous pouvez utiliser REINDEX pour ce faire.
Reindex ne tente pas de configurer l'index de destination. Il n'a pas copiez les paramètres de l'index source. Vous devriez configurer le index de destination avant d'exécuter une action _reindex, y compris configuration des mappages, des nombres de fragments, des répliques, etc.
- copiez D'abord l'index sous un nouveau nom
POST /_reindex
{
"source": {
"index": "twitter"
},
"dest": {
"index": "new_twitter"
}
}
- Maintenant, supprimez L'Index
DELETE /twitter
Pour renommer votre index, vous pouvez utiliser le module Elasticsearch Snapshot.
Vous devez d'Abord prendre un instantané de votre index.tout en le restaurant vous pouvez renommez 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 d'index dans lequel vous souhaitez sauvegarder vos données.
Une autre façon de renommer ou de modifier les mappages d'un index est de réindexer à l'aide de logstash. Voici un exemple de configuration 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"
}
}
En tant que tel, il n'y a pas de méthode directe pour copier ou renommer l'index dans ES (j'ai beaucoup cherché pour mon propre projet)
Cependant, une option très facile est d'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, juste tombé sur et trouvé bon]
Ainsi, vous pouvez copier index/type et supprimez l'ancien.
Si vous ne pouvez pas réindexer une solution de contournement {[2] } consiste à utiliser alias. De la documentation officielle:
les API dans elasticsearch acceptent un nom d'index lorsque vous travaillez avec un index spécifique, et plusieurs index le cas échéant. L'API alias d'index permet d'alias un index avec un nom, toutes les API convertissant automatiquement le nom d'alias en nom d'index réel. Un alias peut également être mappé à plus d'un index, et lors de sa spécification, l'alias développez automatiquement les indices d'alias. Un alias peut également être associé à un filtre qui sera automatiquement appliqué lors de la recherche et des valeurs de routage. Un alias ne peut pas avoir le même nom qu'un indice.
Sachez que cette solution ne fonctionne pas si vous utilisez Plus Cette fonction. https://github.com/elastic/elasticsearch/issues/16560
Comme indiqué dans Référence Elasticsearch pour le module snapshot ,
Les options rename_pattern et rename_replacement peuvent également être utilisées pour renommer l'index lors de la restauration à l'aide de l'expression régulière
Juste au cas où quelqu'un en aurait encore besoin. La façon réussie, non officielle, de renommer les index sont:
- Ferme les index qui doivent être renommés
- renommez les dossiers des index dans tous les répertoires de données des nœuds maître et de données.
- rouvrir les anciens index fermés (j'utilise le plugin kofp). Les anciens index seront rouverts mais resteront non affectés. Les nouveaux index apparaîtront à l'état fermé
- rouvrir les nouveaux index
- Supprimer les anciens index
Si vous obtenez cette erreur "a balancé index nom du répertoire", le retirer du dossier d'index dans tous les nœuds maîtres (pas de données nœuds), et redémarrez l'un des nœuds de données.