Spec-Zone.ru › Elasticsearch 8
›Elasticsearch Guide [8.17] ›Устранение неполадок

Устранение проблем с несбалансированным кластером

Elasticsearch распределяет фрагменты по уровням данных, чтобы достичь хорошего баланса между:

  • количеством фрагментов
  • использованием дискового пространства
  • нагрузкой на запись (для индексов в потоках данных)

Если вы используете Elastic Cloud Hosted, вы можете использовать AutoOps для мониторинга вашего кластера. AutoOps значительно упрощает управление кластером, предоставляя рекомендации по производительности, визуализацию использования ресурсов, обнаружение проблем в реальном времени и пути решения проблем. Для получения дополнительной информации, обратитесь к Мониторинг с помощью AutoOps.

Elasticsearch не учитывает объем или сложность запросов поиска при перебалансировке фрагментов. Это косвенно достигается балансировкой количества фрагментов и использования дискового пространства.

Нет гарантии, что отдельные компоненты будут равномерно распределены по узлам. Это может произойти, если некоторые узлы имеют меньше фрагментов или используют меньше дискового пространства, но им назначены фрагменты с большей нагрузкой на запись.

Используйте команду cat allocation для отображения рабочей нагрузки по узлам:

resp = client.cat.allocation(
    v=True,
)
print(resp)
response = client.cat.allocation(
  v: true
)
puts response
const response = await client.cat.allocation({
  v: "true",
});
console.log(response);
GET /_cat/allocation?v

API возвращает следующий ответ:

shards shards.undesired write_load.forecast disk.indices.forecast disk.indices disk.used disk.avail disk.total disk.percent host      ip        node    node.role
     1                0                 0.0                  260b         260b    47.3gb     43.4gb    100.7gb           46 127.0.0.1 127.0.0.1 CSUXak2 himrst

Этот ответ содержит следующую информацию, влияющую на балансировку:

  • shards — текущее количество фрагментов, выделенных узлу
  • shards.undesired — количество фрагментов, которые необходимо переместить на другие узлы для завершения балансировки
  • disk.indices.forecast — ожидаемое использование дискового пространства в соответствии с прогнозируемым ростом фрагментов
  • write_load.forecast — прогнозируемая общая нагрузка на запись, связанная с этим узлом

Кластер считается сбалансированным, когда все фрагменты находятся в желаемых местах, что означает, что дальнейшие перемещения фрагментов не планируются (все shards.undesired значения равны 0).

Некоторые операции, такие как перезапуск узла, вывод из эксплуатации или изменение настроек распределения кластера, являются неблагоприятными и могут потребовать перемещения нескольких фрагментов для перебалансировки кластера.

Порядок перемещения фрагментов не является детерминированным и в основном определяется готовностью исходного и целевого узла к перемещению фрагмента. Во время перебалансировки некоторые узлы могут показаться более загруженными, чем другие.

Если фрагмент назначен на нежелательный узел, он использует ресурсы текущего узла вместо целевого. Это может привести к узким местам (диск или ЦП), когда несколько фрагментов находятся на текущем узле, которые еще не были перемещены в соответствующие целевые узлы.

Если кластер долго перебалансируется, вы можете найти следующие записи в журнале:

[WARN][o.e.c.r.a.a.DesiredBalanceReconciler] [10%] of assigned shards (10/100) are not on their desired nodes, which exceeds the warn threshold of [10%]

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

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

В этом случае увеличьте значение cluster.routing.allocation.balance.threshold, чтобы уменьшить чувствительность алгоритма, пытающегося выровнять количество фрагментов и использование дискового пространства в кластере.

И сбросьте желаемый баланс, используя следующий вызов API:

resp = client.perform_request(
    "DELETE",
    "/_internal/desired_balance",
)
print(resp)
const response = await client.transport.request({
  method: "DELETE",
  path: "/_internal/desired_balance",
});
console.log(response);
DELETE /_internal/desired_balance

© 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/troubleshooting-unbalanced-cluster.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API