як перейменувати індекс у кластер?


110

Мені потрібно перейменувати декілька індексів у кластері (їх ім’я потрібно змінити, я не можу використовувати псевдоніми ).

Я бачив, що не існує підтримуваних способів зробити це, найближче, що я знайшов, це перейменувати каталог індексу , я спробував це в кластері.

Кластер має 3 машини A, Bі Cна кожній з них копії реплікуються. Я вимкнув еластичний пошук A, перейменував /var/lib/elasticsearch/security/nodes/0/indices/oldindexnameйого /var/lib/elasticsearch/security/nodes/0/indices/newindexnameі перезапустив A.

Стан кластера був жовтим, і еластичний дослід робив певну магію для відновлення правильного стану. Через деякий час я закінчив

  • oldindexnameбути доступним і повністю тиражуватися (відновлено з, Bі Cя думаю)
  • newindexname доступний (я можу його шукати), але головний плагін показує, що його осколки перебувають у стані "Непризначений" і що вони є сірим кольором (не копіюються)

Під час відновлення security.logпоказано таке повідомлення:

[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

Хоча newindexnameце пошук, він, звичайно, не знаходиться в нормальному стані.

Я повернувся до попереднього стану, видаливши newindexname. Кластер повертається до зеленого кольору без будь-яких записів "Непризначені".

З огляду на , що, як я можу перейменувати , oldindexnameщоб newindexnameв кластері?

Примітка: остаточне рішення , яке я маю на увазі , щоб сувою копію oldindexв newindexі видалити oldindexзгодом. Це займе час, тому якщо є більш пряме рішення, було б чудово.

Відповіді:


19

Починаючи з ElasticSearch 7.4, найкращим методом перейменування індексу є копіювання індексу за допомогою нещодавно введеного API Clone Index , а потім видалення вихідного індексу за допомогою API Index Index .

Основна перевага API Clone Index API перед використанням API Snapshot або API Reindex для тієї ж мети - швидкість, оскільки API Clone Index жорстко посилає сегменти від вихідного індексу до цільового індексу, не переробляючи жодного його вмісту (на файлові системи, що підтримують жорсткі посилання, очевидно, інакше файли копіюються на рівні файлової системи, що все ще набагато ефективніше, ніж альтернативи. Clone Index також гарантує, що цільовий індекс в кожній точці ідентичний вихідному індексу (тобто немає необхідності вручну копіювати налаштування та відображення, всупереч підходу Reindex), і не вимагає налаштування локального каталогу знімків .

Побічна примітка: хоча ця процедура набагато швидша, ніж попередні рішення, вона все ж передбачає час простою. Існують реальні випадки використання, які виправдовують перейменування індексів (наприклад, як крок у розділеному, скорочувальному чи резервному процесі роботи), але перейменування індексів не повинно бути частиною щоденних операцій. Якщо ваш робочий процес вимагає частого перейменування індексів, тоді слід розглянути можливість використання Псевдонімів індексів .

Ось приклад повної послідовності операцій з перейменуванням індексу source_indexв target_index. Він може бути виконаний за допомогою певної консолі ElasticSearch, наприклад, тієї, що інтегрована в Kibana . Дивіться цю суть щодо альтернативної версії цього прикладу, використовуючи curlзамість консолі Elastic Search.

# 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

Ви можете використовувати REINDEX для цього.

Reindex не намагається встановити індекс призначення. Він не копіює параметри вихідного індексу. Ви повинні встановити індекс призначення до запуску дії _reindex, включаючи налаштування відображень, підрахунків відтінків, реплік тощо.

  1. Спочатку скопіюйте індекс до нового імені
POST /_reindex
{
  "source": {
    "index": "twitter"
  },
  "dest": {
    "index": "new_twitter"
  }
}
  1. Тепер видаліть індекс
DELETE /twitter

Хоча для цього потрібно мати місце для обох індексів (тимчасово), це просто і повністю на сервері - тому, здається, це найкраще рішення поки що (навіть якщо доктор попереджає про "експериментальний" статус). Дякую.
WoJ

2
Чи працює це, якщо відображення є _source: {enabled: false}?
Харальд

2
@Harald Ні, _reindexвикористовує _sourceяк вихідні дані документа.
Агоп

6
Це не буде копіювати відображення twitterна new_twitterнаскільки я знаю.
Нік

3
Я погоджуюся з рішенням _reindex, але питання слід змінити. Повторне оновлення - це не просто перейменування. Він навіть може змінити спосіб індексації даних.
lucabelluccini

62

Для перейменування вашого індексу ви можете використовувати модуль знімка Elasticsearch.

Спочатку потрібно зробити знімок вашого індексу. Під час його відновлення ви можете перейменувати свій індекс.

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

rename_replacement: -Нове ім'я індексу, в якому потрібно створити резервну копію даних.


4
Holycrap, це неймовірно корисно. Дякую!
Кріс Когдон

1
Набагато краще прийнятого рішення! Це насправді двійкова копія індексу, тому немає ризику втратити що-небудь і не вимагає _sourceвключення його в індекс. Я перейменував кілька таких ТБ-індексів без жодних питань.
Куртка

2
@Jacket - Я радий знати, що моя відповідь справді допомагає тобі.
кришна кумар

1
Я згоден, набагато краще рішення, жодних проблем із втратою даних, набагато швидше, а також для великих індексів, ніж перевстановлення
Romain Hautefeuille,

1
чи зберігає це відображення?
Amogh Mishra

5

Як такий, немає прямого методу копіювання або перейменування індексу в ES (я широко шукав власний проект)

Однак дуже простим варіантом є використання популярного інструменту міграції [Elastic-Exporter].

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

[PS: це не мій блог, просто натрапив і вважав це гарним]

Тим самим ви можете скопіювати індекс / тип, а потім видалити старий.


Посилання більше не працює. Будь-яке інше місце, де ми могли б його знайти чи мати цю інформацію?
elachell

5

Якщо ви не можете REINDEX, вирішення питання полягає у використанні псевдонімів . З офіційної документації:

API в еластичному дослідженні приймають ім'я індексу під час роботи з певним індексом та декількох індексів, коли це застосовується. API псевдонімів індексів дозволяє створювати псевдонім індексу з іменем, при цьому всі API автоматично перетворюють ім'я псевдоніма у фактичне ім'я індексу. Псевдонім також можна зіставити на більш ніж один індекс, і, вказавши його, псевдонім автоматично розшириться на індекси псевдонімів. Псевдонім також може бути пов’язаний з фільтром, який автоматично застосовуватиметься під час пошуку та значень маршрутизації. Псевдонім не може мати те саме ім’я, що й індекс.

Майте на увазі, що це рішення не працює, якщо ви користуєтеся функцією More Like This. https://github.com/elastic/elasticsearch/isissue/16560


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

Розумний псевдонім не буде працювати : Використання alias вимагає планувати заздалегідь і створювати оригінальне ім'я індексу as an aliasдо реального індексу. Тоді ви можете створити нове ім’я псевдоніма та повторно використовувати старе ім’я псевдоніма для чогось іншого. Але ви втрачаєте доступ до old_data, якщо у вас є тільки real_index, зробіть його псевдонім, видаліть старий real_index. Псевдонім тепер не вказує ні на що.
Джессі

@JesseChrisholm Я думаю, що не може бути "псевдонім, який не вказує ні на що". Спробуйте видалити real_index, ви побачите, що псевдонім "псевдонім йому" також буде видалений.
mgaert

5

Ще один інший спосіб досягти перейменування або зміни зіставлень для індексу - це повторне перенастроювання за допомогою logstash. Ось зразок конфігурації 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
Отже, ви говорите, що найкращий спосіб перевстановити індекс Elasticsearch - це встановити Logstash, а потім використовувати його для повторного введення? Здається, трохи надмірно, особливо якщо ви насправді не хочете / не використовуєте Logstash ...
М. Джастін

Єдина проблема у відповіді - частина "Найкраща". Я б сказав "Інший спосіб". Окрім цього, це хороша відповідь.
Роберт


-5

Про всяк випадок, коли комусь це все-таки потрібно. Успішний, не офіційний, спосіб перейменування індексів:

  1. Закрийте індекси, які потрібно перейменувати
  2. Перейменуйте папки індексів у всіх каталогах даних головних та вузлів даних.
  3. Повторно відкрийте старі закриті індекси (я використовую плагін kofp). Старі індекси будуть знову відкриті, але залишатимуться без призначення. Нові індекси з’являться у закритому стані
  4. Повторно відкрийте нові індекси
  5. Видалити старі індекси

Якщо у вас трапилася ця помилка "заплутане ім'я каталогу каталогів є", видаліть папку індексу з усіх основних вузлів (а не вузлів даних) та перезапустіть один із вузлів даних.


2
Сильно відлякує Еластик. Переконайтеся, що у вас є резервні копії.
lucabelluccini

Я не розумію, де в каталозі даних відображається назва індексу. Коли я дивлюсь у / var / lib / elasticsearch / nodes / 0 / indices /, назви каталогів генеруються випадковим чином, як "1aS4RusHSYWLdt-Wx7NnBw" (Elasticsearch версія 5.6.3)
Йохан Буле

1
@ ЙоханБуле, цей спосіб більше не діє з версії 5 Elasticsearch.
Анх Ле

@lucabelluccini, погодився. Краще просто залишити їх такими, як є, і використовувати псевдоніми.
Anh Le
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.