← 中文资源

简体中文版本

脑裂

脑裂发生在网络分区两侧都接受写入;用法定人数和围栏令牌阻止第二个写者,并在恢复后谨慎核对分歧写入。

阅读英文原文

两个主节点,两段历史

网络分区把主节点与副本、故障转移控制器隔开。控制器认为主节点已死,提升一个副本;原主节点仍在分区另一侧运行并服务客户端。两边都接受写入。网络恢复后,系统拥有两段分歧的历史,若不丢数据或不破坏不变量,就无法自动合并。

Partition A: old primary  -> accepts writes
Partition B: new primary  -> accepts writes
             (no communication between A and B)

阻止第二个写者

最强的防线是确保只有拥有法定人数的一侧能接受写入。多数派不可能同时存在于分区两侧,因此最多只有一侧能选出领导者。少数派必须拒绝写入或转为只读。这是有意的可用性权衡:少数派写入不可用,而不是产生分歧。

围栏是第二层。每次写入携带单调递增的令牌或 epoch,存储拒绝更旧的令牌,于是恢复的旧主节点无法覆盖新主节点的数据。这能防御暂停、延迟健康检查和人为失误。

故障转移是受控流程

自动转移必须确认旧主节点已停止、被隔离或被围栏,之后新主节点才能接受写入。只检查进程的健康检查不够;进程可能仍在持有资源和客户端。使用平台的围栏机制,并监控是否有两个节点同时声称主角色。

分区恢复后,不要简单地把两侧重新连接。检查时间线、找出分歧写入,并执行有记录的核对或恢复流程。保留旧主节点的数据用于分析。脑裂是数据完整性事故,即使服务一直在线。

何时使用这一视角

设计故障转移、领导者选举或多区域写入时,使用脑裂推理。优点是显式的安全规则;代价是分区期间写入可用性降低。与单节点数据库相比,高可用拓扑增加了必须测试、不能假设不存在的故障模式。