当前位置: 首页 > news >正文

Elasticsearch Circuit Breaker 全面解析与最佳实践

一、Circuit Breaker 简介

Elasticsearch 是基于 JVM 的搜索引擎,其内存管理十分重要。为了避免单个操作或查询耗费过多内存导致节点不可用,Elasticsearch 引入了 Circuit Breaker(熔断器)机制。当内存使用达到熔断器预设阈值时,相应操作会立即被中止,并返回明确的错误信息。

注意:
Circuit Breaker 并不能完全跟踪 Elasticsearch 所有内存使用情况,因此并不能提供 100% 完整的内存保护。

二、Elasticsearch 中的 Circuit Breaker 类型与配置

Elasticsearch 提供了多个类型的熔断器,以限制不同场景的内存使用:

1. 父级熔断器(Parent Circuit Breaker)

父级熔断器用于控制整体内存使用,设定所有子熔断器的整体上限:

  • indices.breaker.total.use_real_memory(静态)
    是否使用真实内存,默认为 true

  • indices.breaker.total.limit(动态)
    总体熔断器内存上限:

    • use_real_memory=false,默认值为 JVM Heap 的 70%;
    • use_real_memory=true,默认值为 JVM Heap 的 95%。

推荐配置:

PUT _cluster/settings
{"persistent": {"indices.breaker.total.limit": "90%"}
}

2. Field Data 熔断器

控制字段数据缓存加载时的内存使用:

  • indices.breaker.fielddata.limit(动态)
    默认为 JVM Heap 的 40%。

  • indices.breaker.fielddata.overhead(动态)
    内存预估系数,默认为 1.03

推荐配置(默认即可):

PUT _cluster/settings
{"persistent": {"indices.breaker.fielddata.limit": "40%","indices.breaker.fielddata.overhead": 1.03}
}

3. 请求熔断器(Request Circuit Breaker)

用于控制单个请求期间数据结构内存:

  • indices.breaker.request.limit(动态)
    默认 JVM Heap 的 60%。

  • indices.breaker.request.overhead(动态)
    默认 1

推荐配置:

PUT _cluster/settings
{"persistent": {"indices.breaker.request.limit": "60%"}
}

4. 在途请求熔断器(In-flight Requests Circuit Breaker)

限制传输层与 HTTP 请求的内存使用:

  • network.breaker.inflight_requests.limit(动态)
    默认为 JVM Heap 的 100%。

  • network.breaker.inflight_requests.overhead(动态)
    默认系数为 2

推荐配置:

PUT _cluster/settings
{"persistent": {"network.breaker.inflight_requests.limit": "90%","network.breaker.inflight_requests.overhead": 2}
}

5. 脚本编译熔断器(Script Compilation Circuit Breaker)

限制单位时间内内联脚本的编译数量:

  • script.max_compilations_rate(动态)
    默认每 5 分钟 150 次。

当脚本缓存频繁淘汰(cache_evictions)时,应扩大脚本缓存:

PUT _cluster/settings
{"persistent": {"script.cache.max_size": "2000"}
}

6. 正则表达式熔断器(Regex Circuit Breaker)

限制 Painless 脚本中正则表达式的复杂性:

  • script.painless.regex.enabled(静态)
    可选值:

    • limited(默认):启用,但限制复杂度。
    • true:完全启用,无复杂度限制。
    • false:禁用正则。
  • script.painless.regex.limit-factor(静态)
    默认值为 6,表示脚本输入长度的倍数作为最大匹配长度限制。

推荐配置:

script.painless.regex.enabled: limited
script.painless.regex.limit-factor: 6

7. EQL 查询熔断器(EQL Circuit Breaker)

针对序列查询的内存控制:

  • breaker.eql_sequence.limit(动态)
    默认 JVM Heap 的 50%。

  • breaker.eql_sequence.overhead(动态)
    默认为 1

  • breaker.eql_sequence.type(静态)
    熔断器类型:

    • memory(默认):启用。
    • noop:禁用。

推荐配置:

PUT _cluster/settings
{"persistent": {"breaker.eql_sequence.limit": "40%","breaker.eql_sequence.overhead": 1}
}

8. 机器学习熔断器(Machine Learning Circuit Breaker)

控制机器学习模型推理的内存使用:

  • breaker.model_inference.limit(动态)
    默认 JVM Heap 的 50%。

  • breaker.model_inference.overhead(动态)
    默认 1

  • breaker.model_inference.type(静态)
    熔断器类型:

    • memory(默认):启用。
    • noop:禁用。

推荐配置(默认即可):

PUT _cluster/settings
{"persistent": {"breaker.model_inference.limit": "50%"}
}

三、最佳实践和建议

  • 避免设置过高
    熔断器的阈值设置过高,可能导致节点 OOM 崩溃。

  • 合理分配熔断器比例
    父级熔断器一般不超过 JVM Heap 的 90%。各子熔断器在此基础上再进行分配。

  • 动态调整与监控
    Elasticsearch 支持大部分熔断器动态修改,实时监控并按需调整是维护集群稳定性的关键。

  • 关注日志与监控系统
    使用 Elasticsearch 的日志系统及监控工具,及时发现并分析 Circuit Breaker 错误,合理调整内存阈值。

四、总结

Circuit Breaker 是 Elasticsearch 集群运行中的重要保护机制。深入理解各类熔断器的作用及配置方法,合理设置各项阈值,能有效防止 Elasticsearch 由于内存资源耗尽而宕机,从而提升整个集群的稳定性和性能表现。

运维人员应结合业务场景,动态监控并适时调整熔断器配置,以保持 Elasticsearch 集群稳定高效地运行。

http://www.dtcms.com/a/294109.html

相关文章:

  • 【Word Press基础】创建一个动态的自定义区块
  • JS逆向基础( AES 解密密文WordArray和Uint8Array实战②)
  • 【无标题】word 中的中文排序
  • Pycharm2025 安装教程 免费分享 没任何套路
  • PDF转Word的简单方法
  • CSP-J 2021 入门级 第一轮(初赛) 阅读程序(3)
  • Android组件化实现方案深度分析
  • Day 8-zhou R包批量安装小补充!!!
  • java设计模式 -【策略模式】
  • AJAX案例合集
  • flutter使用CupertinoPicker绘制一个传入数据源的省市区选择器
  • 二级建造师学习笔记-2025
  • 【Linux-云原生-笔记】keepalived相关
  • DenseNet详解,附模型代码(pytorch)
  • Python设计模式 - 桥接模式
  • vite搭建react-ts项目,@别名配置
  • Python-Pytorch编码习惯
  • Windows 编程辅助技能:速览定义
  • 生成式人工智能展望报告-欧盟-02-技术方面
  • 以 “有机” 重构增长:云集从电商平台到健康生活社区的跃迁
  • 突发限制下的破局之路:国产之光 Lynx 重构 AI 开发安全壁垒
  • Petalinux的常用指令
  • Hexo - 免费搭建个人博客04 - 创建另一个私人仓库,对Hexo项目进行版本管理
  • RabbitMQ--消费端单线程与多线程
  • 电子电气架构 --- 汽车软件全生命周期
  • 小架构step系列23:加载自定义配置
  • Vue 浏览器本地存储
  • 05-ES6
  • Linux修炼:进程概念(上)
  • apache-doris安装兼datax-web配置