3. Leader选举基础:分布式一致性算法(Raft/Paxos)简介、Leader选举在控制面组件中的典型应用场景

3.1 分布式一致性算法:从 Paxos 到 Raft

在 Serverless 控制面中,多个组件副本必须就系统状态(如函数版本、触发器绑定、SLO 配置)达成一致。分布式一致性算法正是解决这一问题的数学基础。业界主流从 Paxos 演进到 Raft,核心差异在于可理解性与工程落地成本。

维度 Paxos(经典) Raft(工程友好)
设计哲学 最小化消息轮次,理论优雅 可理解性优先,分解为子问题
Leader 角色 弱化,多 Proposer 可并行 强 Leader,所有写入必须经过 Leader
选举触发 无固定心跳,依赖 Prepare 阶段 固定心跳超时,随机化选举超时
日志复制 两阶段提交(Prepare + Accept) 单向 Append-Entries,Leader 主导
成员变更 复杂,需联合共识 单节点阶段变更(Joint Consensus)
工程落地 etcd、ZooKeeper 内部变体 etcd(Raft)、Consul、TiKV
关键结论:Serverless 控制面组件(如调度器、函数元数据服务、SLO 仲裁器)几乎全部采用 Raft 或其变体。Raft 的强 Leader 模型天然适配控制面“主从协同”的运维模式,且 Leader 选举的确定性降低了故障排查成本。

3.2 Raft Leader 选举核心机制

Raft 将节点划分为三种角色:Leader(处理所有客户端请求)、Follower(被动复制日志)、Candidate(发起选举的临时角色)。选举过程遵循以下步骤:

  1. 超时触发:Follower 在选举超时(通常 150–300ms,随机化)内未收到 Leader 心跳,转换为 Candidate。
  2. 发起投票:Candidate 自增 term(任期号),向所有节点发送 RequestVote RPC。
  3. 投票规则:每个节点在每个 term 内只能投一票,且只投票给日志至少与自己一样新的 Candidate。
  4. 赢得选举:Candidate 获得超过半数(N/2 + 1)节点的投票,成为新 Leader。
  5. 心跳确立:新 Leader 立即发送 AppendEntries(空日志作为心跳)抑制其他节点超时。
工程避坑:选举超时随机化是防止“选票分裂”的关键。如果所有 Follower 使用相同超时,它们会同时变成 Candidate,导致无人获得多数票,反复选举。生产环境建议超时范围 150–300ms,且每个节点独立随机。
Raft Leader 选举状态机与消息流 Raft Leader 选举状态机与消息流 Follower 被动复制日志 Candidate 发起选举 Leader 处理请求 选举超时 获得多数票 发现更高 term / 网络分区恢复 收到合法 Leader 心跳 选举消息流(RequestVote / AppendEntries) Candidate → 所有节点: RequestVote(term, lastLogIndex, lastLogTerm) 节点 → Candidate: RequestVoteResponse(term, voteGranted) Leader → 所有节点: AppendEntries(term, leaderId, prevLogIndex, entries)

3.3 Leader 选举在控制面组件中的典型应用场景

Serverless 控制面并非单一单体,而是由多个微服务组件构成。每个组件都可能需要 Leader 选举来保证高可用与状态一致性。以下列出四个最典型的应用场景:

组件 选举目的 选举粒度 典型实现
函数元数据服务 保证函数版本、别名、触发器配置的写入一致性 全局单 Leader etcd + Raft
SLO 仲裁器 避免多个副本同时发起 SLO 违约重调度,造成资源震荡 每个 SLO 维度一个 Leader 基于 Lease 的选主
调度器(Scheduler) 全局调度决策唯一性,防止重复调度或资源超卖 全局单 Leader + 影子副本 Raft + 预选日志
事件网关(Event Gateway) 保证事件投递的有序性与去重 分区(Partition)级别 Leader 基于 Raft 的分组分片
注意:并非所有控制面组件都需要强一致性选举。例如只读缓存组件、日志收集组件可以使用 gossip 协议或最终一致性模型。过度使用 Raft 会增加延迟和运维复杂度。建议仅在“写入一致性 + 故障自动切换”场景下引入 Leader 选举。

3.4 控制面 Leader 选举的典型架构模式

在实际 Serverless 平台中,Leader 选举通常与分布式协调服务(如 etcd、ZooKeeper)结合。组件副本通过竞争分布式锁或 Lease 来确立 Leader 身份。以下架构图展示了三副本元数据服务的选举拓扑:

控制面组件 Leader 选举架构(三副本 + etcd) 控制面组件 Leader 选举架构(三副本 + etcd) etcd 集群(Raft) 分布式协调 & 选主存储 副本 A(Leader) 持有 Lease,处理写入 副本 B(Follower) 只读,同步日志 副本 C(Follower) 只读,同步日志 创建/续约 Lease Watch Leader 变化 Watch Leader 变化 客户端请求 日志复制 日志复制 选举流程:副本启动 → 尝试创建 Lease → 成功者成为 Leader → 定期续约 → 失败则触发重新选举

3.5 选举后的关键动作:Lease 续约与故障检测

Leader 选举并非一次性事件,而是一个持续的过程。当选的 Leader 必须通过定期续约(Lease Renewal)来维持身份。一旦续约失败,其他副本将触发重新选举。以下是生产环境中的典型参数配置:

参数 推荐值 说明
Lease TTL 5–10 秒 Leader 失效后,其他副本等待的最长时间
续约间隔 TTL / 3(约 1.5–3 秒) Leader 定期刷新 Lease,避免过期
选举超时 150–300ms(随机) Follower 等待心跳的超时窗口
心跳间隔 50–100ms Leader 向 Follower 发送心跳的频率
最大重试次数 3–5 次 Leader 续约失败后的重试上限,超过则主动退位
生产建议:在 Serverless 控制面中,Lease TTL 不宜过短(<3 秒),否则网络抖动会频繁触发选举,导致控制面震荡;也不宜过长(>30 秒),否则 Leader 故障后恢复时间过长,影响 SLO 违约处置的时效性。推荐 5–10 秒作为平衡点。