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

配置项概述 #

Zen 故障检测(Fault Detection,简称 FD)机制用于监控集群中节点的健康状态。当检测到节点故障时,会触发相应的恢复机制,如重新分配分片或选举新的主节点。

配置项默认值说明
discovery.zen.fd.ping_interval1sPing 间隔时间
discovery.zen.fd.ping_timeout30sPing 超时时间
discovery.zen.fd.ping_retries3Ping 重试次数
discovery.zen.fd.connect_on_network_disconnectfalse网络断开时重连
discovery.zen.fd.register_connection_listenertrue注册连接监听器

discovery.zen.fd.ping_interval #

配置项作用:控制故障检测器发送心跳 ping 请求的间隔时间。主节点和跟随节点都会定期向其他节点发送 ping 来检测其存活状态。

默认值1s

配置类型:动态配置

取值范围100ms ~ 正数时间值

配置格式

# 默认配置
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 ~ 正数时间值

配置格式

# 默认配置
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 ~ 正整数

配置格式

# 默认配置
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

配置类型:动态配置

配置格式

# 默认配置:不主动重连
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

配置类型:动态配置

配置格式

# 默认配置:注册监听器
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
结果:判定节点故障,触发恢复机制

推荐配置指南 #

局域网环境(稳定) #

discovery.zen.fd.ping_interval: 1s
discovery.zen.fd.ping_timeout: 30s
discovery.zen.fd.ping_retries: 3

故障判定时间:约 90 秒

高可用要求环境 #

discovery.zen.fd.ping_interval: 500ms
discovery.zen.fd.ping_timeout: 10s
discovery.zen.fd.ping_retries: 2

故障判定时间:约 20 秒

跨地域部署(高延迟) #

discovery.zen.fd.ping_interval: 2s
discovery.zen.fd.ping_timeout: 60s
discovery.zen.fd.ping_retries: 5

故障判定时间:约 300 秒(5 分钟)

云环境(不稳定网络) #

discovery.zen.fd.ping_interval: 1s
discovery.zen.fd.ping_timeout: 30s
discovery.zen.fd.ping_retries: 5

故障判定时间:约 150 秒,提供更多容错


完整配置示例 #

示例 1:标准生产环境 #

# 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:高可用环境 #

# 快速故障检测
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:跨地域集群 #

# 适应高延迟
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

监控与验证 #

# 查看当前故障检测配置
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. 节点负载过高导致响应慢

解决方案

# 增加超时和重试次数
discovery.zen.fd.ping_timeout: 60s
discovery.zen.fd.ping_retries: 5

问题:故障检测时间过长

可能原因

  1. ping_retries 设置过多
  2. ping_timeout 设置过长

解决方案

# 减少超时和重试次数
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:过短会增加网络开销,过长会影响故障检测速度