--- title: "Zen 故障检测配置" date: 2026-01-30 lastmod: 2026-01-30 description: "控制 Zen 故障检测机制的配置说明" tags: ["集群配置", "故障检测", "高可用", "健康监控"] summary: "配置项概述 # Zen 故障检测(Fault Detection,简称 FD)机制用于监控集群中节点的健康状态。当检测到节点故障时,会触发相应的恢复机制,如重新分配分片或选举新的主节点。 配置项 默认值 说明 discovery.zen.fd.ping_interval 1s Ping 间隔时间 discovery.zen.fd.ping_timeout 30s Ping 超时时间 discovery.zen.fd.ping_retries 3 Ping 重试次数 discovery.zen.fd.connect_on_network_disconnect false 网络断开时重连 discovery.zen.fd.register_connection_listener true 注册连接监听器 discovery.zen.fd.ping_interval # 配置项作用:控制故障检测器发送心跳 ping 请求的间隔时间。主节点和跟随节点都会定期向其他节点发送 ping 来检测其存活状态。 默认值:1s 配置类型:动态配置 取值范围:100ms ~ 正数时间值 配置格式: # 默认配置 discovery.zen.fd.ping_interval: 1s # 更频繁的检测 discovery.zen.fd.ping_interval: 500ms # 较少频率的检测 discovery." --- ## 配置项概述 Zen 故障检测(Fault Detection,简称 FD)机制用于监控集群中节点的健康状态。当检测到节点故障时,会触发相应的恢复机制,如重新分配分片或选举新的主节点。 | 配置项 | 默认值 | 说明 | |--------|--------|------| | `discovery.zen.fd.ping_interval` | 1s | Ping 间隔时间 | | `discovery.zen.fd.ping_timeout` | 30s | Ping 超时时间 | | `discovery.zen.fd.ping_retries` | 3 | Ping 重试次数 | | `discovery.zen.fd.connect_on_network_disconnect` | false | 网络断开时重连 | | `discovery.zen.fd.register_connection_listener` | true | 注册连接监听器 | --- ## discovery.zen.fd.ping_interval **配置项作用**:控制故障检测器发送心跳 ping 请求的间隔时间。主节点和跟随节点都会定期向其他节点发送 ping 来检测其存活状态。 **默认值**:`1s` **配置类型**:动态配置 **取值范围**:`100ms ~ 正数时间值` **配置格式**: ```yaml # 默认配置 discovery.zen.fd.ping_interval: 1s # 更频繁的检测 discovery.zen.fd.ping_interval: 500ms # 较少频率的检测 discovery.zen.fd.ping_interval: 5s ``` **推荐设置**: | 场景 | 推荐值 | 说明 | |------|--------|------| | 默认 | 1s | 标准配置 | | 高可用要求 | 500ms | 更快发现故障 | | 稳定网络 | 3s | 减少网络开销 | --- ## discovery.zen.fd.ping_timeout **配置项作用**:控制单次 ping 请求的超时时间。如果在此时间内未收到响应,该次 ping 计为失败。 **默认值**:`30s` **配置类型**:动态配置 **取值范围**:`1s ~ 正数时间值` **配置格式**: ```yaml # 默认配置 discovery.zen.fd.ping_timeout: 30s # 更短的超时(快速检测故障) discovery.zen.fd.ping_timeout: 10s # 更长的超时(适应高延迟) discovery.zen.fd.ping_timeout: 60s ``` **故障判定时间**: ``` 实际故障判定时间 ≈ ping_timeout × ping_retries 例如: - ping_interval = 1s - ping_timeout = 30s - ping_retries = 3 最坏情况下判定故障需要约 90 秒 ``` --- ## discovery.zen.fd.ping_retries **配置项作用**:控制判定节点为故障前允许连续失败的 ping 次数。 **默认值**:`3` **配置类型**:动态配置 **取值范围**:`1 ~ 正整数` **配置格式**: ```yaml # 默认配置 discovery.zen.fd.ping_retries: 3 # 更宽松的策略 discovery.zen.fd.ping_retries: 5 # 更严格的策略 discovery.zen.fd.ping_retries: 2 ``` --- ## discovery.zen.fd.connect_on_network_disconnect **配置项作用**:控制当检测到网络断开时是否尝试重新连接。 **默认值**:`false` **配置类型**:动态配置 **配置格式**: ```yaml # 默认配置:不主动重连 discovery.zen.fd.connect_on_network_disconnect: false # 启用自动重连 discovery.zen.fd.connect_on_network_disconnect: true ``` **说明**: - `false`:网络断开后不主动重连,等待对方重连 - `true`:网络断开后立即尝试重新建立连接 --- ## discovery.zen.fd.register_connection_listener **配置项作用**:控制是否注册连接监听器来监控节点连接状态的变化。 **默认值**:`true` **配置类型**:动态配置 **配置格式**: ```yaml # 默认配置:注册监听器 discovery.zen.fd.register_connection_listener: true # 不注册监听器 discovery.zen.fd.register_connection_listener: false ``` --- ## 工作原理 ``` ┌─────────────────────────────────────────────────────────────────┐ │ 故障检测流程 │ └─────────────────────────────────────────────────────────────────┘ 每间隔 ping_interval (默认 1s) │ ▼ 发送 ping 请求到目标节点 │ ├── 收到响应 → 节点健康,重置失败计数 │ └── 未收到响应 (等待 ping_timeout) │ ├── 失败计数++ │ ├── 失败计数 < ping_retries │ │ │ └── 继续监控 │ └── 失败计数 >= ping_retries │ └── 判定节点故障 │ ├── 如果是跟随节点 → 从集群移除 │ 触发分片重新分配 │ └── 如果是主节点 → 触发主节点选举 ``` --- ## 故障检测场景 ## 场景 1:短暂网络抖动 ``` 时间线: 0s - 发送 ping 1s - 网络抖动,ping 丢失 2s - 发送 ping,收到响应 结果:节点健康(失败计数重置) ``` ## 场景 2:长时间 GC ``` 时间线: 0s - 发送 ping 30s - 超时,失败计数 = 1 31s - 发送 ping 61s - 超时,失败计数 = 2 62s - 发送 ping 92s - 超时,失败计数 = 3 结果:判定节点故障(ping_retries = 3) ``` ## 场景 3:节点宕机 ``` 时间线: 0s - 发送 ping 30s - 超时,失败计数 = 1 31s - 发送 ping 61s - 超时,失败计数 = 2 62s - 发送 ping 92s - 超时,失败计数 = 3 结果:判定节点故障,触发恢复机制 ``` --- ## 推荐配置指南 ## 局域网环境(稳定) ```yaml discovery.zen.fd.ping_interval: 1s discovery.zen.fd.ping_timeout: 30s discovery.zen.fd.ping_retries: 3 ``` **故障判定时间**:约 90 秒 ## 高可用要求环境 ```yaml discovery.zen.fd.ping_interval: 500ms discovery.zen.fd.ping_timeout: 10s discovery.zen.fd.ping_retries: 2 ``` **故障判定时间**:约 20 秒 ## 跨地域部署(高延迟) ```yaml discovery.zen.fd.ping_interval: 2s discovery.zen.fd.ping_timeout: 60s discovery.zen.fd.ping_retries: 5 ``` **故障判定时间**:约 300 秒(5 分钟) ## 云环境(不稳定网络) ```yaml discovery.zen.fd.ping_interval: 1s discovery.zen.fd.ping_timeout: 30s discovery.zen.fd.ping_retries: 5 ``` **故障判定时间**:约 150 秒,提供更多容错 --- ## 完整配置示例 ## 示例 1:标准生产环境 ```yaml # easysearch.yml # Zen 故障检测配置 discovery.zen.fd.ping_interval: 1s discovery.zen.fd.ping_timeout: 30s discovery.zen.fd.ping_retries: 3 discovery.zen.fd.connect_on_network_disconnect: false discovery.zen.fd.register_connection_listener: true ``` ## 示例 2:高可用环境 ```yaml # 快速故障检测 discovery.zen.fd.ping_interval: 500ms discovery.zen.fd.ping_timeout: 10s discovery.zen.fd.ping_retries: 2 discovery.zen.fd.connect_on_network_disconnect: true discovery.zen.fd.register_connection_listener: true ``` ## 示例 3:跨地域集群 ```yaml # 适应高延迟 discovery.zen.fd.ping_interval: 2s discovery.zen.fd.ping_timeout: 60s discovery.zen.fd.ping_retries: 5 discovery.zen.fd.connect_on_network_disconnect: false discovery.zen.fd.register_connection_listener: true ``` --- ## 监控与验证 ```bash # 查看当前故障检测配置 GET /_cluster/settings?filter_path=*.discovery.zen.fd.* # 查看集群健康状态 GET /_cluster/health # 查看节点列表 GET /_cat/nodes?v # 查看节点离开原因 GET /_cluster/state?filter_path=metadata.nodes ``` --- ## 故障排查 **问题:节点频繁被判定为故障** **可能原因**: 1. ping_timeout 设置过短 2. 网络不稳定 3. 节点负载过高导致响应慢 **解决方案**: ```yaml # 增加超时和重试次数 discovery.zen.fd.ping_timeout: 60s discovery.zen.fd.ping_retries: 5 ``` **问题:故障检测时间过长** **可能原因**: 1. ping_retries 设置过多 2. ping_timeout 设置过长 **解决方案**: ```yaml # 减少超时和重试次数 discovery.zen.fd.ping_timeout: 15s discovery.zen.fd.ping_retries: 2 ``` --- ## 注意事项 1. **动态配置**:所有故障检测配置都是动态的,可在线修改 2. **故障判定时间**:实际判定时间 ≈ ping_timeout × ping_retries 3. **网络延迟**:应考虑实际网络延迟设置合理的超时时间 4. **GC 影响**:长时间 GC 可能导致误判,增加 ping_retries 可提供容错 5. **与其他配置配合**:应与 `cluster.fault_detection.*` 配置协调使用 6. **ping_interval**:过短会增加网络开销,过长会影响故障检测速度