как переименовать индекс в кластере?
мне нужно переименовать несколько индексов в кластере (свое имя должны изменить, я не могу использовать псевдонимы).
я видел, что нет никаких поддерживаемых способов сделать это, самое близкое, что я нашел, это переименовать каталог индекса, я попробовал это в кластере.
кластер имеет 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
далее. Это займет время, поэтому, если есть более прямое решение, это было бы здорово.
7 ответов:
можно использовать REINDEX для этого.
Reindex не пытается настроить целевой индекс. Это не скопируйте настройки исходного индекса. Вы должны настройка индекс назначения перед запуском действия _reindex, в том числе настройка сопоставлений, подсчетов осколков, реплик и т. д.
- сначала скопируйте индекс в новое имя
POST /_reindex { "source": { "index": "twitter" }, "dest": { "index": "new_twitter" } }
- теперь удалить Индекс
DELETE /twitter
для переименования индекса можно использовать модуль моментальных снимков 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: - новое имя индекса, в котором вы хотите создать резервную копию данных.
другой способ добиться переименования или изменения сопоставлений для индекса-это переиндексировать с помощью 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" } }
Как таковой нет прямого метода для копирования или переименования индекса в ES (я сделал широкий поиск для моего собственного проекта)
однако очень простой вариант-использовать популярный инструмент миграции [Elastic-Exporter].
http://www.retailmenot.com/corp/eng/posts/2014/12/02/elasticsearch-cluster-migration/
[PS: это не мой блог, просто наткнулся и нашел его хорошим]
таким образом, вы можете скопировать индекс/тип и затем удалить старый один.
Если вы не можете переиндексировать a решение использовать псевдонимы. Из официальный документы:
API в elasticsearch принимают имя индекса при работе с определенным индексом и несколько индексов, когда это применимо. API псевдонимов индекса позволяет псевдоним индекса с именем, при этом все API автоматически преобразуют имя псевдонима в фактическое имя индекса. Псевдоним также может быть сопоставлен с несколькими индексами, и когда указав его, псевдоним автоматически расширится до индексов псевдонимов. Псевдоним также может быть связан с фильтром, который будет автоматически применяться при поиске, и значениями маршрутизации. Псевдоним не может иметь то же имя, что и индекс.
имейте в виду, что это решение не работает, если вы используете больше, как эта функция. https://github.com/elastic/elasticsearch/issues/16560
Как указано в ссылка Elasticsearch для модуля моментального снимка,
параметры rename_pattern и rename_replacement также можно использовать для переименования индекса при восстановлении с помощью регулярного выражения
на всякий случай кто-то еще нуждается в этом. Успешный, не официальный, способ переименования индексов:
- закрыть индексы, которые необходимо переименовать
- переименовать папки индексов во всех каталогах данных основных узлов и узлов данных.
- открыть старые закрытые индексы (я использую плагин kofp). Старые индексы будут вновь открыты, но останутся неназначенными. Новые индексы появятся в закрытом состоянии
- открыть новые индексы
- удалить старые индексы
Если вы получаете эту ошибку "dangled Index directory name is", удалите папку индекса во всех главных узлах (не узлы данных) и перезапустите один из узлов данных.