API перераспределения кластера
Изменяет распределение фрагментов в кластере.
Запрос
POST /_cluster/reroute
Предварительные условия
- Если включены функции безопасности Elasticsearch, вам необходимо иметь право предоставления прав доступа к кластеру, чтобы использовать этот 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 -
(Необязательно, строка) Ограничивает возвращаемую информацию до указанных метрик. По умолчанию возвращаются все, кроме метаданных. Доступны следующие варианты:
Варианты для
metric-
_all - Показываются все метрики.
-
blocks - Показывается часть ответа
blocks. -
master_node - Показывается часть ответа
master_node. -
metadata - Показывается часть ответа
metadata. Если вы передадите запятой-разделенный список индексов, возвращаемый вывод будет содержать только метаданные для этих индексов. -
nodes - Показывается часть ответа
nodes. -
routing_table - Показывается часть ответа
routing_table. -
version - Показывается версия состояния кластера.
-
-
retry_failed - (Необязательно, логическое значение) Если
true, то повторяет распределение фрагментов, заблокированных из-за слишком большого количества последующих неудач при распределении. -
master_timeout - (Необязательно, единицы времени) Период ожидания соединения с мастер-узлом. Если ответ не получен до истечения таймаута, запрос завершается с ошибкой. По умолчанию
30s. -
timeout - (Необязательно, единицы времени) Период ожидания ответа. Если ответ не получен до истечения таймаута, запрос завершается с ошибкой. По умолчанию
30s.
Тело запроса
-
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
{
"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/7.17/cluster-reroute.html