← 中文资源

简体中文版本

用租约实现领导者选举

通过可续期租约选出唯一领导者,让跟随者感知过期,并使步骤幂等,使短暂的双领导者窗口无害。

阅读英文原文

概述

租约领导者无需硬编码协调者即可获得“恰好一个”的语义。由于故障转移时租约可能短暂重叠,每位领导者所做的工作必须幂等,设计才安全。

关键步骤

  1. 在协调存储中保存带持有者 id 与 TTL 的租约。
  2. 作为领导者时以短于 TTL 的间隔刷新租约。
  3. 跟随者监听键,在键消失时尝试获取。
  4. 让每个工作单元幂等,使重叠窗口不会重复生效。

验证

  • 任意时刻至多一个实例是领导者。
  • 旧租约过期后新领导者接管。
  • 无需人工操作即可续期领导权。
  • 重复执行工作得到相同结果。

注意事项

  • 租约容忍短暂的双领导,因此仅对幂等工作安全。
  • 不为任意临界区提供强一致;此类场景应使用共识原语。

适用范围

本条目围绕「用租约实现领导者选举」给出可复制的步骤、验证方式与常见问题,适合需要按此流程落地的工程团队。执行时请结合自身上下文调整命令与阈值,并在变更前后留存证据,便于后续复核与回滚。

建议在正式环境落地前先在预发或隔离环境演练一遍,把关键观测指标与负责人一并记录,确保出现异常时能快速定位并恢复。

if (await store.acquire(leaseKey, instanceId, ttl)) {
  startLeaderWork();
  setInterval(() => store.renew(leaseKey, instanceId, ttl), (ttl * 1000) / 3);
}