断路器错误编辑

Elasticsearch 使用断路器来防止节点耗尽 JVM 堆内存。如果 Elasticsearch 估计某个操作会超出断路器的限制,它会停止该操作并返回错误。

默认情况下,父断路器会在 JVM 内存使用率达到 95% 时触发。为防止出现错误,如果使用率持续超过 85%,我们建议采取措施降低内存压力。

诊断断路器错误编辑

错误消息

如果请求触发了断路器,Elasticsearch 会返回一个带有 429 HTTP 状态码的错误。

{
  '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 内存使用情况

如果您启用了堆栈监控,则可以在 Kibana 中查看 JVM 内存使用情况。在主菜单中,单击堆栈监控。在堆栈监控概览页面上,单击节点JVM 堆列列出了每个节点的当前内存使用情况。

您还可以使用cat nodes API 获取每个节点的当前 heap.percent

response = client.cat.nodes(
  v: true,
  h: 'name,node*,heap*'
)
puts response
GET _cat/nodes?v=true&h=name,node*,heap*

要获取每个断路器的 JVM 内存使用情况,请使用节点统计信息 API

response = client.nodes.stats(
  metric: 'breaker'
)
puts response
GET _nodes/stats/breaker

防止断路器错误编辑

降低 JVM 内存压力

JVM 内存压力过高通常会导致断路器错误。请参阅JVM 内存压力过高

避免在 text 字段上使用字段数据

对于高基数的 text 字段,字段数据可能会使用大量的 JVM 内存。为了避免这种情况,Elasticsearch 默认情况下会禁用 text 字段上的字段数据。如果您启用了字段数据并触发了字段数据断路器,请考虑禁用它并改用 keyword 字段。请参阅fielddata 映射参数

清除字段数据缓存

如果您触发了字段数据断路器并且无法禁用字段数据,请使用清除缓存 API 清除字段数据缓存。这可能会中断任何使用字段数据的正在进行的搜索。

response = client.indices.clear_cache(
  fielddata: true
)
puts response
POST _cache/clear?fielddata=true