Ошибки разрыва цепи
Elasticsearch использует разрывы цепи, чтобы предотвратить выход узлов из памяти JVM. Если Elasticsearch оценивает, что операция превысит разрыв цепи, он останавливает операцию и возвращает ошибку.
По умолчанию главный разрыв цепи срабатывает при использовании 95% памяти JVM. Чтобы предотвратить ошибки, рекомендуется принять меры для снижения нагрузки на память, если использование постоянно превышает 85%.
См. это видео для пошагового руководства по диагностике ошибок разрыва цепи.
Диагностика ошибок разрыва цепи
Сообщения об ошибках
Если запрос вызывает разрыв цепи, Elasticsearch возвращает ошибку со статусом HTTP 429.
{
'error': {
'type': 'circuit_breaking_exception',
'reason': '[parent] Data too large, data for [<http_request>] would be [123848638/118.1mb], which is larger than the limit of [123273216/117.5mb], real usage: [120182112/114.6mb], new bytes reserved: [3666526/3.4mb]',
'bytes_wanted': 123848638,
'bytes_limit': 123273216,
'durability': 'TRANSIENT'
},
'status': 429
} Elasticsearch также записывает ошибки разрыва цепи в elasticsearch.log. Это полезно, когда автоматизированные процессы, такие как выделение ресурсов, вызывают разрыв цепи.
Caused by: org.elasticsearch.common.breaker.CircuitBreakingException: [parent] Data too large, data for [<transport_request>] would be [num/numGB], which is larger than the limit of [num/numGB], usages [request=0/0b, fielddata=num/numKB, in_flight_requests=num/numGB, accounting=num/numGB]
Проверка использования памяти JVM
Если вы включили мониторинг стека, вы можете просмотреть использование памяти JVM в Kibana. В главном меню нажмите Мониторинг стека. На странице обзора Мониторинга стека нажмите Узлы. Столбец Куча JVM содержит текущее использование памяти для каждого узла.
Вы также можете использовать API cat nodes для получения текущего heap.percent для каждого узла.
resp = client.cat.nodes(
v=True,
h="name,node*,heap*",
)
print(resp) response = client.cat.nodes( v: true, h: 'name,node*,heap*' ) puts response
const response = await client.cat.nodes({
v: "true",
h: "name,node*,heap*",
});
console.log(response); GET _cat/nodes?v=true&h=name,node*,heap*
Чтобы получить использование памяти JVM для каждого разрыва цепи, используйте API node stats.
resp = client.nodes.stats(
metric="breaker",
)
print(resp) response = client.nodes.stats( metric: 'breaker' ) puts response
const response = await client.nodes.stats({
metric: "breaker",
});
console.log(response); GET _nodes/stats/breaker
Предотвращение ошибок разрыва цепи
Снижение нагрузки на память JVM
Высокая нагрузка на память JVM часто приводит к ошибкам разрыва цепи. См. Высокую нагрузку на память JVM.
Избегайте использования fielddata для text полей
Для полей с высокой кардинальностью text fielddata может использовать большое количество памяти JVM. Чтобы этого избежать, Elasticsearch по умолчанию отключает fielddata для text полей. Если вы включили fielddata и спровоцировали разрыв цепи fielddata, рассмотрите возможность его отключения и использования вместо него keyword поля. См. fielddata параметр сопоставления.
Очистка кэша fielddata
Если вы спровоцировали разрыв цепи fielddata и не можете отключить fielddata, используйте API очистки кэша для очистки кэша fielddata. Это может нарушить любые выполняющиеся запросы, использующие fielddata.
resp = client.indices.clear_cache(
fielddata=True,
)
print(resp) response = client.indices.clear_cache( fielddata: true ) puts response
const response = await client.indices.clearCache({
fielddata: "true",
});
console.log(response); POST _cache/clear?fielddata=true
© 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/circuit-breaker-errors.html