как переименовать индекс в кластере?

110

Мне нужно переименовать несколько индексов в кластере (их имя нужно изменить, я не могу использовать псевдонимы ).

Я увидел, что для этого нет поддерживаемых способов, самое близкое, что я нашел, - это переименовать каталог индекса , я пробовал это в кластере.

В кластере 3 машины A, Bи Cна каждой из них реплицируются шарды. Я выключил elasticsearch A, переименовал /var/lib/elasticsearch/security/nodes/0/indices/oldindexnameв /var/lib/elasticsearch/security/nodes/0/indices/newindexnameи перезапустил A.

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

  • oldindexnameбыть доступным и полностью реплицированным (восстановлено, Bи Cя думаю)
  • newindexname доступны (я могу выполнить поиск), но плагин head показывает, что его шарды находятся в состоянии «Неназначено» и что они неактивны (не реплицируются)

Во время восстановления 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впоследствии. На это потребуется время, поэтому, если есть более прямое решение, было бы здорово.

WOJ
источник

Ответы:

19

Начиная с ElasticSearch 7.4, лучший способ переименовать индекс - это скопировать индекс с помощью недавно представленного API клонирования индекса , а затем удалить исходный индекс с помощью API удаления индекса .

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

Примечание: хотя эта процедура намного быстрее, чем предыдущие решения, она по-прежнему подразумевает время простоя. Существуют реальные варианты использования, которые оправдывают переименование индексов (например, в качестве шага в рабочем процессе разделения, сжатия или резервного копирования), но переименование индексов не должно быть частью повседневных операций. Если ваш рабочий процесс требует частого переименования индексов, вам следует подумать об использовании вместо них псевдонимов индексов .

Ниже приведен пример полной последовательности операций переименования индекса source_indexс target_index. Его можно выполнить с помощью какой-либо специальной консоли ElasticSearch, например, встроенной в Kibana . См. Эту суть для альтернативной версии этого примера, использующей curlвместо консоли эластичного поиска.

# 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
источник
163

Для этого вы можете использовать REINDEX .

Reindex не пытается настроить целевой индекс. Он не копирует настройки исходного индекса. Перед запуском действия _reindex необходимо настроить целевой индекс , включая настройку сопоставлений, счетчиков сегментов, реплик и т. Д.

  1. Сначала скопируйте индекс на новое имя
POST /_reindex
{
  "source": {
    "index": "twitter"
  },
  "dest": {
    "index": "new_twitter"
  }
}
  1. Теперь удалите индекс
DELETE /twitter
Рето
источник
Хотя для этого требуется место для обоих индексов (временно), это просто и полностью на сервере - так что на данный момент это кажется лучшим решением (даже несмотря на то, что документ предупреждает об «экспериментальном» статусе). Спасибо.
WoJ
2
Это работает, если есть маппинг _source: {enabled: false}?
Harald
2
@Harald Нет, _reindexиспользует _sourceв качестве исходных данных документа.
Agop
6
Насколько я знаю, это не скопирует отображение twitterна new_twitter.
Ник
3
Я согласен с решением _reindex, но вопрос следует изменить. Переиндексирование - это не просто переименование. Это может даже изменить способ индексации данных.
lucabelluccini
62

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

Сначала вам нужно сделать снимок своего индекса. Восстанавливая его, вы можете переименовать свой индекс.

    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включать в индекс. Я без проблем переименовал некоторые индексы с множественным туберкулезом.
Jacket
2
@Jacket - я рад узнать, что мой ответ действительно помогает вам.
Кришна Кумар
1
Я согласен, гораздо лучшее решение, без проблем с потерей данных, намного БЫСТРЕЕ для больших индексов, чем переиндексирование
Ромен Отфёйль
1
сохраняет ли он отображение?
Амог Мишра
5

Таким образом, в ES нет прямого метода копирования или переименования индекса (я много искал свой собственный проект)

Однако очень простой вариант - использовать популярный инструмент миграции [Elastic-Exporter].

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

[PS: это не мой блог, просто наткнулся и нашел хороший]

Таким образом, вы можете скопировать индекс / тип, а затем удалить старый.

ленивец
источник
Ссылка больше не работает. В любом другом месте, где мы могли бы его найти или получить эту информацию?
elachell 06
5

Если вы не можете переиндексации обходной путь заключается в использовании псевдонимов . Из официальной документации:

API-интерфейсы в elasticsearch принимают имя индекса при работе с определенным индексом и несколько индексов, если это применимо. API псевдонимов индекса позволяет использовать псевдоним индекса с именем, при этом все API автоматически преобразуют имя псевдонима в фактическое имя индекса. Псевдоним также может быть сопоставлен более чем с одним индексом, и при его указании псевдоним автоматически расширяется до индексов псевдонимов. Псевдоним также может быть связан с фильтром, который будет автоматически применяться при поиске и маршрутизации значений. Псевдоним не может иметь то же имя, что и индекс.

Имейте в виду, что это решение не работает, если вы используете функцию 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).Автор @WoJ
Thales P
Псевдоним причины не работает : использование alias требует , чтобы вы спланировали заранее и создали исходное имя индекса as an aliasдля реального индекса. Затем вы можете создать новое имя псевдонима и повторно использовать старое имя псевдонима для чего-то другого. Но вы теряете доступ к old_data, если у вас есть только real_index, создайте для него псевдоним, удалите старый real_index. Псевдоним теперь ни на что не указывает.
Джесси
@JesseChrisholm Я думаю, что нельзя иметь «псевдоним, который ни на что не указывает». Попробуйте удалить real_index, вы увидите, что псевдоним «alias to it» также будет удален.
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
Крайне не рекомендуется использовать Elastic. Убедитесь, что у вас есть резервные копии, если вы это сделаете.
lucabelluccini
Я не понимаю, где в каталоге данных появляется имя индекса. Когда я смотрю в / var / lib / elasticsearch / nodes / 0 / indices /, имена каталогов генерируются случайным образом, например «1aS4RusHSYWLdt-Wx7NnBw» (Elasticsearch версии 5.6.3)
Johan
1
@ JohanBoulé, этот метод больше не действует, начиная с версии 5 Elasticsearch.
Anh Le
@lucabelluccini, согласен. Лучше просто оставить их как есть и использовать псевдонимы.
Anh Le