Wie benenne ich einen Index in einem Cluster um?

110

Ich muss mehrere Indizes in einem Cluster umbenennen (ihr Name muss geändert werden, ich kann keine Aliase verwenden ).

Ich habe gesehen, dass es keine unterstützten Möglichkeiten gibt, dies zu tun. Das nächste, was ich gefunden habe, ist das Umbenennen des Indexverzeichnisses . Ich habe dies in einem Cluster versucht.

Der Cluster verfügt über 3 Computer A, Bund Cdie Shards werden auf jedem von ihnen repliziert. Ich heruntergefahren Elasticsearch auf A, umbenannt /var/lib/elasticsearch/security/nodes/0/indices/oldindexnamezu /var/lib/elasticsearch/security/nodes/0/indices/newindexnameund neu gestartet A.

Der Status des Clusters war gelb und Elasticsearch hat etwas Magie angewendet, um einen korrekten Status wiederherzustellen. Nach einiger Zeit endete ich mit

  • oldindexnameverfügbar und vollständig repliziert sein (wiederhergestellt von Bund Cich denke)
  • newindexname verfügbar sein (ich kann es durchsuchen), aber das Head-Plugin zeigt an, dass sich die Shards in einem "Nicht zugewiesenen" Zustand befinden und dass sie ausgegraut sind (nicht repliziert)

Während der Wiederherstellung wurde security.logdie folgende Meldung angezeigt:

[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

Während newindexnamees durchsuchbar ist, ist es sicherlich nicht in einem normalen Zustand.

Ich habe durch Löschen den vorherigen Status wiederhergestellt newindexname. Der Cluster ist ohne "Nicht zugewiesene" Einträge wieder grün.

Da, wie kann ich umbenennen oldindexnamezu newindexnamein einem Cluster?

Hinweis: die ultimative Lösung , die ich im Sinne habe , ist zu Scroll-Kopie oldindexin newindexund löscht oldindexdanach. Dies wird einige Zeit in Anspruch nehmen. Wenn es also eine direktere Lösung gibt, wäre dies großartig.

WoJ
quelle

Antworten:

17

Ab ElasticSearch 7.4 besteht die beste Methode zum Umbenennen eines Index darin, den Index mithilfe der neu eingeführten Klonindex-API zu kopieren und dann den ursprünglichen Index mithilfe der API zum Löschen des Index zu löschen .

Der Hauptvorteil der Klonindex-API gegenüber der Verwendung der Snapshot-API oder der Reindex-API für denselben Zweck ist die Geschwindigkeit, da die Klonindex-API Segmente vom Quellindex zum Zielindex fest verknüpft, ohne ihren Inhalt erneut zu verarbeiten (on Dateisysteme, die natürlich Hardlinks unterstützen; andernfalls werden Dateien auf Dateisystemebene kopiert, was immer noch viel effizienter ist als die Alternativen. Der Klonindex garantiert auch, dass der Zielindex in jedem Punkt mit dem Quellindex identisch ist (dh im Gegensatz zum Reindex-Ansatz müssen Einstellungen und Zuordnungen nicht manuell kopiert werden), und es muss kein lokales Snapshot-Verzeichnis konfiguriert werden .

Randnotiz: Obwohl dieses Verfahren viel schneller als frühere Lösungen ist, bedeutet es dennoch Ausfallzeiten. Es gibt reale Anwendungsfälle, die das Umbenennen von Indizes rechtfertigen (z. B. als Schritt in einem Split-, Shrink- oder Backup-Workflow), aber das Umbenennen von Indizes sollte nicht Teil des täglichen Betriebs sein. Wenn Ihr Workflow häufiges Umbenennen von Indizes erfordert, sollten Sie stattdessen die Verwendung von Index-Aliasen in Betracht ziehen .

Hier ist ein Beispiel für eine vollständige Abfolge von Operationen, in die der Index umbenannt werden source_indexsoll target_index. Es kann mit einer ElasticSearch-spezifischen Konsole ausgeführt werden, beispielsweise der in Kibana integrierten . In dieser Übersicht finden Sie eine alternative Version dieses Beispiels, die curlanstelle einer Elastic Search-Konsole verwendet wird.

# 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
quelle
162

Sie können dazu REINDEX verwenden.

Reindex versucht nicht, den Zielindex einzurichten. Die Einstellungen des Quellindex werden nicht kopiert. Sie sollten den Zielindex einrichten, bevor Sie eine _reindex-Aktion ausführen, einschließlich der Einrichtung von Zuordnungen, Shard-Zählungen, Replikaten usw.

  1. Kopieren Sie zuerst den Index unter einen neuen Namen
POST /_reindex
{
  "source": {
    "index": "twitter"
  },
  "dest": {
    "index": "new_twitter"
  }
}
  1. Löschen Sie nun den Index
DELETE /twitter
reto
quelle
Dies erfordert zwar (vorübergehend) Speicherplatz für beide Indizes, ist jedoch einfach und vollständig auf dem Server verfügbar. Dies scheint also die bisher beste Lösung zu sein (obwohl das Dokument vor einem "experimentellen" Status warnt). Danke dir.
WoJ
2
Funktioniert dies, wenn das Mapping hat _source: {enabled: false}?
Harald
2
@Harald Nein, _reindexverwendet _sourceals Originaldokument Daten.
Agop
6
Dadurch wird die Zuordnung nicht kopieren twitterzu new_twitter, soweit ich weiß.
Nick
3
Ich stimme der Lösung von _reindex zu, aber die Frage sollte geändert werden. Neuindizierung ist nicht einfach eine Umbenennung. Es kann sogar die Indizierung von Daten ändern.
Lucabelluccini
62

Zum Umbenennen Ihres Index können Sie das Elasticsearch-Snapshot-Modul verwenden.

Zuerst müssen Sie einen Schnappschuss Ihres Index machen. Während Sie ihn wiederherstellen, können Sie Ihren Index umbenennen.

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

rename_replacement: -Neuer Indexname, in dem Sie Ihre Daten sichern möchten.

krishna kumar
quelle
4
Holycrap, das ist unglaublich nützlich. Danke dir!
Chris Cogdon
1
Viel besser als die akzeptierte Lösung! Dies ist eigentlich eine binäre Kopie des Index, daher besteht kein Risiko, etwas zu verlieren, und es muss nicht _sourceim Index aktiviert werden. Ich habe einige Multi-TB-Indizes auf diese Weise ohne Probleme umbenannt.
Jacke
2
@Jacket - Ich bin froh zu wissen, dass meine Antwort Ihnen wirklich hilft.
krishna kumar
1
Ich stimme zu, viel bessere Lösung, keine Datenverlustprobleme, viel SCHNELLER auch für große Indizes als Neuindizierung
Romain Hautefeuille
1
behält es die Zuordnung bei?
Amogh Mishra
5

Daher gibt es in ES keine direkte Methode zum Kopieren oder Umbenennen von Indizes (ich habe ausgiebig nach meinem eigenen Projekt gesucht).

Eine sehr einfache Option ist jedoch die Verwendung eines beliebten Migrationstools [Elastic-Exporter].

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

[PS: Dies ist nicht mein Blog, ich bin nur darauf gestoßen und fand es gut]

Dabei können Sie den Index / Typ kopieren und dann den alten löschen.

Lazywiz
quelle
Der Link funktioniert nicht mehr. Gibt es einen anderen Ort, an dem wir ihn finden oder diese Informationen haben könnten?
Elachell
5

Wenn Sie noch keinen indizieren kann Abhilfe verwenden Aliase . Aus der offiziellen Dokumentation:

APIs in elasticsearch akzeptieren einen Indexnamen, wenn sie mit einem bestimmten Index arbeiten, und gegebenenfalls mehrere Indizes. Die Index-Aliase-API ermöglicht das Aliasen eines Index mit einem Namen, wobei alle APIs den Aliasnamen automatisch in den tatsächlichen Indexnamen konvertieren. Ein Alias ​​kann auch mehreren Indizes zugeordnet werden. Wenn Sie ihn angeben, wird der Alias ​​automatisch auf die Aliase-Indizes erweitert. Ein Alias ​​kann auch einem Filter zugeordnet werden, der beim Suchen und Weiterleiten von Werten automatisch angewendet wird. Ein Alias ​​kann nicht denselben Namen wie ein Index haben.

Beachten Sie, dass diese Lösung nicht funktioniert, wenn Sie die Funktion "Mehr wie diese" verwenden. https://github.com/elastic/elasticsearch/issues/16560

Löwe
quelle
1
I need to rename several indexes in a cluster (their name must be changed I cannot use aliases).Von @WoJ
Thales P
Grundalias funktioniert nicht : Für die Verwendung alias müssen Sie im Voraus planen und den ursprünglichen Indexnamen as an aliasfür einen echten Index erstellen . Anschließend können Sie einen neuen Aliasnamen erstellen und den alten Aliasnamen für etwas anderes wiederverwenden. Aber Sie verlieren den Zugang zu old_data wenn Sie nur eine real_index haben haben, stellen Sie einen Alias es, löschen Sie die alte real_index. Der Alias ​​zeigt jetzt auf nichts.
Jesse Chisholm
@ JesseChrisholm Ich denke, man kann keinen "Alias ​​haben, der auf nichts zeigt". Wenn Sie versuchen, real_index zu entfernen, werden Sie feststellen, dass der Alias ​​"ein Alias ​​dazu" ebenfalls entfernt wird.
mgaert
5

Eine andere Möglichkeit, das Umbenennen oder Ändern der Zuordnungen für einen Index zu erreichen, besteht darin, die Verwendung von logstash neu zu indizieren. Hier ist ein Beispiel für die Konfiguration von 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
quelle
4
Sie sagen also, der beste Weg, einen Elasticsearch-Index neu zu indizieren, besteht darin, Logstash zu installieren und diesen dann zur Neuindizierung zu verwenden? Scheint ein bisschen übertrieben, besonders wenn Sie Logstash nicht wirklich wollen / verwenden ...
M. Justin
Das einzige Problem in der Antwort ist der "Beste" Teil. Ich würde sagen "Ein anderer Weg".
Robert
-5

Nur für den Fall, dass es noch jemand braucht. Die erfolgreiche, nicht offizielle Methode zum Umbenennen von Indizes ist:

  1. Schließen Sie Indizes, die umbenannt werden müssen
  2. Benennen Sie die Ordner der Indizes in allen Datenverzeichnissen der Master- und Datenknoten um.
  3. Öffnen Sie alte geschlossene Indizes erneut (ich verwende das Kofp-Plugin). Alte Indizes werden erneut geöffnet, bleiben jedoch nicht zugewiesen. Neue Indizes werden im geschlossenen Zustand angezeigt
  4. Öffnen Sie neue Indizes erneut
  5. Löschen Sie alte Indizes

Wenn Sie die Fehlermeldung "Name des baumelnden Indexverzeichnisses ist" erhalten, entfernen Sie den Indexordner in allen Masterknoten (nicht in den Datenknoten) und starten Sie einen der Datenknoten neu.

Anh Le
quelle
2
Von Elastic stark entmutigt. Stellen Sie sicher, dass Sie Backups haben, wenn Sie dies tun.
Lucabelluccini
Ich verstehe nicht, wo der Name des Index im Datenverzeichnis erscheint. Wenn ich in / var / lib / elasticsearch / node / 0 / indices / nachschaue, werden die Namen der Verzeichnisse zufällig generiert, wie "1aS4RusHSYWLdt-Wx7NnBw" (Elasticsearch Version 5.6.3)
Johan Boulé
1
@ JohanBoulé, diese Methode ist seit Version 5 von Elasticsearch nicht mehr gültig.
Anh Le
@ Lucabelluccini, stimmte zu. Lassen Sie sie lieber so wie sie sind und verwenden Sie Aliase.
Anh Le