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

配置项作用 #

discovery.zen.master_election.ignore_non_master_pings 配置项用于控制主节点选举过程中是否忽略非主节点的 ping 响应

当设置为 true 时,只有配置为 node.master: true 的节点才会参与主节点选举;设置为 false 时,所有节点的 ping 响应都会被考虑。

配置项属性 #

  • 配置路径: discovery.zen.master_election.ignore_non_master_pings
  • 数据类型: boolean
  • 默认值: false
  • 是否可选: 是
  • 弃用状态: ⚠️ 已弃用

配置项详解 #

工作机制 #

禁用过滤(ignore_non_master_pings = false,默认) #

主节点选举过程

节点A (data node) ──┐
节点B (master node) ─┼──→ 发起选举
节点C (master node) ─┘
    │
    ↓
收集所有节点的 Ping 响应
    │
    ↓
┌──────────────────────────┐
│  考虑所有节点的响应        │
│  - 节点A (data node)     │
│  - 节点B (master node)    │
│  - 节点C (master node)    │
└──────────────────────────┘
    │
    ↓
从所有节点中选择主节点

启用过滤(ignore_non_master_pings = true) #

主节点选举过程

节点A (data node) ──┐
节点B (master node) ─┼──→ 发起选举
节点C (master node) ─┘
    │
    ↓
收集所有节点的 Ping 响应
    │
    ↓
┌──────────────────────────┐
│  只考虑 master 节点的响应 │
│  - 节点B (master node) ✓ │
│  - 节点C (master node) ✓ │
│  - 节点A 被忽略 ✗         │
└──────────────────────────┘
    │
    ↓
仅从 master 节点中选择主节点

过滤逻辑实现 #

// 简化的代码逻辑
List<PingResponse> filterPingResponses(List<PingResponse> fullPingResponses,
                                       boolean masterElectionIgnoreNonMasters) {
    List<PingResponse> pingResponses;

    if (masterElectionIgnoreNonMasters) {
        // 只保留 isMasterNode() 为 true 的节点
        pingResponses = fullPingResponses.stream()
            .filter(ping -> ping.node().isMasterNode())
            .collect(Collectors.toList());
    } else {
        // 保留所有节点
        pingResponses = fullPingResponses;
    }

    return pingResponses;
}

配置建议 #

⚠️ 重要提示 #

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

生产环境(默认) #

discovery.zen.master_election.ignore_non_master_pings: false

建议: 保持默认值 false。这样可以获取所有节点的 ping 响应,确保主节点选举的准确性。

纯主节点集群 #

discovery.zen.master_election.ignore_non_master_pings: true

建议: 可以设置为 true。当集群中只有专用主节点时,可以只考虑这些节点。

混合角色集群 #

discovery.zen.master_election.ignore_non_master_pings: false

建议: 保持默认值 false。数据节点可能在选举中提供有用信息。

代码示例 #

easysearch.yml 配置(已弃用) #

discovery:
  zen:
    master_election:
      ignore_non_master_pings: false  # 默认值

配合节点角色配置 #

# 节点角色
node.master: true
node.data: false

# 选举配置
discovery:
  zen:
    master_election:
      ignore_non_master_pings: true  # 只考虑 master 节点

混合角色集群配置 #

# 某些节点是纯数据节点
node.master: false
node.data: true

# 选举配置
discovery:
  zen:
    master_election:
      ignore_non_master_pings: false  # 考虑所有节点

相关配置 #

配置项作用默认值
discovery.zen.master_election.ignore_non_master_pings是否忽略非主节点 pingfalse
node.master节点是否可以作为主节点true
discovery.zen.minimum_master_nodes选举所需的主节点数量-
discovery.zen.ping_timeoutping 超时3s

节点角色配置 #

# 专用主节点
node.master: true
node.data: false
node.ingest: false

# 数据节点
node.master: false
node.data: true

# 协调节点
node.master: false
node.data: false
node.ingest: true

行为对比 #

设置选举参与者选举准确性适用场景
false所有节点混合角色集群
true仅主节点专用主节点集群

选举结果差异 #

ignore_non_master_pings = false:

候选主节点集合:
- 节点A (data node)
- 节点B (master node)
- 节点C (master node)

选举结果: 可能是 B 或 C


ignore_non_master_pings = true:

候选主节点集合:
- 节点B (master node)
- 节点C (master node)

选举结果: B 或 C(更集中)

使用场景 #

推荐保持 false 的场景 #

  • 混合角色集群: 节点同时承担多种角色
  • 小型集群: 所有节点都可能是主节点
  • 高可用需求: 需要最大化的选举准确性

推荐启用 true 的场景 #

  • 专用主节点: 只有特定节点作为主节点
  • 大型集群: 有明确的主节点和数据节点分离
  • 简化管理: 减少选举过程中的干扰

典型架构推荐 #

小型集群 (< 10 节点):

所有节点: master + data
配置: ignore_non_master_pings = false
原因: 所有节点都可以参与选举


中型集群 (10-50 节点):

主节点: 3-5 个专用 master
数据节点: 其余节点
配置: ignore_non_master_pings = true
原因: 只让专用主节点参与选举


大型集群 (> 50 节点):

主节点: 3-5 个专用 master
数据节点: 大量 data 节点
配置: ignore_non_master_pings = true
原因: 明确分离职责,简化选举

注意事项 #

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

  2. isMasterNode() 判断: 节点的 isMasterNode() 属性由 node.master 配置决定。

  3. 选举准确性: 设置为 true 可能会减少参与选举的节点数量,影响准确性。

  4. 集群稳定性: 在大多数情况下,建议保留默认值以确保高可用性。

  5. 动态更新: 此配置支持动态更新,但修改后可能影响正在进行的选举。

  6. 测试验证: 修改此配置后应在测试环境中验证选举行为。

  7. 版本兼容: Zen 发现机制已被弃用,新版本可能使用不同的选举机制。

  8. 与 minimum_master_nodes 配合: 确保 minimum_master_nodes 的值与可参与选举的节点数量相匹配。