在 Elasticsearch 中出现 网络分区(Network Partition) 或 脑裂(Split-Brain) 导致两个子集群各自选出 Master 的情况,是非常严重的问题。比如这个场景(20个节点分裂成两个10节点的子集群,各自选出 Master)正是典型的脑裂场景。如果不立即处理,会导致数据不一致、写入冲突甚至数据丢失。
以下是详细的解决方案和预防措施:
一、紧急处理步骤(恢复集群一致性)
- 
立即隔离并评估状态 - 
通过 REST API 检查两个子集群的状态: bashcurl -XGET 'http://子集群A的节点IP:9200/_cluster/state?pretty' curl -XGET 'http://子集群B的节点IP:9200/_cluster/state?pretty'
- 
对比两个集群的元数据( cluster_uuid、metadata版本号、索引分片分配状态)。保留元数据更新更活跃(版本号更大)的子集群作为有效集群。
 
- 
- 
人工强制选择有效集群 - 
停止无效子集群的所有节点 (假设你决定保留子集群A): bash# 在子集群B的所有节点上执行 sudo systemctl stop elasticsearch.service
- 
重启有效子集群(子集群A)以清除异常状态 : bash# 在子集群A的所有节点上执行 sudo systemctl restart elasticsearch.service
 
- 
- 
恢复被隔离节点 - 
清理被停止节点(原子集群B)的数据目录(避免旧元数据冲突): bash# 谨慎操作!备份后删除节点数据目录 rm -rf /path/to/elasticsearch/data/nodes
- 
重新启动这些节点,让它们以全新节点身份加入有效集群(子集群A)。 
 
- 
二、根本原因分析
- 
配置错误 Elasticsearch 7.x 及之后版本必须显式配置集群法定节点数(quorum): yaml# elasticsearch.yml discovery.zen.minimum_master_nodes: 11 # 公式 = (总Master候选节点数 / 2) + 1- 在你的场景中设为 11,可阻止任一10节点子集群形成有效Master(10 < 11)。
 
- 在你的场景中设为 
- 
网络分区或防火墙问题 节点间通信中断导致集群分裂,需检查: - 网络设备(交换机、路由器)
- 防火墙规则(确保端口 9300互通)
- 云平台的VPC/安全组配置
 
- 
资源瓶颈导致节点失联 - CPU/内存过载导致节点停止响应
- 垃圾回收(GC)卡顿超时
 
三、关键预防措施
- 
正确设置法定人数(Quorum) Elasticsearch 7.0+ 引入了 cluster.initial_master_nodes,但仍需显式配置:yaml# 在初始集群启动时指定Master候选节点 cluster.initial_master_nodes: - node-1 - node-2 - ... - node-20 # 明确列出所有Master候选节点名
- 
专用Master节点(推荐) yaml# 3-5个专用Master节点(不存储数据) node.roles: [ master ] # 专用Master节点 node.roles: [ data, ingest ] # 数据节点(不参与选举)- 此时 discovery.zen.minimum_master_nodes设置为(专用Master节点数/2) + 1(例如3节点集群设为2)。
 
- 此时 
- 
启用生产级发现机制 避免使用默认的 zen发现,改用:yaml# 使用云服务商发现插件 或 安全协议 discovery.seed_providers: file discovery.seed_hosts: - 192.168.1.10:9300 - 192.168.1.11:9300 - ...
- 
监控与告警 - 监控API:GET /_cluster/health
- 设置告警规则:
- status从- green变为- yellow/red
- number_of_nodes异常减少
- active_primary_shards突然下降
 
 
- 监控API:
四、Elasticsearch 8.x+ 的改进
- 自动引导安全配置(Bootstrapping):首次启动自动生成安全配置和密钥。
- 更严格的节点准入控制:新节点需验证证书和凭证才能加入。
- 优化选举算法:基于 Raft 协议的改进实现,减少脑裂概率。
总结处理流程
保留子集群A 保留子集群B 发生脑裂 隔离并评估两个子集群 选择有效集群 停止子集群B的节点 停止子集群A的节点 清理被停止节点的数据 重启有效集群 重新加入被隔离节点 验证集群状态 修复配置与网络
关键原则 :脑裂后必然存在数据冲突,恢复时需以数据完整性为优先 人工裁定有效数据分区。定期测试集群恢复流程,并确保配置符合 Elasticsearch 官方推荐。