etcd 和 Patroni是搭建 PG 高可用集群时核心的两个组件。

一、 etcd:集群的“大脑”和“配置中心”

1、核心定义

etcd 是一个分布式、高可用的键值(Key-Value)存储系统,可以把它理解为:

  • 集群的“公告栏”:所有节点都能在这里读取/写入关键信息;
  • 集群的“锁管理器”:确保同一时间只有一个主库(Primary);
  • 集群的“配置中心”:存储PG集群的全局配置、节点状态等。

2、核心特性

它的核心特性是:

  • 强一致性:基于 Raft 共识算法,保证所有节点的数据完全一致;
  • 高可用:通常部署为 3/5 节点集群,少数节点故障不影响整体可用;
  • 轻量级:体积小、资源消耗低,专为分布式系统设计。

3、在PG集群中的具体作用

  • 存储集群元数据:比如哪个节点是主库、各从库的状态、PG的配置参数等;
  • 实现选主(Leader Election):当主库故障时,etcd 通过 Raft 算法保证只有一个从库能被选为新主,避免“脑裂”;
  • 健康检测:Patroni 会定期向 etcd 上报节点状态,etcd 记录各节点的存活情况;
  • 配置同步:集群的全局配置(如 PG 监听地址、复制参数)存在 etcd 中,所有节点同步读取,保证配置一致。

4、简单类比

etcd 就像一个“分布式保险柜”:

  • 所有节点都知道保险柜的位置,且只有一把“合法钥匙”(主库权限);
  • 保险柜里存着“谁是老大(主库)”“集群规则(配置)”;
  • 当老大出问题,大家通过保险柜的规则重新选老大,且只有一个新老大能拿到钥匙。

二、 Patroni:PG 集群的“管家”

1、核心定义

Patroni 是一个基于 Python 开发的PostgreSQL 高可用管理工具,它封装了 PG 原生的流复制、主从切换逻辑,对接 etcd(或 Consul/Zookeeper)实现自动化管理。

可以把它理解为:每个 PG 节点上都有一个“管家”(Patroni 进程),这些管家通过 etcd 沟通,共同管理整个集群。

2、核心功能(对 PG 节点的“管家职责”)

  • 节点监控:实时监控本地 PG 实例的状态(是否运行、复制延迟、连接数等),并上报到 etcd;
  • 自动主从切换:当检测到主库故障时,向 etcd 发起“选主请求”,在 etcd 确认后,将最优的从库提升为主库;
  • 自动搭建从库:通过 pg_basebackup 自动从主库克隆数据,快速搭建新的从库节点;
  • PG 配置管理:统一管理 PG 的 postgresql.conf pg_hba.conf 等配置文件,支持动态修改并生效;
  • 提供统一接口:通过 REST API 暴露集群状态、执行手动切换/扩容等操作,方便运维和集成。

3、关键特性

  • 无侵入:不修改 PG 源码,完全基于 PG 原生功能封装,兼容性好;
  • 易扩展:支持动态添加/移除节点,无需停机;
  • 灵活配置:可自定义切换策略(如优先选择复制延迟最小的节点当新主);
  • 支持手动干预:运维人员可通过命令手动切换主库,满足人工操作需求。

三、etcd + Patroni 的协作流程(PG 高可用核心逻辑)

用一个“主库故障切换”的场景,直观理解它们的配合:

  1. 正常状态
    • 每个 PG 节点的 Patroni 进程定期向 etcd 上报“心跳”(节点存活、PG 状态);
    • etcd 中记录当前主库的标识(如 /{namespace}/leader = pg-node-1)。
  2. 主库故障
    • pg-node-1 的 Patroni 停止上报心跳,etcd 检测到主库失联;
    • 各从库的 Patroni 发现主库故障,向 etcd 发起“竞选主库”的请求。
  3. 选主与切换
    • etcd 通过 Raft 算法保证只有一个从库(如 pg-node-2)获得“主库锁”;
    • pg-node-2 的 Patroni 执行切换操作:提升自己为主库、更新 postgresql.conf、通知其他从库重新同步;
    • etcd 更新“主库标识”为 pg-node-2,所有节点的 Patroni 读取该信息,确认新主。
  4. 恢复完成
    • 应用通过 Patroni 提供的接口(或 VIP)连接新主库,集群恢复可用;
    • 故障的 pg-node-1 修复后,Patroni 自动将其作为从库重新加入集群。

四、总结

  1. etcd 是集群的“共识层”:负责存储元数据、实现选主、保证一致性,是避免脑裂的核心,部署为 3/5 节点集群保证自身高可用。
  2. Patroni 是集群的“执行层”:运行在每个 PG 节点上,监控 PG 状态、执行主从切换、管理 PG 配置,是连接 PG 和 etcd 的桥梁。
  3. 两者配合:Patroni 负责“干活”(监控、切换),etcd 负责“决策”(选主、存配置),共同实现 PG 集群的全自动高可用。

这一组合是目前 PG 高可用的主流方案,核心优势是自动化程度高、稳定可靠,适合生产环境大规模部署。

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐