--- title: "内存断路器类型配置" date: 2026-01-27 lastmod: 2026-01-27 description: "indices.breaker.type 配置项用于控制内存断路器的实现类型。" tags: ["断路器", "内存管理", "Hierarchy", "CircuitBreaker"] summary: "配置项作用 # 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." --- ## 配置项作用 `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 断路器: 内存使用监控 │ ↓ 无限制 │ ↓ 可能内存溢出 ❌ ``` ## 配置建议 ## 生产环境(默认) ```yaml indices: breaker: type: hierarchy # 默认值 ``` **建议**: 保持默认值 `hierarchy`。提供内存保护。 ## 开发/测试环境 ```yaml indices: breaker: type: none # 禁用断路器 ``` **建议**: 设置为 `none`。开发测试环境可以禁用。 ## 故障排查场景 ```yaml indices: breaker: type: none # 临时禁用 ``` **建议**: 临时设置为 `none`。排查内存问题时使用。 ## 调试内存问题 ```yaml indices: breaker: type: hierarchy # 保持启用 ``` **建议**: 保持启用。通过调整各断路器限制来调试。 ## 代码示例 ## easysearch.yml 基础配置 ```yaml indices: breaker: type: hierarchy ``` ## 禁用断路器配置 ```yaml indices: breaker: type: none ``` ## 完整断路器配置 ```yaml indices: breaker: type: hierarchy fielddata: limit: 40% request: limit: 40% accounting: limit: 95% ``` ## 动态更新配置 ```json PUT /_cluster/settings { "transient": { "indices.breaker.type": "none" } } ``` ## 相关配置 | 配置项 | 作用 | 默认值 | |--------|------|--------| | `indices.breaker.type` | 断路器类型 | hierarchy | | `indices.breaker.fielddata.limit` | fielddata 断路器限制 | 40% | | `indices.breaker.request.limit` | request 断路器限制 | 40% | | `indices.breaker.accounting.limit` | accounting 断路器限制 | 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. **版本兼容**: 不同版本的断路器实现可能不同。