备节点通过 etcd 竞选新的 Leader Key,具体是如何竞选呢

在 Patroni 集群中,备节点通过 etcd 的分布式锁机制(基于 LeaseCAS 操作)竞选 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. 详细步骤拆解
  1. 监听与续期检查
    所有 Patroni 节点持续监听 Leader Key 的变化(通过 etcd 的 Watch 机制)。

    • 主节点:定期续期KeepAlive)绑定的 Lease,证明自己存活(默认每 ttl 秒续期一次,如 30 秒)。
    • 备节点:检测 Leader Key 的 Lease 是否过期(TTL 归零)。
  2. 发起竞选请求
    当备节点检测到 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 是否与预期一致(确保未被其他节点修改)。
  3. 竞选结果处理

    • 成功:CAS 操作成功写入,该节点成为新主,并:
      • 绑定新 Lease 并定期续期。
      • 更新 etcd 中集群拓扑状态。
    • 失败:CAS 操作被拒绝(其他节点已抢先竞选),则:
      • 放弃竞选,继续作为备节点。
      • 等待下一次检测周期(默认 10 秒)重试。

⚙️ 关键技术保障

1. 租约(Lease)机制
  • 主节点通过 KeepAlive 定期刷新 Lease(如每 10 秒续期一次 30 秒 TTL)。
  • 若续期失败(如 etcd 故障或网络中断):
    • Lease 自动过期,Leader Key 被 etcd 自动删除 → 触发备节点竞选
2. 原子操作(CAS)
  • 通过 ModRevision 确保并发安全:
    • 多个备节点同时发起竞选时,仅有一个节点的 CAS 操作能成功(etcd 保证原子性)。
    • 失败节点收到 etcd 返回的当前最新 ModRevision,用于下次重试。
3. 故障切换时序
主节点 etcd 备节点 PostgreSQL 每 10 秒续期 Lease(KeepAlive) 续期成功 故障(停止续期) 检测到 Lease 过期(TTL=0) CAS 创建 Leader Key 写入成功 执行 pg_promote() 提升为主库 主节点 etcd 备节点 PostgreSQL

🛠️ 关键配置项(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 即可自动恢复锁竞争与状态同步。

Logo

助力广东及东莞地区开发者,代码托管、在线学习与竞赛、技术交流与分享、资源共享、职业发展,成为松山湖开发者首选的工作与学习平台

更多推荐