14. 断路器设置

Elasticsearch包含多个电路断路器,用于防止操作导致OutOfMemoryError。每个断路器都指定了它可以使用多少内存的限制。此外,还有一个父级断路器,指定了所有断路器可以使用的总内存量。

除非另有说明,这些设置可以通过cluster-update-settings API在运行中的群集上进行动态更新。

有关电路断路器错误的信息,请参阅电路断路器错误。

父级断路器

父级断路器可以通过以下设置进行配置:

  • indices.breaker.total.use_real_memory (静态)确定父断路器是否应考虑实际内存使用情况(true),还是仅考虑子断路器保留的内存量(false)。默认为true。
  • indices.breaker.total.limit logo cloud (动态)整体父断路器的初始限制。如果 indices.breaker.total.use_real_memory 为false,默认为JVM堆的70%。如果 indices.breaker.total.use_real_memory 为true,默认为JVM堆的95%。
Field data circuit breaker

和doc_values不同的是fielddata使用的是JVM的堆内存(doc_values使用的是堆外内存),而且是常驻内存。所以如果不加控制很容易导致Java的OOM,因此es有个断路器的设置,计算这次会超出阈值的时候就会发生熔断,抛出类似 [fielddata] Data too large, data for [_id] would be [7267783454/6.7gb], which is larger than the limit of [6871947673/6.3gb] 的错误

字段数据断路器估算将字段加载到字段数据缓存中所需的堆内存。如果加载字段将导致缓存超过预定义的内存限制,则断路器会停止操作并返回错误。

  • indices.breaker.fielddata.limit logo cloud (动态)fielddata断路器的限制。默认为JVM堆的40%。
  • indices.breaker.fielddata.overhead logo cloud (动态)所有字段数据估算都要乘以该常量,以确定最终估算。默认为1.03。
请求断路器

请求断路器允许Elasticsearch防止每个请求的数据结构(例如,在请求期间用于计算聚合的内存)超过一定数量的内存。

  • indices.breaker.request.limit logo cloud (动态)请求断路器的限制,默认为JVM堆的60%。
  • indices.breaker.request.overhead logo cloud (动态)所有请求估算都要乘以该常量,以确定最终估算。默认为1。
正在进行的请求断路器

正在进行的请求断路器允许Elasticsearch限制所有当前活动的传入请求在节点上的内存使用量,以防超过一定数量的内存。内存使用量基于请求本身的内容长度。此断路器还考虑到内存不仅需要用于表示原始请求,还需要用于表示由默认开销反映的结构化对象。

  • network.breaker.inflight_requests.limit (动态)正在进行的请求断路器的限制,默认为JVM堆的100%。这意味着它受到为父断路器配置的限制的约束。
  • network.breaker.inflight_requests.overhead (动态)所有正在进行的请求估算都要乘以该常量,以确定最终估算。默认为2。

会计请求断路器

会计断路器允许Elasticsearch限制在内存中保留的在请求完成时未释放的内容的内存使用量。这包括诸如Lucene段内存之类的内容。

  • indices.breaker.accounting.limit (动态)会计断路器的限制,默认为JVM堆的100%。这意味着它受到为父断路器配置的限制的约束。
  • indices.breaker.accounting.overhead (动态)所有会计估算都要乘以该常量,以确定最终估算。默认为1
脚本编译断路器

与先前基于内存的断路器略有不同,脚本编译断路器限制了一定时间内内联脚本编译的次数。

有关更多信息,请参见脚本文档的"prefer-parameters"部分。

  • script.max_compilations_rate (动态)在一定时间内允许编译的唯一动态脚本数量的限制。默认为150/5m,表示每5分钟150个。
EQL断路器

执行序列查询时,处理查询的节点需要保留一些结构在内存中,这些结构是由实现序列匹配的算法所需的。当需要处理大量数据和/或用户通过设置size查询参数请求大量匹配的序列时,这些结构占用的内存可能会超过JVM的可用内存。这将导致OutOfMemory异常,从而使节点宕机。

为了防止这种情况发生,使用了一个特殊的断路器,该断路器在执行序列查询期间限制内存分配。当触发断路器时,将抛出一个org.elasticsearch.common.breaker.CircuitBreakingException,并向用户返回一个描述性错误消息。

可以使用以下设置配置此断路器:

  • breaker.eql_sequence.limit (动态)用于限制执行EQL序列查询期间内存利用的断路器的限制。此值定义为JVM堆的百分比。默认为50%。如果父断路器设置为小于50%的值,则此设置将使用该值作为其默认值。
  • breaker.eql_sequence.overhead (动态)序列查询内存估算都要乘以该常数,以确定最终估算。默认为1。
  • breaker.eql_sequence.type (静态)断路器类型。有效值为:
    • memory(默认) 该断路器限制EQL序列查询的内存使用。
    • noop 禁用断路器。
机器学习断路器
  • breaker.model_inference.limit (动态)训练模型断路器的限制。此值定义为JVM堆的百分比。默认为50%。如果父断路器设置为小于50%的值,则此设置将使用该值作为其默认值。
  • breaker.model_inference.overhead (动态)所有训练模型估算都要乘以该常数,以确定最终估算。请参阅断路器设置。默认为1。
  • breaker.model_inference.type (静态)断路器的基础类型。有两个有效选项:noop和memory。noop表示断路器不采取任何措施防止过多的内存使用。memory表示断路器跟踪由训练模型使用的内存,可能会中断并防止OutOfMemory错误。默认值为memory。
相关推荐
Elasticsearch19 小时前
在 ES|QL 中的混合搜索和多阶段检索
elasticsearch
AC赳赳老秦20 小时前
量化交易脚本开发:DeepSeek生成技术指标计算与信号触发代码
数据库·elasticsearch·信息可视化·流程图·数据库架构·memcached·deepseek
Elastic 中国社区官方博客20 小时前
使用 Elastic Agent Builder 和 MCP 实现 Agentic 参考架构
大数据·人工智能·elasticsearch·搜索引擎·ai·架构·全文检索
予枫的编程笔记21 小时前
Elasticsearch深度搜索与查询DSL实战:精准定位数据的核心技法
java·大数据·人工智能·elasticsearch·搜索引擎·全文检索
予枫的编程笔记1 天前
Elasticsearch聚合分析与大规模数据处理:解锁超越搜索的进阶能力
java·大数据·人工智能·分布式·后端·elasticsearch·全文检索
我是海飞1 天前
Git 本地仓库推送到远程空仓库指南
大数据·git·elasticsearch
better_liang1 天前
每日Java面试场景题知识点之-ELK技术栈实战应用
java·elk·elasticsearch·kibana·logstash·日志分析·企业级应用
予枫的编程笔记1 天前
Elasticsearch核心架构与基础原理:解密其极速性能的底层逻辑
java·大数据·人工智能·elasticsearch·搜索引擎·架构·全文检索
长路 ㅤ   1 天前
ES索引切分方案4:索引+别名 应用层自己维护:时间序列索引
elasticsearch·索引模板·时间序列索引·别名系统·大数据优化
小龙1 天前
【Git 报错解决】本地分支与远程分支名称/提交历史不匹配
大数据·git·elasticsearch·github