web-dev-qa-db-fra.com

comment renommer un index dans un cluster?

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.

96
WoJ

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.

47
krishna kumar

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.

  1. Copiez d'abord l'index sous un nouveau nom
POST /_reindex
{
  "source": {
    "index": "Twitter"
  },
  "dest": {
    "index": "new_Twitter"
  }
}
  1. Maintenant, supprimez l'index
DELETE /Twitter
143
reto

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

6
Leo

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"
 }
}
5
Gabriel Rosca

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.

5
lazywiz

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

3
oldbam

La commande suivante a fonctionné pour moi:

POST /_aliases
{
  "actions": [
    {
      "add": {
        "index": "new_index",
        "alias": "old_index"
      }
    },
    {
      "remove_index": {
        "index": "old_index"
      }
    }
  ]
}
0
Enayat