jak zmienić nazwę indeksu w klastrze?

110

Muszę zmienić nazwę kilku indeksów w klastrze ( należy zmienić ich nazwę , nie mogę używać aliasów ).

Widziałem, że nie ma obsługiwanych sposobów, aby to zrobić, najbliższy, jaki znalazłem, to zmiana nazwy katalogu indeksu , próbowałem tego w klastrze.

Klaster zawiera 3 maszyny A, Ba Cfragmenty są replikowane na każdym z nich. Wyłączyłem elastyczne wyszukiwanie, zmieniłem Anazwę /var/lib/elasticsearch/security/nodes/0/indices/oldindexnamena /var/lib/elasticsearch/security/nodes/0/indices/newindexnamei uruchomiłem ponownie A.

Stan klastra był żółty, a elastyczne wyszukiwanie robiło magię, aby przywrócić prawidłowy stan. Po jakimś czasie skończyłem z

  • oldindexnamebycie dostępnym i w pełni replikowanym (odzyskanym z Bi Cjak sądzę)
  • newindexname jest dostępny (mogę go przeszukać), ale wtyczka head pokazuje, że jego fragmenty są w stanie „Nieprzypisane” i są wyszarzone (nie są replikowane)

Podczas odzyskiwania security.logpojawił się następujący komunikat:

[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

Chociaż newindexnamemożna go przeszukiwać, z pewnością nie jest w normalnym stanie.

Przywróciłem poprzedni stan, usuwając newindexname. Klaster powraca do koloru zielonego bez żadnych wpisów „Nieprzypisane”.

Biorąc to pod uwagę, jak mogę zmienić nazwę oldindexnamena newindexnamew klastrze?

Uwaga: najlepszym rozwiązaniem Mam na myśli to, aby przewinąć-egzemplarzu oldindexdo newindexi usuwać oldindexpóźniej. To zajmie trochę czasu, więc jeśli istnieje bardziej bezpośrednie rozwiązanie, byłoby wspaniale.

WoJ
źródło

Odpowiedzi:

19

Począwszy od ElasticSearch 7.4, najlepszą metodą zmiany nazwy indeksu jest skopiowanie indeksu za pomocą nowo wprowadzonego interfejsu Clone Index API , a następnie usunięcie oryginalnego indeksu za pomocą funkcji Delete Index API .

Główną zaletą interfejsu Clone Index API w porównaniu z używaniem Snapshot API lub Reindex API do tego samego celu jest szybkość, ponieważ Clone Index API łączy twarde łącza segmentów z indeksu źródłowego do indeksu docelowego, bez ponownego przetwarzania jakiejkolwiek jego zawartości (na oczywiście systemy plików, które obsługują twarde dowiązania; w przeciwnym razie pliki są kopiowane na poziomie systemu plików, co jest nadal znacznie bardziej wydajne niż alternatywy). Clone Index gwarantuje również, że indeks docelowy jest identyczny w każdym punkcie z indeksem źródłowym (to znaczy nie ma potrzeby ręcznego kopiowania ustawień i mapowań, w przeciwieństwie do podejścia Reindex) i nie wymaga konfigurowania lokalnego katalogu migawek .

Uwaga dodatkowa: chociaż ta procedura jest znacznie szybsza niż poprzednie rozwiązania, nadal oznacza przestoje. Istnieją rzeczywiste przypadki użycia, które uzasadniają zmianę nazw indeksów (na przykład jako krok w przepływie pracy podziału, zmniejszania lub tworzenia kopii zapasowych), ale zmiana nazw indeksów nie powinna być częścią codziennych operacji. Jeśli przepływ pracy wymaga częstej zmiany nazwy indeksu, należy zamiast tego rozważyć użycie aliasów indeksów .

Oto przykład kompletnej sekwencji operacji zmiany nazwy indeks source_indexdo target_index. Można go uruchomić za pomocą określonej konsoli ElasticSearch, takiej jak konsola zintegrowana z Kibana . Zapoznaj się z tym streszczeniem, aby zapoznać się z alternatywną wersją tego przykładu, używając curlzamiast konsoli elastycznego wyszukiwania.

# 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
źródło
163

Możesz do tego użyć REINDEX .

Reindex nie próbuje skonfigurować indeksu docelowego. Nie kopiuje ustawień indeksu źródłowego. Indeks docelowy należy skonfigurować przed uruchomieniem akcji _reindex, w tym skonfigurowaniem mapowań, liczby fragmentów, replik itp.

  1. Najpierw skopiuj indeks do nowej nazwy
POST /_reindex
{
  "source": {
    "index": "twitter"
  },
  "dest": {
    "index": "new_twitter"
  }
}
  1. Teraz usuń indeks
DELETE /twitter
reto
źródło
Chociaż wymaga to miejsca na oba indeksy (tymczasowo), jest to proste i całkowicie na serwerze - więc wydaje się, że jest to najlepsze rozwiązanie do tej pory (mimo że dokument ostrzega o statusie „eksperymentalnym”). Dziękuję Ci.
WoJ
2
Czy to działa, jeśli mapowanie ma _source: {enabled: false}?
Harald,
2
@Harald Nie, _reindexużywa _sourcejako oryginalnego dokumentu danych.
Agop
6
To nie skopiuje mapowania twitterdo, new_twittero ile wiem.
Nick
3
Zgadzam się na rozwiązanie _reindex, ale pytanie powinno zostać zmienione. Reindeksowanie to nie tylko zmiana nazwy. Może nawet zmienić sposób indeksowania danych.
lucabelluccini
62

Aby zmienić nazwę indeksu, możesz użyć modułu Elasticsearch Snapshot.

Najpierw musisz zrobić migawkę swojego indeksu. Przywracając go, możesz zmienić jego nazwę.

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

rename_replacement: -Nowa nazwa indeksu, w której chcesz wykonać kopię zapasową danych.

krishna kumar
źródło
4
Holycrap, to niewiarygodnie przydatne. Dziękuję Ci!
Chris Cogdon
1
Znacznie lepsze niż przyjęte rozwiązanie! W rzeczywistości jest to binarna kopia indeksu, więc nie ma ryzyka utraty czegokolwiek i nie wymaga _sourcewłączenia w indeksie. W ten sposób zmieniłem nazwy niektórych indeksów multi-TB bez żadnych problemów.
Kurtka
2
@Jacket - cieszę się, że moja odpowiedź naprawdę Ci pomaga.
krishna kumar
1
Zgadzam się, o wiele lepsze rozwiązanie, brak problemów z utratą danych, znacznie SZYBSZE także dla dużych indeksów niż reindeksowanie
Romain Hautefeuille
1
czy zachowuje mapowanie?
Amogh Mishra
5

W związku z tym nie ma bezpośredniej metody kopiowania lub zmiany nazwy indeksu w ES (intensywnie szukałem własnego projektu)

Jednak bardzo prostą opcją jest użycie popularnego narzędzia migracji [Elastic-Exporter].

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

[PS: to nie jest mój blog, po prostu natknąłem się na niego i okazało się, że jest dobry]

W ten sposób możesz skopiować indeks / typ, a następnie usunąć stary.

lazywiz
źródło
Link już nie działa. Czy jest jakieś inne miejsce, w którym moglibyśmy go znaleźć lub uzyskać te informacje?
elachell
5

Jeśli nie możesz REINDEX, obejściem jest użycie aliasów . Z oficjalnej dokumentacji:

Interfejsy API w elasticsearch akceptują nazwę indeksu podczas pracy z określonym indeksem i kilka indeksów, jeśli ma to zastosowanie. Interfejs API aliasów indeksu umożliwia aliasowanie indeksu za pomocą nazwy, przy czym wszystkie funkcje API automatycznie konwertują nazwę aliasu na rzeczywistą nazwę indeksu. Alias ​​można również odwzorować na więcej niż jeden indeks, a podczas określania alias zostanie automatycznie rozszerzony na indeksy aliasów. Alias ​​może być również powiązany z filtrem, który będzie automatycznie stosowany podczas wyszukiwania i kierowania wartości. Alias ​​nie może mieć takiej samej nazwy jak indeks.

Pamiętaj, że to rozwiązanie nie działa, jeśli używasz funkcji Więcej podobnych do tego. https://github.com/elastic/elasticsearch/issues/16560

Lew
źródło
1
I need to rename several indexes in a cluster (their name must be changed I cannot use aliases).Autor: @WoJ
Thales P
Alias ​​powodu nie zadziała : użycie alias wymaga planowania z wyprzedzeniem i utworzenia oryginalnej nazwy indeksu as an aliasna rzeczywisty indeks. Następnie możesz utworzyć nową nazwę aliasu i ponownie użyć starej nazwy aliasu do czegoś innego. Ale tracisz dostęp do old_data, jeśli masz tylko real_index, utwórz do niego alias, usuń stary real_index. Alias ​​nie wskazuje teraz na nic.
Jesse Chisholm,
@JesseChrisholm Myślę, że nie można mieć „aliasu, który nic nie wskazuje”. Spróbuj usunąć real_index, zobaczysz, że alias „alias do niego” również zostanie usunięty.
mgaert
5

Innym innym sposobem zmiany nazwy lub zmiany mapowania indeksu jest ponowne zindeksowanie przy użyciu logstash. Oto przykład konfiguracji 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
źródło
4
Więc mówisz, że najlepszym sposobem na ponowne zindeksowanie indeksu Elasticsearch jest zainstalowanie Logstash, a następnie użycie go do ponownego zindeksowania? Wydaje się trochę przesadzone, zwłaszcza jeśli tak naprawdę nie chcesz / nie używasz Logstasha ...
M. Justin
Jedynym problemem w odpowiedzi jest część „najlepsza”. Powiedziałbym „w inny sposób”. Poza tym to dobra odpowiedź.
Robert
3

Jak wskazano w dokumentacji Elasticsearch dla modułu migawki ,

Opcje rename_pattern i rename_replacement mogą być również używane do zmiany nazwy indeksu przy przywracaniu przy użyciu wyrażenia regularnego

oldbam
źródło
-5

Na wypadek, gdyby ktoś nadal tego potrzebował. Udany, nieoficjalny sposób zmiany nazw indeksów to:

  1. Zamknij indeksy, których nazwy należy zmienić
  2. Zmień nazwy folderów indeksów we wszystkich katalogach danych węzłów głównych i węzłów danych.
  3. Ponownie otwórz stare zamknięte indeksy (używam wtyczki kofp). Stare indeksy zostaną ponownie otwarte, ale pozostaną nieprzypisane. Nowe indeksy pojawią się w stanie zamkniętym
  4. Otwórz ponownie nowe indeksy
  5. Usuń stare indeksy

Jeśli zdarzy się, że pojawi się ten błąd „nazwa katalogu nieaktualnego indeksu to”, usuń folder indeksu we wszystkich węzłach głównych (nie węzłach danych) i zrestartuj jeden z węzłów danych.

Anh Le
źródło
2
Zdecydowanie odradzane przez Elastic. Upewnij się, że masz kopie zapasowe, jeśli to zrobisz.
lucabelluccini
Nie rozumiem, gdzie nazwa indeksu pojawia się w katalogu danych. Kiedy patrzę w / var / lib / flexiblesearch / nodes / 0 / indices / nazwy katalogów są generowane losowo, na przykład „1aS4RusHSYWLdt-Wx7NnBw” (Elasticsearch wersja 5.6.3)
Johan Boulé
1
@ JohanBoulé, ta metoda nie jest już poprawna od wersji 5 Elasticsearch.
Anh Le
@lucabelluccini, zgodził się. Lepiej zostawić je bez zmian i użyć aliasów.
Anh Le,