领导者选举与租约协调单一执行者但不能替代资源防护
说明共识任期、租约和 fencing token 如何约束领导者,并分析暂停、迟到写入、任务重放与维护切换。
领导者选举与租约协调单一执行者但不能替代资源防护
分布式任务常要求同一时刻只有一个实例执行调度、控制循环或分区写入。领导者选举让多个候选者竞争一个角色,并在领导者失效后转移。租约则给领导权附加有限有效期,持有者必须持续续约。两者减少重复工作,但“当前认为自己是领导者”不等于它发出的操作一定不会与新领导者冲突。
etcd 的并发 API 提供基于会话的竞选、观察和辞任语义:https://etcd.io/docs/v3.4/dev-guide/api_concurrency_reference_v3/。这些原语建立在共识存储之上,应用仍需定义会话失效、工作停止和受保护资源如何拒绝旧领导者。
共识日志确定领导权的先后关系
Raft 等共识算法通过任期、投票和多数派确认领导者,并让复制日志形成一致顺序。原始论文 In Search of an Understandable Consensus Algorithm 详细说明了选举限制、日志匹配和安全条件。应用层使用 etcd、Consul 或数据库锁时,通常消费的是这些系统已经封装的共识结果,而不是自行实现共识。
网络分区下,无法联系多数派的一侧不能安全产生新的共识决定,但旧领导者进程可能仍在运行。它可能因暂停、丢包或长时间垃圾回收而未及时发现租约失效。若受保护的数据库、设备或消息系统只凭进程内布尔值接受操作,旧领导者恢复后仍可能写入。
因此选举保证要与工作执行路径连接。领导者获得一个单调递增的任期或修订号,并把它作为 fencing token 随写操作发送。受保护资源只接受不小于已见最大 token 的操作,旧任期即使迟到也被拒绝。若资源无法执行这种检查,就要用其他幂等和冲突检测机制降低风险。
租约时长连接故障发现与误判
租约太短可以更快接管,却对网络抖动、时钟和进程暂停敏感,容易频繁换主;租约太长更稳定,但领导者失效后的停顿更久。续约间隔通常短于租约时长,并保留多次失败余量。参数应根据实际尾延迟、最长暂停和恢复目标测量,不应照搬默认值。
候选者要区分“未能续约”和“明确失去领导权”。两种情况下都应尽快停止发起新工作,但已经发送的外部操作可能无法撤回。长任务可以拆成带任期检查的阶段,或在每个提交点重新确认 token。简单在任务开始前判断一次领导身份,不足以保护持续数分钟的操作。
客户端与协调存储之间的会话也需要唯一身份。实例重启后应创建新会话,不能复用旧租约。容器名称或 IP 会重复,不能作为任期。观察领导者变化的订阅可能断线,恢复后要从一致修订号重新读取,而不是假定期间没有变化。
单一执行不代表恰好一次
领导者在外部操作成功后、记录进度前崩溃,新领导者会重做同一任务。因此领导者选举通常只能限制并发执行者,无法单独提供恰好一次副作用。任务应使用幂等键、事务发件箱、去重表或可比较版本,使重放不会产生重复扣款、重复通知或状态回退。
分片系统可能为每个分区分别选举领导者,以提升并行度。分区再均衡时,需要确保旧所有者与新所有者之间存在明确代际边界。全局单领导者实现简单,却容易形成吞吐和可用性瓶颈。选择粒度应与资源所有权一致。
领导者还不应承担只有自己才能恢复的内存状态。必要进度要写入可复制存储,候选者接管后能够重建。否则选举成功只是角色变化,服务仍需等待人工恢复。
测试要制造暂停和迟到写入
常规杀进程测试只能覆盖最简单故障。更有价值的场景包括:领导者与协调存储单向断网、进程长暂停后恢复、续约响应延迟、协调集群换主、旧写入晚于新任期到达,以及候选者同时启动。验证不仅看是否选出新领导者,还要检查是否出现双重副作用和状态倒退。
监控应显示当前领导者、任期或修订号、租约剩余时间、续约延迟、选举次数、无领导窗口和被 fencing 拒绝的操作。频繁换主通常意味着参数、网络或资源饱和问题,不应通过无限延长租约掩盖。
操作手册要说明怎样安全辞任、怎样暂停自动选举、怎样确认旧领导者已被隔离,以及协调存储不可用时系统采用何种降级。领导者选举是一种协调机制;只有受保护资源识别任期、任务可重放且故障测试覆盖迟到操作时,单一执行者的假设才真正成立。
维护操作不能绕过选举协议
人工切主、扩容和灾备演练也应通过同一任期机制完成。若运维人员直接修改一个“leader=true”配置,自动候选者可能仍在续约,形成双领导。安全流程通常先阻止旧实例获得新租约,再等待其工作停顿或 fencing 生效,最后允许目标实例参选。跨区域灾备还要确认协调存储的多数派位置和数据复制状态;在旧区域未隔离时强行建立新多数派,可能让两个区域分别认为自己有效。
选举组件升级时,应保持会话和 token 格式向后兼容。滚动升级期间不同版本会同时竞选,任何只在新版本识别的规则都可能失效。先验证候选者互操作,再升级受保护资源的 fencing 检查,最后清理旧协议,顺序比单个组件是否启动成功更重要。