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


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

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

кластер имеет 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 73

7 ответов:

можно использовать REINDEX для этого.

Reindex не пытается настроить целевой индекс. Это не скопируйте настройки исходного индекса. Вы должны настройка индекс назначения перед запуском действия _reindex, в том числе настройка сопоставлений, подсчетов осколков, реплик и т. д.

  1. сначала скопируйте индекс в новое имя
POST /_reindex
{
  "source": {
    "index": "twitter"
  },
  "dest": {
    "index": "new_twitter"
  }
}
  1. теперь удалить Индекс
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 также можно использовать для переименования индекса при восстановлении с помощью регулярного выражения

на всякий случай кто-то еще нуждается в этом. Успешный, не официальный, способ переименования индексов:

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

Если вы получаете эту ошибку "dangled Index directory name is", удалите папку индекса во всех главных узлах (не узлы данных) и перезапустите один из узлов данных.