在 Elasticsearch 中出现 网络分区(Network Partition) 或 脑裂(Split-Brain) 导致两个子集群各自选出 Master 的情况,是非常严重的问题。比如这个场景(20个节点分裂成两个10节点的子集群,各自选出 Master)正是典型的脑裂场景。如果不立即处理,会导致数据不一致、写入冲突甚至数据丢失。
以下是详细的解决方案和预防措施:
一、紧急处理步骤(恢复集群一致性)
-
立即隔离并评估状态
- 通过 REST API 检查两个子集群的状态:
curl -XGET 'http://子集群A的节点IP:9200/_cluster/state?pretty' curl -XGET 'http://子集群B的节点IP:9200/_cluster/state?pretty'
- 对比两个集群的元数据(
cluster_uuid
、metadata
版本号、索引分片分配状态)。保留元数据更新更活跃(版本号更大)的子集群作为有效集群。
- 通过 REST API 检查两个子集群的状态:
-
人工强制选择有效集群
- 停止无效子集群的所有节点(假设你决定保留子集群A):
# 在子集群B的所有节点上执行 sudo systemctl stop elasticsearch.service
- 重启有效子集群(子集群A)以清除异常状态:
# 在子集群A的所有节点上执行 sudo systemctl restart elasticsearch.service
- 停止无效子集群的所有节点(假设你决定保留子集群A):
-
恢复被隔离节点
- 清理被停止节点(原子集群B)的数据目录(避免旧元数据冲突):
# 谨慎操作!备份后删除节点数据目录 rm -rf /path/to/elasticsearch/data/nodes
- 重新启动这些节点,让它们以全新节点身份加入有效集群(子集群A)。
- 清理被停止节点(原子集群B)的数据目录(避免旧元数据冲突):
二、根本原因分析
-
配置错误
Elasticsearch 7.x 及之后版本必须显式配置集群法定节点数(quorum):# 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
,但仍需显式配置:# 在初始集群启动时指定Master候选节点 cluster.initial_master_nodes: - node-1- node-2- ... - node-20 # 明确列出所有Master候选节点名
-
专用Master节点(推荐)
# 3-5个专用Master节点(不存储数据) node.roles: [ master ] # 专用Master节点 node.roles: [ data, ingest ] # 数据节点(不参与选举)
- 此时
discovery.zen.minimum_master_nodes
设置为(专用Master节点数/2) + 1
(例如3节点集群设为2
)。
- 此时
-
启用生产级发现机制
避免使用默认的zen
发现,改用:# 使用云服务商发现插件 或 安全协议 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 协议的改进实现,减少脑裂概率。
总结处理流程
关键原则:脑裂后必然存在数据冲突,恢复时需以数据完整性为优先人工裁定有效数据分区。定期测试集群恢复流程,并确保配置符合 Elasticsearch 官方推荐。