Как переименовать индекс в кластере?
Мне нужно переименовать несколько индексов в кластере (их имя необходимо изменить, я не могу использовать aliases).
Я видел, что нет поддерживаемых способов сделать это, ближайший я нашел переименовать каталог индекса, я пробовал это в кластере.
В кластере есть 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 показывает, что его осколки находятся в состоянии "Unassigned" и что они неактивны (не реплицированы).
Во время восстановления 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
потом. Это займет время, поэтому, если будет более прямое решение, было бы здорово.
Ответы
Ответ 1
Для переименования индекса вы можете использовать модуль моментального снимка Elasticsearch.
Сначала вам нужно сделать снимок вашего index.while, восстанавливая его, вы можете
переименуйте свой индекс.
POST /_snapshot/my_backup/snapshot_1/_restore
{
"indices": "jal",
"ignore_unavailable": "true",
"include_global_state": false,
"rename_pattern": "jal",
"rename_replacement": "jal1"
}
rename_replacement: -Новое имя индекса, в котором вы хотите сделать резервную копию своих данных.
Ответ 2
Вы можете использовать REINDEX, чтобы сделать это.
Reindex не пытается настроить индекс назначения. Это не скопируйте настройки исходного индекса. Вы должны настроить индекс назначения до запуска действия _reindex, включая настройка отображений, подсчет осколков, реплики и т.д.
- Сначала скопируйте индекс в новое имя
POST /_reindex
{
"source": {
"index": "twitter"
},
"dest": {
"index": "new_twitter"
}
}
- Теперь удалите индекс
DELETE /twitter
Ответ 3
Если вы не можете использовать REINDEX, обходной путь - использовать псевдонимы. Из официальная документация:
API в elasticsearch принимают имя индекса при работе с определенным индексом и несколько индексов, если это применимо. API псевдонимов индексов позволяет псевдонизировать индекс с именем, при этом все API автоматически преобразуют имя псевдонима в фактическое имя индекса. Псевдоним также может быть сопоставлен более чем с одним индексом, и при его определении псевдоним автоматически расширится до индексов псевдонимов. Псевдоним также может быть связан с фильтром, который будет автоматически применяться при поиске и значениях маршрутизации. Псевдоним не может иметь то же имя, что и индекс.
Помните, что это решение не работает, если вы используете функцию "Больше как эта". https://github.com/elastic/elasticsearch/issues/16560
Ответ 4
Как таковой нет прямого метода для копирования или переименования индекса в ES (я широко искал свой проект)
Однако очень простой вариант - использовать популярный инструмент миграции [Elastic-Exporter].
http://www.retailmenot.com/corp/eng/posts/2014/12/02/elasticsearch-cluster-migration/
[PS: это не мой блог, просто наткнулся и нашел это хорошо)
Таким образом, вы можете скопировать индекс/тип, а затем удалить старый.
Ответ 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"
}
}
Ответ 6
Как указано в ссылка Elasticearch для модуля моментальных снимков,
Параметры rename_pattern и rename_replacement также могут использоваться для переименования индекса при восстановлении с использованием регулярного выражения
Ответ 7
У меня сработала следующая команда:
POST /_aliases
{
"actions": [
{
"add": {
"index": "new_index",
"alias": "old_index"
}
},
{
"remove_index": {
"index": "old_index"
}
}
]
}
Ответ 8
На всякий случай кто-то все еще нуждается в этом. Успешный, а не официальный способ переименования индексов:
- Закрыть индексы, которые необходимо переименовать
- Переименуйте папки индексов во все каталоги данных мастер-узлов и узлов данных.
- Повторно открыть старые закрытые индексы (я использую плагин kofp). Старые индексы будут вновь открыты, но остаются неназначенными. Новые индексы появятся в закрытом состоянии
- Повторно открыть новые индексы
- Удалить старые индексы
Если вам посчастливилось получить эту ошибку, "имя каталога с затуманенным индексом", удалите папку индекса во всех основных узлах (а не узлах данных) и перезапустите один из узлов данных.