come rinominare un indice in un cluster?


110

Devo rinominare diversi indici in un cluster (il loro nome deve essere cambiato, non posso usare gli alias ).

Ho visto che non ci sono modi supportati per farlo, il più vicino che ho trovato è rinominare la directory dell'indice , l'ho provato in un cluster.

Il cluster ha 3 macchine A, Be Ced i frammenti vengono replicate su ciascuno di essi. Ho spento elasticsearch su A, rinominato /var/lib/elasticsearch/security/nodes/0/indices/oldindexnameper /var/lib/elasticsearch/security/nodes/0/indices/newindexnamee riavviato A.

Lo stato del cluster era giallo e elasticsearch stava facendo qualche magia per ripristinare uno stato corretto. Dopo un po 'ho finito con

  • oldindexnameessere disponibile e completamente replicato (recuperato da Be Cimmagino)
  • newindexname essendo disponibile (posso cercarlo) ma il plug-in principale mostra che i suoi frammenti sono in uno stato "Non assegnato" e che sono disattivati ​​(non replicati)

Durante il recupero ha security.logmostrato il seguente messaggio:

[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

Sebbene newindexnamesia ricercabile, non è certamente in uno stato normale.

Sono tornato allo stato precedente eliminando newindexname. Il cluster è tornato verde senza alcuna voce "Non assegnato".

Dato che, come posso rinominare oldindexnamea newindexnamein un cluster?

Nota: l'ultima soluzione che ho in mente è quello di scroll-copia oldindexin newindexe cancellare oldindexin seguito. Questo richiederà tempo, quindi se esiste una soluzione più diretta sarebbe fantastico.

Risposte:


19

A partire da ElasticSearch 7.4, il metodo migliore per rinominare un indice è copiare l'indice utilizzando la nuova API Clone Index , quindi eliminare l'indice originale utilizzando l' API Delete Index .

Il vantaggio principale dell'API Clone Index rispetto all'uso dell'API Snapshot o dell'API Reindex per lo stesso scopo è la velocità, poiché l'API dell'Indice Clone collega i segmenti dall'indice di origine all'indice di destinazione, senza rielaborare alcuno dei suoi contenuti (su filesystem che supportano gli hardlink, ovviamente; altrimenti, i file vengono copiati a livello di file system, che è ancora molto più efficiente delle alternative). Clone Index garantisce inoltre che l'indice di destinazione sia identico in ogni punto all'indice di origine (ovvero, non è necessario copiare manualmente le impostazioni e le mappature, contrariamente all'approccio Reindex) e non richiede la configurazione di una directory di snapshot locale .

Nota a margine: anche se questa procedura è molto più veloce delle soluzioni precedenti, implica comunque tempi di fermo. Esistono casi d'uso reali che giustificano la ridenominazione degli indici (ad esempio, come passaggio in un flusso di lavoro di suddivisione, riduzione o backup), ma la ridenominazione degli indici non dovrebbe far parte delle operazioni quotidiane. Se il tuo flusso di lavoro richiede frequenti ridenominazioni degli indici, dovresti prendere in considerazione l'utilizzo degli alias degli indici .

Qui è un esempio di una sequenza completa di operazioni per rinominare index source_indexa target_index. Può essere eseguito utilizzando alcune console specifiche di ElasticSearch, come quella integrata in Kibana . Consulta questa sintesi per una versione alternativa di questo esempio, utilizzando curlinvece di una console di ricerca elastica.

# 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

163

Puoi usare REINDICE per farlo.

Reindicizzazione non tenta di impostare l'indice di destinazione. Non copia le impostazioni dell'indice di origine. È necessario impostare l'indice di destinazione prima di eseguire un'azione _reindex, inclusa l'impostazione di mappature, conteggi di frammenti, repliche, ecc.

  1. Prima copia l'indice con un nuovo nome
POST /_reindex
{
  "source": {
    "index": "twitter"
  },
  "dest": {
    "index": "new_twitter"
  }
}
  1. Ora elimina l'indice
DELETE /twitter

Anche se questo richiede lo spazio per entrambi gli indici (temporaneamente), questo è semplice e completamente sul server, quindi questa sembra essere la soluzione migliore finora (anche se il documento avverte di uno stato "sperimentale"). Grazie.
WoJ

2
Funziona se la mappatura ha _source: {enabled: false}?
Harald

2
@Harald No, _reindexutilizza _sourcecome dati del documento originale.
Agop

6
Questo non copierà la mappatura di twittera new_twitterper quanto ne so.
Nick

3
Sono d'accordo sulla soluzione di _reindex, ma la domanda dovrebbe essere modificata. Reindicizzare non è semplicemente una ridenominazione. Può persino cambiare il modo in cui i dati vengono indicizzati.
lucabelluccini

62

Per rinominare il tuo indice puoi utilizzare il modulo Elasticsearch Snapshot.

Per prima cosa devi fare un'istantanea del tuo indice, mentre lo ripristini puoi rinominare il tuo indice.

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

rename_replacement: -Nuovo indexname in cui si desidera eseguire il backup dei dati.


4
Holycrap, è incredibilmente utile. Grazie!
Chris Cogdon

1
Molto meglio della soluzione accettata! Questa è in realtà una copia binaria dell'indice, quindi nessun rischio di perdere nulla e non richiede _sourcedi essere abilitata nell'indice. Ho rinominato alcuni indici multi-TB in questo modo senza problemi.
Giacca

2
@Jacket - Sono felice di sapere che la mia risposta ti aiuta davvero.
krishna kumar

1
Sono d'accordo, soluzione molto migliore, nessun problema di perdita di dati, molto PIÙ VELOCE anche per i grandi indici rispetto alla reindicizzazione
Romain Hautefeuille

1
mantiene la mappatura?
Amogh Mishra

5

In quanto tale non esiste un metodo diretto per copiare o rinominare l'indice in ES (ho cercato ampiamente il mio progetto)

Tuttavia, un'opzione molto semplice è utilizzare un popolare strumento di migrazione [Elastic-Exporter].

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

[PS: questo non è il mio blog, mi sono imbattuto e l'ho trovato buono]

In tal modo è possibile copiare indice / tipo e quindi eliminare quello vecchio.


Il collegamento non funziona più. Qualche altro posto in cui potremmo trovarlo o avere queste informazioni?
elachell

5

Se non puoi REINDICARE, una soluzione alternativa è usare gli alias . Dalla documentazione ufficiale :

Le API in elasticsearch accettano un nome di indice quando si lavora su un indice specifico e diversi indici se applicabili. L'API degli alias dell'indice consente di creare l'alias di un indice con un nome, con tutte le API che convertono automaticamente il nome dell'alias nel nome dell'indice effettivo. Un alias può anche essere mappato a più di un indice e, quando lo si specifica, l'alias si espanderà automaticamente negli indici degli alias. Un alias può anche essere associato a un filtro che verrà applicato automaticamente durante la ricerca e i valori di instradamento. Un alias non può avere lo stesso nome di un indice.

Tieni presente che questa soluzione non funziona se stai utilizzando la funzione More Like This. https://github.com/elastic/elasticsearch/issues/16560


1
I need to rename several indexes in a cluster (their name must be changed I cannot use aliases).Di @WoJ
Thales P

L'alias del motivo non funzionerà : l'utilizzo alias richiede di pianificare in anticipo e creare il nome dell'indice originale as an aliasin un indice reale. Quindi puoi creare un nuovo nome alias e riutilizzare il vecchio nome alias per qualcos'altro. Ma perdi l'accesso a old_data se hai solo un real_index, crea un alias, elimina il vecchio real_index. L'alias ora non punta a nulla.
Jesse Chisholm,

@JesseChrisholm Penso che non si possa avere un "alias che non punta a niente". Prova a rimuovere real_index, vedrai che verrà rimosso anche l'alias "un alias".
mgaert

5

Un altro modo diverso per rinominare o modificare le mappature per un indice è reindicizzare utilizzando logstash. Ecco un esempio della configurazione di 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"
 }
}

4
Quindi stai dicendo che il modo migliore per reindicizzare un indice Elasticsearch è installare Logstash e quindi usarlo per reindicizzare? Sembra un po 'eccessivo, soprattutto se in realtà non vuoi / usi Logstash ...
M. Justin

L'unico problema nella risposta è la parte "La migliore". Direi "Un altro modo". A parte questo, è una buona risposta.
Robert


-5

Nel caso qualcuno ne avesse ancora bisogno. Il modo efficace, non ufficiale, per rinominare gli indici è:

  1. Chiudi gli indici che devono essere rinominati
  2. Rinomina le cartelle degli indici in tutte le directory dei dati dei nodi master e dei dati.
  3. Riapri i vecchi indici chiusi (io uso il plugin kofp). I vecchi indici verranno riaperti ma rimarranno non assegnati. I nuovi indici appariranno nello stato chiuso
  4. Riapri nuovi indici
  5. Elimina i vecchi indici

Se si verifica questo errore "nome della directory dell'indice penzolato è", rimuovere la cartella dell'indice in tutti i nodi master (non i nodi dati) e riavviare uno dei nodi dati.


2
Fortemente sconsigliato da Elastic. Assicurati di avere dei backup se lo fai.
lucabelluccini

Non capisco dove appare il nome dell'indice nella directory dei dati. Quando guardo in / var / lib / elasticsearch / nodes / 0 / indices / i nomi delle directory sono generati casualmente, come "1aS4RusHSYWLdt-Wx7NnBw" (Elasticsearch versione 5.6.3)
Johan Boulé

1
@ JohanBoulé, questo metodo non è più valido dalla versione 5 di Elasticsearch.
Anh Le

@lucabelluccini, d'accordo. Meglio lasciarli così come sono e usare gli alias.
Anh Le
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.