Подтвердить что ты не робот

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

Мне нужно переименовать несколько индексов в кластере (их имя необходимо изменить, я не могу использовать 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 потом. Это займет время, поэтому, если будет более прямое решение, было бы здорово.

4b9b3361

Ответ 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"
  }
}
  1. Теперь удалите индекс
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"
 }
}

Ответ 7

У меня сработала следующая команда:

POST /_aliases
{
  "actions": [
    {
      "add": {
        "index": "new_index",
        "alias": "old_index"
      }
    },
    {
      "remove_index": {
        "index": "old_index"
      }
    }
  ]
}

Ответ 8

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

  • Закрыть индексы, которые необходимо переименовать
  • Переименуйте папки индексов во все каталоги данных мастер-узлов и узлов данных.
  • Повторно открыть старые закрытые индексы (я использую плагин kofp). Старые индексы будут вновь открыты, но остаются неназначенными. Новые индексы появятся в закрытом состоянии
  • Повторно открыть новые индексы
  • Удалить старые индексы

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