📣 极限科技诚招搜索运维工程师(Elasticsearch/Easysearch)- 全职/北京 👉 : 立即申请加入

配置项作用 #

indices.breaker.type 配置项用于控制Easysearch 内存断路器的实现类型

断路器是 Easysearch 重要的内存保护机制,用于防止内存使用超过限制导致系统崩溃。

配置项属性 #

  • 配置路径: indices.breaker.type
  • 数据类型: String(字符串)
  • 默认值: hierarchy
  • 有效值: hierarchy, none
  • 是否可选: 是
  • 作用域: NodeScope(节点级别)

配置项详解 #

工作机制 #

断路器类型选择

indices.breaker.type = hierarchy (默认):
    │
    ↓
HierarchyCircuitBreakerService
    │
    ├─── fielddata breaker
    │         └── 字段数据和缓存
    │
    ├─── request breaker
    │         └── 单个请求内存
    │
    ├─── accounting breaker
    │         └── Lucene 段内存
    │
    ├─── in_flight_requests breaker
    │         └── 网络层内存
    │
    └─── parent breaker
              └── 汇总所有断路器

内存保护 ✅


indices.breaker.type = none:
    │
    ↓
NoneCircuitBreakerService
    │
    └── NoopCircuitBreaker (无操作)

无内存限制 ❌

Hierarchy 断路器结构 #

层次化断路器架构

总限制: 95% JVM 堆
    │
    ├─── fielddata (40%)
    │         └── 字段缓存、父子查询
    │
    ├─── request (40%)
    │         └── 聚合、排序等
    │
    ├─── accounting (95%)
    │         └── Lucene 段
    │
    └─── in_flight_requests (10%)
              └── 网络读写

动态重分配:
某个 breaker 超限
    ↓
尝试从其他 breaker 借用配额
    ↓
保护系统不崩溃

断路器行为对比 #

Hierarchy 断路器:

内存使用监控
    │
    ├──── fielddata breaker 超限
    │              │
    │              ↓
    │         尝试减少 fielddata
    │              │
    │              ↓
    │         请求被拒绝
    │
    └──── parent breaker 超限
                   │
                   ↓
              尝试重新分配
                   │
                   ├──── 成功 ✅
                   │
                   └──── 失败 ❌
                          ↓
                     系统保护


None 断路器:

内存使用监控
    │
    ↓
无限制
    │
    ↓
可能内存溢出 ❌

配置建议 #

生产环境(默认) #

indices:
  breaker:
    type: hierarchy  # 默认值

建议: 保持默认值 hierarchy。提供内存保护。

开发/测试环境 #

indices:
  breaker:
    type: none  # 禁用断路器

建议: 设置为 none。开发测试环境可以禁用。

故障排查场景 #

indices:
  breaker:
    type: none  # 临时禁用

建议: 临时设置为 none。排查内存问题时使用。

调试内存问题 #

indices:
  breaker:
    type: hierarchy  # 保持启用

建议: 保持启用。通过调整各断路器限制来调试。

代码示例 #

easysearch.yml 基础配置 #

indices:
  breaker:
    type: hierarchy

禁用断路器配置 #

indices:
  breaker:
    type: none

完整断路器配置 #

indices:
  breaker:
    type: hierarchy
    fielddata:
      limit: 40%
    request:
      limit: 40%
    accounting:
      limit: 95%

动态更新配置 #

PUT /_cluster/settings
{
  "transient": {
    "indices.breaker.type": "none"
  }
}

相关配置 #

配置项作用默认值
indices.breaker.type断路器类型hierarchy
indices.breaker.fielddata.limitfielddata 断路器限制40%
indices.breaker.request.limitrequest 断路器限制40%
indices.breaker.accounting.limitaccounting 断路器限制100%

断路器类型对比 #

类型内存保护性能开销推荐场景
hierarchy(默认)完善✅较低生产环境
none无❌开发/测试

使用场景 #

推荐使用 hierarchy 的场景 #

  • 生产环境: 需要内存保护
  • 资源受限: 内存有限的环境
  • 大数据量: 处理大量数据
  • 集群部署: 多节点集群

推荐使用 none 的场景 #

  • 开发环境: 开发测试时禁用
  • 内存充足: 内存非常充足
  • 性能测试: 需要测试最大性能
  • 故障排查: 排查内存问题时

子断路器说明 #

Hierarchy 断路器的子断路器

1. fielddata 断路器
   跟踪: 字段数据、父子查询缓存
   持久性: TRANSIENT(临时)
   释放: 不活跃时释放

2. request 断路器
   跟踪: 单个请求的内存
   持久性: TRANSIENT(临时)
   释放: 请求完成后释放

3. accounting 断路器
   跟踪: Lucene 索引段
   持久性: PERMANENT(持久)
   释放: 只能删除索引

4. in_flight_requests 断路器
   跟踪: 网络层读写
   持久性: TRANSIENT(临时)
   释放: 网络操作完成

5. parent 断路器
   跟踪: 所有子断路器的总和
   作用: 协调内存分配

注意事项 #

  1. 默认值: 默认值为 hierarchy,适用于大多数场景。

  2. 生产环境: 生产环境强烈不建议使用 none

  3. 动态更新: 支持动态更新,但切换到 none 需谨慎。

  4. 内存保护: hierarchy 类型提供重要的内存保护机制。

  5. 动态重分配: Hierarchy 支持断路器间的内存重分配。

  6. 性能影响: hierarchy 会带来轻微的性能开销。

  7. 切换风险: 从 none 切换到 hierarchy 需要重启节点。

  8. 监控建议: 监控各断路器的内存使用情况。

  9. 配置验证: 切换类型后验证配置是否生效。

  10. 版本兼容: 不同版本的断路器实现可能不同。