领导者选举是什么
领导者选举在分布式系统中选出唯一的写入者或协调者,避免多个节点同时写造成数据冲突。常见实现包括基于共识协议的选举、租约加心跳续约、借助协调服务。选举解决的是谁当主,不解决旧主是否已经停止工作。
为什么必须防双主
网络分区或长时间停顿(例如垃圾回收)会让旧主的续约超时,新主随即被选出,而此时旧主可能仍在向存储写入。因此写入路径需要隔离机制:让旧主的请求被存储端拒绝,而不是依赖旧主自己及时停下。
基本信息
| 实现方式 | 共识协议选举、租约加心跳续约、协调服务 |
|---|---|
| 关键要素 | 租约时限、续约失败处理、旧主隔离 |
| 典型用途 | 单写者、定时任务去重、分区分配 |
| 常见误区 | 认为选出新主就万事大吉 |
防双主手段
| 手段 | 机制 | 注意 |
|---|---|---|
| 多数派仲裁 | 获得多数票才能成为主 | 偶数节点需明确仲裁规则 |
| 租约加心跳 | 定期续约,过期自动失效 | 续约与业务隔离,避免停顿误判 |
| 隔离令牌 | 存储端校验令牌单调递增 | 旧主请求被存储层拒绝 |
| 协调服务 | 会话与租约绑定 | 会话过期语义需与业务对齐 |
租约与令牌
租约与令牌
1. 申请租约 lease = now + TTL,得到单调递增的令牌
2. 后台心跳续约,续约失败立即停止对外提供写入服务
3. 每次写入携带令牌,存储端只接受更大的令牌
# 关键顺序:先停止服务,再等待重新选举,不要反着来典型使用场景
- 数据库主节点切换:保证同一时刻只有一个写入者
- 定时任务去重:集群中只有一个实例执行周期任务
- 分片分配:由主节点决定分片如何分布
- 全局配置刷新:由一个节点拉取后广播,避免重复拉取
- 分布式锁的底层实现:租约是许多锁服务的基础
选举只保证选出新主,不保证旧领导者已经停止工作;没有隔离机制时,短暂的分区就可能产生两个同时写入的主体。