备节点通过 etcd 竞选新的 Leader Key,具体是如何竞选呢
Patroni 通过 etcd 的。
·
备节点通过 etcd 竞选新的 Leader Key,具体是如何竞选呢
在 Patroni 集群中,备节点通过 etcd 的分布式锁机制(基于 Lease
和 CAS
操作)竞选 Leader Key,具体流程如下:
🔑 竞选 Leader Key 的核心机制
1. Leader Key 的存储结构
- Key 路径:
/service/<cluster_name>/leader
- 存储内容:当前主节点的标识(如
{"host":"pg-node-1", "version":"3.0"}
) - 关键属性:
Lease ID
:绑定租约(TTL),实现自动释放锁。ModRevision
:Key 的修改版本号(CAS 操作依据)。
2. 竞选流程
graph TD
A[备节点尝试竞选] --> B{检查 Leader Key 是否存在?}
B -- 不存在 --> C[创建 Leader Key<br>(携带 Lease ID)]
B -- 存在 --> D{当前 Leader Key 是否已过期?}
D -- 是 --> C
D -- 否 --> E[放弃竞选]
C --> F[CAS 写入操作]
F -- 成功 --> G[成为新主]
F -- 失败 --> H[竞选失败<br>等待重试]
3. 详细步骤拆解
-
监听与续期检查
所有 Patroni 节点持续监听 Leader Key 的变化(通过 etcd 的Watch
机制)。- 主节点:定期续期(
KeepAlive
)绑定的 Lease,证明自己存活(默认每ttl
秒续期一次,如 30 秒)。 - 备节点:检测 Leader Key 的 Lease 是否过期(TTL 归零)。
- 主节点:定期续期(
-
发起竞选请求
当备节点检测到 Leader Key 不存在或 Lease 过期时,发起竞选:- 使用 CAS(Compare-And-Swap) 原子操作尝试创建/更新 Leader Key:
etcdctl put /service/pg-cluster/leader '{"host":"pg-node-2"}' --lease=1234abc --prev-kv
- 核心条件:
- 若 Key 不存在,则直接创建;
- 若 Key 存在,则检查其
ModRevision
是否与预期一致(确保未被其他节点修改)。
- 使用 CAS(Compare-And-Swap) 原子操作尝试创建/更新 Leader Key:
-
竞选结果处理
- 成功:CAS 操作成功写入,该节点成为新主,并:
- 绑定新 Lease 并定期续期。
- 更新 etcd 中集群拓扑状态。
- 失败:CAS 操作被拒绝(其他节点已抢先竞选),则:
- 放弃竞选,继续作为备节点。
- 等待下一次检测周期(默认 10 秒)重试。
- 成功:CAS 操作成功写入,该节点成为新主,并:
⚙️ 关键技术保障
1. 租约(Lease)机制
- 主节点通过
KeepAlive
定期刷新 Lease(如每 10 秒续期一次 30 秒 TTL)。 - 若续期失败(如 etcd 故障或网络中断):
- Lease 自动过期,Leader Key 被 etcd 自动删除 → 触发备节点竞选。
2. 原子操作(CAS)
- 通过
ModRevision
确保并发安全:- 多个备节点同时发起竞选时,仅有一个节点的 CAS 操作能成功(etcd 保证原子性)。
- 失败节点收到 etcd 返回的当前最新
ModRevision
,用于下次重试。
3. 故障切换时序
🛠️ 关键配置项(patroni.yml)
# Leader 锁配置
distributed_configuration_store:
etcd3:
hosts: [etcd-node-1:2379, etcd-node-2:2379]
ttl: 30 # Leader Key 的 TTL(秒)
loop_wait: 10 # 节点状态检查间隔(秒)
retry_timeout: 10 # 竞选失败的重试等待时间(秒)
💡 竞选的本质
- 非抢占式:备节点不会主动“抢夺” Leader Key,而是等待当前锁自然释放(TTL 过期)。
- 最终一致性:etcd 集群可能在选举期间短暂不可用,但 Raft 协议保证数据一致后,竞选结果必然正确。
- 零脑裂风险:CAS 操作确保同一时刻最多只有一个节点能持有 Leader Key。
✅ 总结:Patroni 通过 etcd 的 Lease 续期 + CAS 原子操作 实现安全的 Leader 竞选。这种机制在 etcd 主备切换后依然有效,只要 etcd 集群恢复,Patroni 即可自动恢复锁竞争与状态同步。
更多推荐
所有评论(0)