领导者选举与租约

分布式系统通过选举产生单一写入者(或协调者):基于共识协议、租约或外部协调服务实现;必须配合租约到期与隔离机制避免双主。

领导者选举是什么

领导者选举在分布式系统中选出唯一的写入者或协调者,避免多个节点同时写造成数据冲突。常见实现包括基于共识协议的选举、租约加心跳续约、借助协调服务。选举解决的是谁当主,不解决旧主是否已经停止工作。

为什么必须防双主

网络分区或长时间停顿(例如垃圾回收)会让旧主的续约超时,新主随即被选出,而此时旧主可能仍在向存储写入。因此写入路径需要隔离机制:让旧主的请求被存储端拒绝,而不是依赖旧主自己及时停下。

基本信息

实现方式共识协议选举、租约加心跳续约、协调服务
关键要素租约时限、续约失败处理、旧主隔离
典型用途单写者、定时任务去重、分区分配
常见误区认为选出新主就万事大吉

防双主手段

手段机制注意
多数派仲裁获得多数票才能成为主偶数节点需明确仲裁规则
租约加心跳定期续约,过期自动失效续约与业务隔离,避免停顿误判
隔离令牌存储端校验令牌单调递增旧主请求被存储层拒绝
协调服务会话与租约绑定会话过期语义需与业务对齐

租约与令牌

租约与令牌
1. 申请租约 lease = now + TTL,得到单调递增的令牌
2. 后台心跳续约,续约失败立即停止对外提供写入服务
3. 每次写入携带令牌,存储端只接受更大的令牌
# 关键顺序:先停止服务,再等待重新选举,不要反着来

典型使用场景

  • 数据库主节点切换:保证同一时刻只有一个写入者
  • 定时任务去重:集群中只有一个实例执行周期任务
  • 分片分配:由主节点决定分片如何分布
  • 全局配置刷新:由一个节点拉取后广播,避免重复拉取
  • 分布式锁的底层实现:租约是许多锁服务的基础
选举只保证选出新主,不保证旧领导者已经停止工作;没有隔离机制时,短暂的分区就可能产生两个同时写入的主体。

易错点

  • 租约续期与业务处理共享线程,停顿导致误判失主,集群频繁切换
  • 旧主未隔离就恢复写服务,两个写入者同时存在,数据被交叉覆盖
  • 依赖时钟同步判断租约过期,时钟漂移导致租约重叠
  • 切换过程没有写入门禁,新主与旧主同时接受客户端请求

数据来源与参考

  • 《数据密集型应用系统设计》(Kleppmann)第 8 章
  • Martin Kleppmann《How to do distributed locking》(2016)
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌