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

配置项作用 #

discovery.zen.max_pings_from_another_master 配置项用于控制当前主节点在触发重新加入集群前,可以容忍来自其他主节点的 ping 次数

当集群中出现多个主节点(脑裂场景)时,此配置决定本地主节点在检测到冲突后可以容忍多少次来自其他主节点的 ping。

配置项属性 #

  • 配置路径: discovery.zen.max_pings_from_another_master
  • 数据类型: integer
  • 默认值: 3
  • 最小值: 1
  • 是否可选: 是
  • 弃用状态: ⚠️ 已弃用

配置项详解 #

工作机制 #

多主节点场景(脑裂)

集群A (主节点1) ──┐
集群B (主节点2) ──┼──→ 网络分区
集群C (数据节点) ─┘
    │
    ↓
主节点1 和主节点2 都认为自己是主节点
    │
    ↓
主节点2 向主节点1 发送 ping
    │
    ↓
主节点1 统计 ping 次数
    │
    ├──────── ping 次数 < max_pings_from_another_master
    │              ↓
    │         忽略,继续担任主节点
    │
    └──────── ping 次数 ≥ max_pings_from_another_master
                   │
                   ↓
              触发处理机制
                   │
                   ↓
              重新加入集群或解决冲突

Ping 计数机制 #

// 简化的代码逻辑
AtomicInteger pingsWhileMaster = new AtomicInteger(0);

// 收到来自其他主节点的 ping
if (localNodeIsMaster) {
    if (pingRequest.senderIsMaster) {
        if (pingsWhileMaster.incrementAndGet() >= maxPingsFromAnotherMaster) {
            // 达到阈值,触发处理
            logger.debug("got a ping from another master {}. resolving who should rejoin",
                       pingRequest.masterNode());
            handleAnotherMaster(...);
            pingsWhileMaster.set(0);
        }
    }
} else {
    // 不是主节点,重置计数器
    pingsWhileMaster.set(0);
}

配置建议 #

⚠️ 重要提示 #

此配置项已被标记为弃用,建议保持默认值。

生产环境(默认) #

discovery.zen.max_pings_from_another_master: 3

建议: 保持默认值 3。这提供了合理的容忍度,同时能够及时检测脑裂。

快速脑裂检测 #

discovery.zen.max_pings_from_another_master: 1

建议: 减少到 1。当需要快速检测并处理脑裂问题时使用。

宽容配置 #

discovery.zen.max_pings_from_another_master: 5

建议: 增加到 5-10。当网络不稳定可能导致频繁的 ping 时使用。

代码示例 #

easysearch.yml 配置(已弃用) #

discovery:
  zen:
    max_pings_from_another_master: 3  # 默认值

快速脑裂检测配置 #

discovery:
  zen:
    max_pings_from_another_master: 1  # 立即触发处理

配合其他故障检测配置 #

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

相关配置 #

配置项作用默认值
discovery.zen.max_pings_from_another_master容忍其他主节点 ping 次数3
discovery.zen.minimum_master_nodes选举所需主节点数-1
discovery.zen.fd.ping_interval故障检测 ping 间隔1s
discovery.zen.fd.ping_timeout故障检测 ping 超时30s

脑裂场景分析 #

场景 1:网络分区 #

正常状态:
主节点1 ──┐
主节点2 ──┼──→ 互相通信
数据节点 ─┘

网络分区后:
主节点1 ──┐    主节点2 ──┐
数据节点 ─┘    数据节点 ─┘
(孤岛)        (孤岛)

主节点2 向主节点1 发送 ping:
ping 1 → 忽略
ping 2 → 忽略
ping 3 → 触发处理

场景 2:配置影响 #

max_pings_from_another_master = 1:

ping 1 → 立即触发处理
优点: 快速检测脑裂
缺点: 可能误判短暂网络问题


max_pings_from_another_master = 3:

ping 1 → 忽略
ping 2 → 忽略
ping 3 → 触发处理
优点: 容忍短暂网络问题
缺点: 检测较慢

行为对比 #

设置脑裂检测速度误判风险适用场景
较小(1)稳定网络
中等(3)中等中等标准配置
较大(5-10)不稳定网络

检测时间计算 #

假设 fd.ping_interval = 1s

max_pings = 1:
检测时间 ≈ 1 秒

max_pings = 3:
检测时间 ≈ 3 秒

max_pings = 5:
检测时间 ≈ 5 秒

使用场景 #

推荐保持默认的场景 #

  • 标准生产环境: 网络相对稳定
  • 平衡检测: 需要在速度和准确性之间平衡
  • 正常集群: 不经常出现脑裂

推荐减少的场景 #

  • 快速恢复: 需要快速检测和处理脑裂
  • 稳定网络: 网络质量很好,误判风险低
  • 数据安全优先: 宁可误判也不能容忍脑裂

推荐增加的场景 #

  • 不稳定网络: 网络经常出现短暂分区
  • 避免误判: 需要更宽容地处理 ping 请求
  • 复杂拓扑: 网络路由复杂,可能有延迟

注意事项 #

  1. 已弃用: 此配置已被标记为弃用,建议关注新的发现机制。

  2. 只针对主节点: 只有当前节点是主节点时才会统计 ping。

  3. 自动重置: 当节点不再是主节点时,计数器会自动重置。

  4. 仅统计其他主节点: 只统计来自其他主节点资格节点的 ping。

  5. 与故障检测配合: 此机制与节点故障检测协同工作。

  6. 调试日志: 达到阈值时会记录调试日志:

    got a ping from another master {}. resolving who should rejoin. current ping count: [3]
    
  7. 动态更新: 此配置支持动态更新,修改后立即生效。

  8. 脑裂预防: 正确的 minimum_master_nodes 配置比此配置更重要。