API перенаправления кластера
Изменяет распределение фрагментов в кластере.
Запрос
POST /_cluster/reroute?metric=none
Предварительные условия
- Если функции безопасности Elasticsearch включены, у вас должна быть
manageпривилегия кластера, чтобы использовать этот API.
Описание
Команда перенаправления позволяет вручную изменять распределение отдельных фрагментов в кластере. Например, фрагмент можно явно переместить с одного узла на другой, отменить распределение и явно распределить неназначенный фрагмент на определенный узел.
Важно отметить, что после обработки любых команд перенаправления Elasticsearch выполнит перебалансировку, как обычно (учитывая значения настроек, таких как cluster.routing.rebalance.enable), чтобы сохранить состояние баланса. Например, если запрошенное распределение включает перемещение фрагмента с node1 на node2, это может привести к перемещению фрагмента с node2 обратно на node1 для выравнивания.
Кластер может быть настроен на отключение распределения с помощью настройки cluster.routing.allocation.enable. Если распределение отключено, единственные распределения, которые будут выполняться, — это явные, заданные с помощью команды reroute, и последующие распределения из-за перебалансировки.
Возможна запуск команд reroute в режиме «сухого запуска» с помощью параметра запроса URI ?dry_run или передачей "dry_run": true в теле запроса. Это позволит рассчитать результат применения команд к текущему состоянию кластера и вернуть результирующее состояние кластера после применения команд (и перебалансировки), но фактически не выполнит запрошенные изменения.
Если включен параметр URI ?explain, в ответ будет включено подробное объяснение, почему команды могут быть или не могут быть выполнены.
Кластер попытается распределить фрагмент максимум index.allocation.max_retries раз подряд (по умолчанию 5), прежде чем отказаться и оставить фрагмент нераспределённым. Такая ситуация может быть вызвана структурными проблемами, такими как наличие анализатора, который ссылается на файл стоп-слов, которого нет на всех узлах.
После исправления проблемы распределение можно вручную повторить, вызвав API reroute с параметром URI ?retry_failed, что позволит выполнить одну попытку повторной обработки для этих фрагментов.
Параметры запроса
-
dry_run - (Необязательно, Булево) Если
true, запрос моделирует операцию только и возвращает результирующее состояние. -
explain - (Необязательно, Булево) Если
true, ответ содержит объяснение, почему команды могут или не могут быть выполнены. -
metric -
(Необязательно, строка) Ограничивает информацию, возвращаемую указанными метриками. Все варианты, кроме
none, устарели и должны быть избегаемы для этого параметра. По умолчанию — все, кроме метаданных. Доступны следующие варианты:Варианты для
metric-
_all - Показать все метрики.
-
blocks - Показать
blocksчасть ответа. -
master_node - Показать выбранную
master_nodeчасть ответа. -
metadata - Показать
metadataчасть ответа. Если вы укажете список индексов через запятую, возвращаемый вывод будет содержать только метаданные для этих индексов. -
nodes - Показать
nodesчасть ответа. -
none - Исключить все поле
stateиз ответа. -
routing_table - Показать
routing_tableчасть ответа. -
version - Показать версию состояния кластера.
-
-
retry_failed - (Необязательно, Булево) Если
true, то возобновляет распределение фрагментов, заблокированных из-за слишком большого количества последующих неудач распределения. -
master_timeout - (Необязательно, единицы времени) Время ожидания узла-мастера. Если узел-мастер недоступен до истечения срока ожидания, запрос завершается ошибкой. По умолчанию
30s. Также может быть установлено в-1, чтобы указать, что запрос никогда не должен истекать. -
timeout - (Необязательно, единицы времени) Время ожидания ответа от всех соответствующих узлов в кластере после обновления метаданных кластера. Если ответ не получен до истечения срока ожидания, обновление метаданных кластера всё равно применяется, но в ответе будет указано, что оно не было полностью подтверждено. По умолчанию
30s. Также может быть установлено в-1, чтобы указать, что запрос никогда не должен истекать.
Тело запроса
-
commands -
(Обязательно, массив объектов) Определяет команды для выполнения. Поддерживаемые команды:
Свойства
commands-
move - Перемещает запущенный фрагмент с одного узла на другой. Принимает
indexиshardдля имени индекса и номера фрагмента,from_nodeдля узла, с которого перемещается фрагмент, иto_nodeдля узла, на который перемещается фрагмент. -
cancel - Отменяет распределение фрагмента (или восстановление). Принимает
indexиshardдля имени индекса и номера фрагмента, иnodeдля узла, на котором отменяется распределение фрагмента. Это может быть использовано для принудительной ресинхронизации существующих реплик из первичного фрагмента, отменив их и позволив им быть повторно инициализированными через стандартный процесс восстановления. По умолчанию можно отменять распределение только реплики фрагмента. Если необходимо отменить распределение первичного фрагмента, то флагallow_primaryтакже должен быть включён в запрос. -
allocate_replica - Распределяет неназначенный реплики фрагмент на узел. Принимает
indexиshardдля имени индекса и номера фрагмента, иnodeдля распределения фрагмента. Учитывает решатели распределения.
Доступны еще две команды, которые позволяют распределить первичный фрагмент на узел. Однако эти команды следует использовать с большой осторожностью, так как распределение первичных фрагментов обычно полностью обрабатывается автоматически Elasticsearch. Причины, по которым первичный фрагмент не может быть автоматически распределен, включают:
- Новый индекс был создан, но нет узла, который удовлетворяет решателям распределения.
- Актуальная копия фрагмента данных не найдена на текущих узлах данных в кластере. Чтобы предотвратить потерю данных, система не автоматически повышает устаревшую копию фрагмента до первичной.
Следующие две команды опасны и могут привести к потере данных. Они предназначены для использования в случаях, когда исходные данные не могут быть восстановлены, и администратор кластера принимает потерю. Если у вас возникла временная проблема, которая может быть исправлена, см. флаг
retry_failed, описанный выше. В качестве акцента: если эти команды выполнены, а затем в кластер присоединяется узел, содержащий копию затронутого фрагмента, то копия на вновь присоединившемся узле будет удалена или перезаписана.-
allocate_stale_primary - Распределяет первичный фрагмент на узел, содержащий устаревшую копию. Принимает
indexиshardдля имени индекса и номера фрагмента, иnodeдля распределения фрагмента. Использование этой команды может привести к потере данных для предоставленного идентификатора фрагмента. Если позже в кластер присоединится узел с хорошей копией данных, эти данные будут удалены или перезаписаны данными устаревшей копии, которая была принудительно распределена с помощью этой команды. Чтобы обеспечить полное понимание этих последствий, эта команда требует, чтобы флагaccept_data_lossбыл явно установлен вtrue. -
allocate_empty_primary - Распределяет пустой первичный фрагмент на узел. Принимает
indexиshardдля имени индекса и номера фрагмента, иnodeдля распределения фрагмента. При использовании этой команды происходят полная потеря всех данных, которые были индексированы в этот фрагмент, если он был ранее запущен. Если позже в кластер присоединится узел с копией данных, эти данные будут удалены. Чтобы обеспечить полное понимание этих последствий, эта команда требует, чтобы флагaccept_data_lossбыл явно установлен вtrue.
-
Примеры
Вот короткий пример простого вызова API для перенаправления:
POST /_cluster/reroute?metric=none
{
"commands": [
{
"move": {
"index": "test", "shard": 0,
"from_node": "node1", "to_node": "node2"
}
},
{
"allocate_replica": {
"index": "test", "shard": 1,
"node": "node3"
}
}
]
}
© 2023-2025 Elasticsearch
As of September 2024, Elasticsearch is available under a choice of three licenses: the Server Side Public License (SSPL), the Elastic License, or the AGPLv3 (OSI approved).
Elasticsearch and the Elasticsearch logo are trademarks of Elasticsearch B.V., registered in the U.S. and in other countries.
https://www.elastic.co/guide/en/elasticsearch/reference/8.17/cluster-reroute.html