--- title: "最小主节点数量配置" date: 2026-02-11 lastmod: 2026-02-11 description: "discovery.zen.minimum_master_nodes 配置项用于防止集群脑裂,定义主节点选举所需的最小主节点数量。" tags: ["集群发现", "主节点选举", "脑裂", "高可用"] summary: "配置项作用 # discovery.zen.minimum_master_nodes 配置项用于定义主节点选举所需的最小主节点资格节点数量。 这是防止集群脑裂(split-brain)的关键配置,确保只有当有足够数量的主节点资格节点参与时,才能形成有效的主节点选举。 配置项属性 # 配置路径: discovery.zen.minimum_master_nodes 数据类型: integer 默认值: -1(表示未设置) 是否可选: 是 是否动态: 是(支持动态更新) 弃用状态: ⚠️ 已弃用 配置项详解 # 工作机制 # 脑裂场景演示 3 个主节点资格集群 正常状态: 节点A (master) ──┐ 节点B (master) ──┼──→ 互相通信 节点C (master) ─┘ ↓ minimum_master_nodes = 2 任何选举需要至少 2 个节点同意 网络分区后: 分区1: 节点A 分区2: 节点B + 节点C 节点A 无法获得 2 票 ↓ 选举失败,不成为主节点 ✅ 节点B + 节点C 获得 2 票 ↓ 选举成功,形成有效集群 ✅ 选举机制 # 主节点选举流程 节点发起选举 │ ↓ 收集投票 │ ↓ 检查是否有足够的票数 │ ├──────── 票数 ≥ minimum_master_nodes │ ↓ │ 选举成功 ✅ │ 成为主节点 │ └──────── 票数 < minimum_master_nodes ↓ 选举失败 ❌ ↓ 继续作为数据节点 配置建议 # ⚠️ 重要提示 # 虽然此配置已被标记为弃用,但配置正确的 minimum_master_nodes 对于防止数据丢失至关重要。" --- ## 配置项作用 `discovery.zen.minimum_master_nodes` 配置项用于定义**主节点选举所需的最小主节点资格节点数量**。 这是防止集群脑裂(split-brain)的关键配置,确保只有当有足够数量的主节点资格节点参与时,才能形成有效的主节点选举。 ## 配置项属性 - **配置路径**: `discovery.zen.minimum_master_nodes` - **数据类型**: `integer` - **默认值**: `-1`(表示未设置) - **是否可选**: 是 - **是否动态**: 是(支持动态更新) - **弃用状态**: ⚠️ **已弃用** ## 配置项详解 ## 工作机制 ``` 脑裂场景演示 3 个主节点资格集群 正常状态: 节点A (master) ──┐ 节点B (master) ──┼──→ 互相通信 节点C (master) ─┘ ↓ minimum_master_nodes = 2 任何选举需要至少 2 个节点同意 网络分区后: 分区1: 节点A 分区2: 节点B + 节点C 节点A 无法获得 2 票 ↓ 选举失败,不成为主节点 ✅ 节点B + 节点C 获得 2 票 ↓ 选举成功,形成有效集群 ✅ ``` ## 选举机制 ``` 主节点选举流程 节点发起选举 │ ↓ 收集投票 │ ↓ 检查是否有足够的票数 │ ├──────── 票数 ≥ minimum_master_nodes │ ↓ │ 选举成功 ✅ │ 成为主节点 │ └──────── 票数 < minimum_master_nodes ↓ 选举失败 ❌ ↓ 继续作为数据节点 ``` ## 配置建议 ## ⚠️ 重要提示 虽然此配置已被标记为弃用,但**配置正确的 minimum_master_nodes 对于防止数据丢失至关重要**。 ## 推荐配置公式 ```yaml # 推荐配置 discovery.zen.minimum_master_nodes: (N / 2) + 1 其中 N 是集群中主节点资格节点的总数 ``` ## 不同规模集群的配置 ### 3 节点集群(都是主节点资格) ```yaml discovery.zen.minimum_master_nodes: 2 ``` **说明**: (3 / 2) + 1 = 2。防止 1 个节点故障后形成两个主节点。 ### 5 节点集群(3 个主节点资格) ```yaml discovery.zen.minimum_master_nodes: 2 ``` **说明**: (3 / 2) + 1 = 2。即使 1 个节点故障,仍有 2 个节点可以选举。 ### 7 节点集群(3 个主节点资格) ```yaml discovery.zen.minimum_master_nodes: 2 ``` **说明**: (3 / 2) + 1 = 2。保持 2 可以容忍 1 个主节点故障。 ## 代码示例 ## easysearch.yml 配置(已弃用但仍重要) ```yaml # 3 节点集群配置 discovery: zen: minimum_master_nodes: 2 ``` ## 大型集群配置 ```yaml # 7 节点集群(3 个专用主节点) discovery: zen: minimum_master_nodes: 2 ``` ## 跨地域配置 ```yaml # 每个数据中心 2 个主节点资格 discovery: zen: minimum_master_nodes: 3 # 3 个数据中心需要 2 个同意 ``` ## 动态更新 ```bash # 运行时更新配置 PUT _cluster/settings { "transient": { "discovery.zen.minimum_master_nodes": 2 } } ``` ## 相关配置 | 配置项 | 作用 | 默认值 | |--------|------|--------| | `discovery.zen.minimum_master_nodes` | 选举所需最小主节点数 | -1 | | `node.roles` | 节点角色配置 | [master, data, ingest, remote_cluster_client] | ## 节点角色配置 ```yaml # 专用主节点 node.roles: [master] # 数据节点 node.roles: [data] # 混合节点 node.roles: [master, data] ``` ## 配置影响分析 ## 配置过低的风险 ``` minimum_master_nodes = 1 集群: 节点A, 节点B, 节点C 网络分区: 分区1: 节点A 分区2: 节点B, 节点C 节点A 可以单独选举 (1 ≥ 1) ✅ 节点B,C 可以选举 (2 ≥ 1) ✅ 结果: 两个主节点 ❌ 脑裂! 数据冲突! ``` ## 配置正确的行为 ``` minimum_master_nodes = 2 集群: 节点A, 节点B, 节点C 网络分区: 分区1: 节点A 分区2: 节点B, 节点C 节点A 不能单独选举 (1 < 2) ✅ 节点B,C 可以选举 (2 ≥ 2) ✅ 结果: 只有一个主节点 ✅ 数据一致! ``` ## 配置建议表 | 主节点资格节点数 | 推荐配置 | 容忍故障节点数 | |---------------|----------|---------------| | 1 | 1(不推荐) | 0 | | 2 | 2 | 0 | | 3 | 2 | 1 | | 5 | 3 | 1 | | 7 | 4 | 2 | | 9 | 5 | 3 | ## 公式说明 ``` 推荐值 = (N / 2) + 1 可以容忍的故障节点数 = (N / 2) 例如: N = 3: 配置 2,容忍 1 个故障 N = 5: 配置 3,容忍 2 个故障 N = 7: 配置 4,容忍 3 个故障 ``` ## 使用场景 ## 必须正确配置的场景 - **生产环境**: 任何时候都必须正确配置 - **多数据中心**: 需要考虑跨地域的网络分区 - **数据重要性高**: 防止脑裂导致的数据不一致 ## 版本升级注意事项 ``` 滚动升级时的配置 升级前: 5 个主节点资格,minimum_master_nodes = 3 升级过程: 1. 停止 1 个节点 → 剩余 4 个节点,配置仍为 3 ✅ 2. 停止第 2 个节点 → 剩余 3 个节点,配置仍为 3 ✅ 3. 添加升级后的节点 → 恢复到 5 个节点 关键: 始终确保 (运行节点 / 2) + 1 ≥ minimum_master_nodes ``` ## 警告机制 ``` 配置过低的警告 如果 minimum_master_nodes 设置过低: 系统会发出警告: "value for setting 'discovery.zen.minimum_master_nodes' is too low. This can result in data loss! Please set it to at least a quorum of master-eligible nodes (current value: [1], total number of master-eligible nodes used for publishing in this round: [3])" ``` ## 注意事项 1. **已弃用但仍重要**: 虽然标记为弃用,但对于防止脑裂仍然至关重要。 2. **动态更新**: 可以在运行时动态修改,但修改后需密切监控。 3. **与主节点数量的关系**: 配置值不应超过主节点资格节点总数的一半。 4. **跨地域部署**: 多数据中心部署时,需要考虑跨地域的网络分区。 5. **重启节点**: 重启节点时,确保有足够的节点参与选举。 6. **监控建议**: 监控主节点选举事件和集群健康状态。 7. **测试验证**: 在生产环境使用前,在测试环境中验证配置。 8. **数据安全**: 此配置是防止数据丢失的关键设置。