前言

在现代互联网系统中,分布式系统 被广泛应用来提高可用性、扩展性与容错性。但网络的不稳定、节点的故障或管理上的分歧,常常会引发一个危险的问题:Split Brain(脑裂)

Split Brain 是分布式系统设计中的“梦魇之一”,它会导致多个节点误认为自己是“主节点”,从而产生数据冲突、重复写入、状态紊乱等严重问题。


定义

在分布式系统中常定义如下:

Split Brain is a condition in a distributed system where two or more parts of the system believe they are the authoritative or primary node, often due to a network partition.

一句话:Split Brain 就是多个节点在网络隔离后都认为“自己才是老大”。


工作原理

一句话:当集群发生网络分区或节点故障时,两个或多个子集误以为对方失联并各自“称王”,导致写入冲突。

举个例子:在一个主从架构中,网络分区发生后,原主节点 A 和备份节点 B 无法通信。如果没有正确的协调机制,A 和 B 都可能继续对外提供写服务,最终出现“双主写入”的问题。

Split Brain 典型诱因:

  1. 网络分区(Network Partition)
  2. 心跳机制不可靠或延迟高
  3. 没有正确实施 quorum、lease 或 fencing
  4. 主节点挂了但没有选举新主,旧主“诈尸”后重启写入

属性与指标

常见关注的属性与指标如下:

  1. 网络连通性 Split Brain 的本质是网络隔离,底层通信健康度是根因。

  2. 主节点唯一性 保证同一时刻全系统只有一个主节点(Leader)。

  3. 数据一致性 Split Brain 期间产生的冲突写入会破坏一致性。

  4. 可用性 vs 安全性权衡 为避免脑裂,系统可能牺牲部分可用性(如拒绝写)。

  5. 分区检测机制 是否有检测网络分区并触发 failover 的机制。

  6. 恢复策略与冲突解决机制 分区合并后,如何解决“冲突数据”。


类型

按场景分类

  1. 主从系统中的 Split Brain 常见于 Redis Sentinel、Elasticsearch、PostgreSQL 主备等系统。

  2. 多主系统中的 Split Brain 如 Cassandra、MongoDB 在分区期间若 quorum 没控制好,会造成一致性问题。

  3. 高可用集群控制平面中的脑裂 如 Kubernetes 多个 controller-manager 都认为自己是 leader。

按触发原因分类

  1. 网络分区导致
  2. 服务端检测延迟或心跳丢失
  3. 手动干预或脚本误操作
  4. 租约失效未被正确 Fencing

Split Brain 与程序关系

Split Brain 一般发生在“高可用组件”中,因此与以下模块高度相关:

  1. Leader Election 模块

    • 多节点竞选主节点,需使用如 Paxos、Raft、Zookeeper 等算法。
    • 若没有 quorum 机制,可能产生多个主节点。
  2. Lease & Fencing 机制

    • 未正确使用 fencing token 防止旧主误写入。
  3. 分布式锁系统

    • 多个服务获取到“同一把锁”,产生资源争夺。
  4. 分布式缓存/数据库

    • 多个副本并发写入,数据版本不一致。

程序设计中,务必实现如下策略:

  • 引入 quorum 机制,拒绝无 quorum 的写入;
  • 使用 fencing token,阻止过期节点写入;
  • 实现 leader lease 或 election,保障主节点唯一性;
  • 定期健康检查与 failover 策略,及时隔离或恢复节点。

常见系统中 Split Brain 的表现及应对

系统 Split Brain 表现 防护措施
Redis Sentinel 两个 master 同时存在 哨兵投票选主,建议加 fencing
Zookeeper quorum 不足也能写入 配置正确 quorum,避免过小集群
Elasticsearch 多个主节点,集群状态不一致 使用 minimum_master_nodes,升级为 Zen 2 协议
PostgreSQL + repmgr 主备切换不一致,数据冲突 使用 fencing + VIP failover
Cassandra 网络分区后副本产生不一致写入 配置正确 consistency level(如 QUORUM)

常用工具/协议防止 Split Brain

  1. Zookeeper / etcd 提供一致性选主和 fencing 机制。

  2. Raft / Paxos 算法 实现强一致选主,确保主节点唯一性。

  3. Fencing Token 租约控制+递增 token,避免旧主“诈尸写入”。

  4. Quorum 机制 无法达到法定多数的副本自动降为只读。

  5. Corosync + Pacemaker Linux 下常用高可用工具,内建脑裂检测机制。