🌺The Begin🌺点点关注,收藏不迷路🌺

前言

在 Elasticsearch 分布式集群中,脑裂(Split-Brain)是最危险、最致命的集群故障。一旦发生脑裂,集群会出现多个主节点、数据写入错乱、分片无法分配、数据不一致等问题,严重时会导致整个集群不可用。

很多中小型集群因为配置错误、网络不稳定、节点数不合理,在运行一段时间后突然触发脑裂,导致业务大面积瘫痪,却不知道问题根源。

本文将从脑裂原理 → 产生条件 → 触发场景 → 解决方案 → 生产配置,完整讲解 ES 脑裂问题,让你彻底规避风险、快速排查故障。


一、什么是 Elasticsearch 脑裂?

1.1 脑裂定义

脑裂 = 一个集群分裂成两个或多个独立的小集群,并且各自选举出独立的 Master 主节点

正常集群:只有 1 个 Active Master
脑裂集群:出现 2 个甚至多个 Master

1.2 脑裂带来的严重后果

  • 数据写入混乱、数据丢失/不一致
  • 分片无法分配、集群变红
  • 数据节点同时向多个主节点汇报状态
  • 集群无法自动恢复,必须人工干预
  • 业务大面积不可用

1.3 脑裂现象示意图

脑裂集群

Master Node1

Data Node1

Master Node2

Data Node2

正常集群

Master Node

Data Node1

Data Node2


二、Elasticsearch 脑裂产生的根本原因

2.1 核心原因(唯一根源)

集群无法通信 → 节点认为主节点宕机 → 重新选举新主 → 出现多个主节点

2.2 产生脑裂必须满足 3 个条件

  1. 网络分区:节点之间通信中断(网卡、交换机、防火墙、网络抖动)
  2. 节点数为偶数:无法形成选举多数派
  3. 未配置法定人数(discovery.zen.minimum_master_nodes)

2.3 脑裂触发流程图

网络故障/抖动

主节点与数据节点通信断开

数据节点认为Master下线

触发新一轮Master选举

选举出新的Master节点

原Master依然存活

集群出现两个Master → 脑裂形成


三、Elasticsearch 脑裂出现的具体场景

3.1 网络波动/网络分区

  • 跨机房/跨机架部署
  • 交换机故障、网卡闪断
  • 节点间延迟过高

3.2 主节点压力过大、假死

  • Master 节点负载过高、GC 长时间卡顿
  • 节点响应慢,被其他节点判定为“宕机”

3.3 集群节点数为偶数(2、4、6…)

  • 2 节点集群最容易脑裂!
  • 网络一断,两边各一个节点,各自选主

3.4 未配置 minimum_master_nodes(最常见)

90% 的生产脑裂事故,都是因为没配置这个参数


四、如何彻底解决 Elasticsearch 脑裂?(唯一官方方案)

4.1 核心解决方案:配置法定人数(Quorum)

配置 minimum_master_nodes 保证选举必须获得“多数派”投票

4.2 计算公式(死记硬背)

minimum_master_nodes = (有资格成为Master的节点数 / 2) + 1

4.3 不同节点数配置示例

  • 3 主节点:(3/2)+1 = 2
  • 5 主节点:(5/2)+1 = 3
  • 1 主节点:1

4.4 为什么这样配置能防脑裂?

  • 必须获得超过半数的节点同意才能选主
  • 网络分裂后,任何一个分区都无法满足多数派
  • 从机制上杜绝双主产生

五、生产环境彻底解决脑裂的完整方案

5.1 方案1:配置正确的 minimum_master_nodes(ES 7.x 之前)

elasticsearch.yml

# 3 主节点集群
discovery.zen.minimum_master_nodes: 2

5.2 方案2:ES 7.x+ 已自动解决脑裂

ES 7.x 开始使用新的选举算法删除了 minimum_master_nodes默认自动防脑裂,无需手动配置!

5.3 方案3:集群节点使用奇数台(3、5、7)

  • 推荐生产标准:3 台专用 Master 节点
  • 绝对不要使用 2 节点集群!

5.4 方案4:专用主节点,不承担数据读写

node.master: true
node.data: false
node.ingest: false

避免主节点压力大、GC 卡顿、假死。

5.5 方案5:网络稳定、同机房部署

  • Master 节点部署在同一交换机、同一机架
  • 避免跨地域、跨机房部署主节点

六、如何判断集群是否发生脑裂?

6.1 查看当前主节点

GET _cat/master?v

如果返回多个 master 节点 → 脑裂!

6.2 查看节点状态

GET _cat/nodes?v

出现多个 * 主节点 → 脑裂!

6.3 日志关键字

master fault
elected master
zen-disco

七、脑裂发生后的紧急恢复步骤

  1. 停止全部写入流量(避免数据更乱)
  2. 逐个停止节点,保留一个你认为正确的主节点
  3. 删除其他节点的 state 目录(清空集群状态)
  4. 重新启动其他节点,加入集群
  5. 检查集群状态,恢复正常后再开放流量

⚠️ 脑裂恢复必须人工干预,无法自愈。


八、生产环境防脑裂最佳实践

  1. 必须使用 3 台专用 Master 节点(奇数)
  2. ES 6.x 必须配置 minimum_master_nodes: 2
  3. ES 7.x+ 无需配置,自动防脑裂
  4. 主节点不存数据、不负责查询,只做元数据管理
  5. 主节点部署在稳定网络环境
  6. 禁止 2 节点集群上线
  7. 开启监控,主节点变更及时告警

九、总结(核心重点)

  1. 脑裂 = 双主节点 → 数据错乱 → 集群瘫痪
  2. 根本原因:网络分区 + 偶数节点 + 未配置多数派
  3. 唯一解决方案minimum_master_nodes = (主节点数/2)+1
  4. 生产标准:3 专用主节点 + 奇数部署 + 稳定网络
  5. ES 7.x+ 已自动防脑裂,无需手动配置

掌握本文,你将彻底规避 ES 脑裂风险,保证集群高可用、不分裂、不宕机


在这里插入图片描述


🌺The End🌺点点关注,收藏不迷路🌺
Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐