领导者选举与脑裂

02-通信与协调 核心 约 20 分钟 #选举#脑裂#任期#多数派 更新 2026-10-02
当前状态:未学
本文基于模型知识整理(生成时未联网核对),关键结论建议对照经典文献复核。

一句话定义

领导者选举让分布式系统在"同一时刻最多一个主"的前提下,把主节点的权力交给多数派认可的新节点;选错(两个主并存)就是脑裂,是分布式系统最危险的事故形态。

为什么重要

主从架构(复制 kp-011、共识 kp-019、Kafka/K8s 控制面)都依赖"唯一 leader"。选举机制的正确性直接决定系统在网络分区时会不会出现双写、数据错乱。理解选举,就理解了"多数派(quorum)"这一贯穿分布式系统的核心工具。

前置知识

kp-005(故障不可判定)、kp-006(超时)。

核心概念

  • 为什么需要选举:单点简化协调(全序、唯一写入口),但单点会失效,必须自动换主以保证可用性。
  • 脑裂(split-brain):网络分区后旧 leader 未感知下台、新 leader 已上任,两主同时接受写。
  • 任期(term / epoch):全局单调递增的逻辑时间片,每次选举 term+1;"旧 term 的决定不得覆盖新 term"是安全性的锚点。
  • 多数派(majority quorum):2f+1 节点中任意两个多数派必有交集,保证新旧主不可能同时获得多数认可。
  • 故障检测器:心跳超时启发式(kp-006),必然有误判,因此协议必须容忍"误判引发的选举"。

原理与机制

防脑裂的通用模式:

  1. 选票只发给一个候选者(任期 + 单票约束);
  2. 上任必须拿到多数派投票(旧主失去多数派心跳即自行退位);
  3. 写操作必须经过多数派确认(旧主即使没意识到自己下台,也无法凑齐多数派复制日志,写不生效)。

三条合起来:任意时刻最多只有一个"拥有多数派"的 leader。注意旧 leader 的僵尸写入还需 fencing token 兜底(存储层拒绝旧 term 的请求,见 kp-021)。

选举风暴与随机化:若所有节点同时超时同时竞选,会无限互投僵局。Raft 引入随机化选举超时(如 150–300ms 随机),打破对称性,是"用随机性绕开 FLP 不可能性"(kp-017)的标准操作。

优先级与外部仲裁:跨机房部署时可用优先级偏向主机房,或借助第三方仲裁(如更少数量的 witness/观察者节点、云厂商的租约服务)在偶数节点数时打破平票。

图示

分区前:  [A(leader) B C D E]  term=5
分区:    [A B] | [C D E]
右侧多数派选出 E  term=6;A 仍以为自己是主
A 写 → 请求多数派失败(只有B) → 无法提交
E 写 → CDE 多数派确认 → 生效
分区恢复后 A 看到 term=6 → 退位为 follower,未提交日志被覆盖

实例或案例

  • Raft 选举(kp-019 详解):candidate 自增 term、并行拉票、多数派即位;日志新者胜出规则保证当选者数据不落后。
  • Kafka:旧版依赖 ZooKeeper 选 controller,分区时曾有 controller 脑裂事故的修复史;新 KRaft 模式直接内嵌 Raft。
  • 数据中心失效切换:Redis Sentinel 的选举+仲裁多数派;配置不当(quorum 设置过小)曾导致真实环境双主。

常见误区

  • 误区一:"选出了新 leader,旧 leader 自然就不工作了"。旧 leader 可能只是被分区隔离,并未崩溃;必须靠 term/多数派/fencing 让它的写失效。
  • 误区二:"偶数节点更省机器"。偶数节点在性能上与少一台的奇数相同(多数派大小一样),却引入平票风险——集群规模永远选奇数。
  • 误区三:"选举超时越短越好"。太短会因 GC 停顿/网络抖动频繁换主(稳定性差),太长故障切换慢;需要抖动随机化 + 结合实测 P99 心跳延迟调参。

与其他知识点的关系

  • kp-017:选举是共识的准备阶段,多数派交集是共识安全性的基石。
  • kp-019:Raft 把选举、日志复制、安全性融为一体。
  • kp-021:fencing token 是防脑裂写入的最后防线。

自测题

  1. 为什么多数派交集能防双主?

答:任意两个多数派至少共享一个节点,该节点不可能同时投两票(任期+单票约束),故不可能存在两个同时获得多数派认可的 leader。

  1. term(任期)在选举中起什么作用?

答:作为逻辑时钟标识权威新旧;节点只承认不小于当前 term 的消息,旧 term 的 leader 消息会被拒绝,保证旧主无法反扑。

  1. 选举超时为什么必须加随机抖动?

答:避免所有节点同步超时、互相竞选造成选票分裂死循环;随机化打破对称性,让某个节点先发起并快速当选。

延伸阅读

  • Raft 论文第 5 节(Leader Election)。
  • Kyle Kingsbury 对各系统脑裂行为的 Jepsen 分析(jepsen.io)。
  • Marc Brooker, "Leading the Election with Raft"(AWS Builders' Library)。