• Welcome to HiddenMerit - Clyde's Blog
  • Welcome to try the game Torn: Referral Link
  • If you are my relative, friend, or netizen, quickly press Ctrl+D to bookmark Clyde's Blog
  • This site has a like feature. If you read any article, please hit the like button so I know someone has visited
  • Email: hiddenmeritATgmail.com (replace AT with @)

PostgreSQL 复制与高可用系列(七):架构全景与选型决策——从单点到韧性系统

DBA Clyde Jin 3周前 (04-24) 11次浏览 0个评论

PostgreSQL 复制与高可用系列(七):架构全景与选型决策——从单点到韧性系统

前六期围绕 PostgreSQL 的复制与高可用展开了一次系统性探索:从 WAL 日志的物理本质,到流复制与逻辑复制的协同;从同步/异步的模式权衡,到 PITR 的恢复实践;最后以 Patroni 的生产级部署收束,完成了高可用技术的完整拼图。 作为系列收官之作,第七期将鸟瞰全局:比较主流高可用方案的适用边界,剖析级联复制与读写分离的水平扩展形态,给出业务导向的选型模型,并展望云原生与智能化时代的技术演进方向。最终帮助读者建立起从“能搭”到“会选”再到“懂演进”的完整能力。

一、补充篇:级联复制与读写分离

前六期主要聚焦于主从两层架构。但在实际大型系统中,级联复制和读写分离往往是必须具备的能力,本节系统地补上这两块知识。

1.1 级联复制(Cascading Replication)

定义:备库不仅可以从主库接收 WAL 流,还可以将 WAL 转发给下游的其他备库,形成以主库为根、多级节点的树状复制拓扑。

使用场景

  • 减轻主库连接压力:当从库数量众多时(如 50 个),主库的 max_wal_senders 可能成为瓶颈。级联复制允许将大部分从库挂载在少数几个第一层备库下,大幅减少主库的 walsender 进程数。
  • 跨地域部署优化:主库在北京,第一层备库部署在上海(跨地域 WAL 传输一次),上海再向杭州、南京等更多备库分发。这样只有一条跨地域链路,其它为低成本地域内链路。
  • 隔离读取负载:报表分析等重型查询可挂在二级备库上,避免与核心备库争抢 I/O 资源。

配置方法:在一台备库的 postgresql.conf 中设置 max_wal_senders > 0,并将其 hot_standby = on。然后在更下游的备库的 primary_conninfo 中指向该级联备库的 IP 和端口。Patroni 支持通过 cascade_replication 参数来声明级联关系。

限制与注意事项

  • 级联层数不宜过深(建议 1~2 层),每增加一层,复制延迟会累加。
  • 如果级联备库还开启了同步复制,需要仔细设计同步备库的确认链,避免 WAL 在中间节点阻塞。

1.2 读写分离架构

读写分离是扩展读能力的标准模式。在 PostgreSQL 生态中,通常有两种实现路径:

路径 实现方式 优点 缺点
内置流复制 + 中间件 主库处理写,备库(可多个)处理读,由中间件(PgBouncer、HAProxy、pgpool-II)根据 SQL 类型或语句关键字路由 透明、灵活、对应用影响小 中间件成为潜在瓶颈;需要识别只读事务
逻辑复制 + 应用层路由 应用代码里显式区分读写连接池 无需中间件,全掌控 侵入代码,容易遗漏

生产环境推荐使用 PgBouncerHAProxy + pg_stat_replication 的轻量级方案。PgBouncer 不仅支持读/写分离池,还能复用连接,减少后端连接数。

拆分读请求时,需要注意:

  • 延迟敏感型读:必须读主库(如刚提交的订单详情)
  • 最终一致性读:可以读备库,即使有几百毫秒延迟也可以接受

SHOW 命令如何处理SHOW ALL 等命令在不同节点上返回结果可能不同,建议一律路由到主库。

pgpool-II 的局限性:pgpool-II 是比较老牌的中间件,但它采用了部分侵入式解析 SQL 进行负载均衡的策略,在一些 ORM 复杂查询场景下易出 Bug,目前使用 Patroni + HAProxy + PgBouncer 组合更普遍。

二、主流高可用方案全景对比

除了 Patroni,PostgreSQL 生态中还有多种高可用方案可供选择。它们的设计哲学和适用场景各有不同。

方案 选主依赖 自动切换 脑裂防护 运维复杂度 典型场景
Patroni DCS(etcd/Consul/ZooKeeper/K8s) ✅ 是 Watchdog + 多数派 中等 绝大多数生产环境(推荐)
repmgr 自研选举,基于 pg 元数据表 ✅ 是 多数派投票 较低 中小规模、不想引入外部依赖的口碑工具
pg_auto_failover 内置监视器(PostgreSQL + 监听组) ✅ 是 自动隔离节点(Citus Data 出品) 较低 云场景、托管服务、简化运维
Stolon DCS(etcd/Consul) ✅ 是 DCS 租约 + 代理层屏蔽 较高 Kubernetes 早期选手,曾流行但社区趋缓
PAF (ClusterLabs) Pacemaker + Corosync ✅ 是 资源约束 + 隔离设备 传统数据中心,已有 Pacemaker 运维体系的团队
自写脚本 + 流复制 无 / 手工 ❌ 否 简单测试或非常规需求(不推荐生产)
云托管(RDS/Aurora) 云厂商内部实现 ✅ 是 云平台保障 极低(SaaS) 不想自建基础设施、追求极简运维

选型解读

  • Patroni 是社区事实标准,适合需要成熟、可控、可扩展的企业。
  • repmgr 更轻量,适合不想引入第三方 DCS(如 etcd)的团队,但它的脑裂防护能力弱于 Patroni,尤其是在网络分区时容易产生双主。
  • pg_auto_failover 由 Microsoft/Citus Data 推出,设计得简单且安全,但功能上比 Patroni 少(比如不支持同步多数派模式),适合云上托管或标准化部署。
  • 云托管 是最“省心”的路径,但需要接受黑盒和潜在的厂商锁定。

2.1 选型决策表(按业务特征)

业务特征 推荐方案 核心理由
核心交易库,百万级 TPS,要求极致稳定 Patroni (etcd) + 同步多数派 社区活跃,故障切换经过数万公司验证
中小规模(<10 节点),不想新增 DCS repmgr + 异步复制 + VIP 部署简单,足够应对多数故障
自动化要求高,团队运维人员少 pg_auto_failover 开箱即用,切换策略激进但安全
已全面 Kubernetes 化,追求 GitOps Zalando Postgres Operator + Patroni 声明式管理,与 K8s 生态深度整合
已有 VMware + Pacemaker 标准 PAF(Pacemaker) 不引入新技术栈,统一运维规范

三、从单点到韧性系统:完整架构全景图

一个生产级 PostgreSQL 韧性系统通常由以下层次组成:

┌─────────────────────────────────────────────────────────────┐
│                    应用层(Application)                     │
└───────────────────────────┬─────────────────────────────────┘
                             │
┌────────────────────────────▼────────────────────────────────┐
│              接入层(Connection Pooling & Routing)          │
│        HAProxy (VIP) + PgBouncer / 云 LB + Service          │
└───────────────────────────┬─────────────────────────────────┘
                             │
┌────────────────────────────▼────────────────────────────────┐
│        高可用控制层(High Availability Controller)          │
│       Patroni / repmgr / pg_auto_failover + DCS            │
└───────────────────────────┬─────────────────────────────────┘
                             │
┌────────────────────────────▼────────────────────────────────┐
│              数据层(PostgreSQL Cluster)                    │
│    Primary  │  Sync Replica  │  Async Replica  │  Cascade  │
└────────────────────────────┬────────────────────────────────┘
                             │
┌────────────────────────────▼────────────────────────────────┐
│           备份恢复层(Backup & PITR)                        │
│       pgBackRest + 对象存储(S3) / 远程 NFS                │
└─────────────────────────────────────────────────────────────┘

各层职责:

  • 接入层:连接池、读写分离、负载均衡、主库健康检查。
  • 高可用控制层:监控 PG 状态、选主、自动切换、配置管理。
  • 数据层:PostgreSQL 实例 + 流复制(同步/异步/级联)。
  • 备份恢复层:全量/增量备份 + WAL 归档 + 定期演练。

跨地域部署扩展:在两地三中心或多云的场景中,上述架构需要扩展为:

  • 主中心:Patroni + 同步多数派(3 节点)
  • 同城灾备中心:异步流复制 + 逻辑复制(用于报表)
  • 异地灾备中心:仅 WAL 归档 + pgBackRest 异地副本,不搭建实时从库(成本优化)

四、方案选型决策树

为了帮助实际项目快速确定技术路线,提供一个四步决策树:

第一步:数据丢失容忍度(RPO)

  • 必须为 0 → 用同步复制模式(Patroni 同步多数派或 repmgr + 同步复制)
  • 可容忍秒级丢失 → 异步复制,但需严密监控复制延迟

第二步:恢复时间目标(RTO)

  • ≤ 1 分钟 → 自动化切换(Patroni、pg_auto_failover)
  • 5-15 分钟 → 自动化切换同样适合,但切不可完全依赖人工
  • 30 分钟 → 可考虑手工切换 + 完善人工流程(风险高,不推荐)

第三步:团队规模与运维能力

  • 少(1-2 人,支持全栈) → 云托管(RDS)或 pg_auto_failover
  • 中(2-5 人 DBA 团队) → Patroni + etcd
  • 大(>5 人 DBA,有专职架构) → Patroni + 自定义监控告警、储备级联复制能力

第四步:基础设施环境

  • 虚拟机 / 物理机 → Patroni / repmgr / pg_auto_failover 均可
  • 裸金属 + 已经用 Pacemaker → PAF
  • Kubernetes → Zalando Postgres Operator

组合示例

某金融交易平台:RPO=0,RTO < 30 秒,团队 3 人 DBA,物理机 → 选 Patroni + etcd(3 节点) + 同步多数派 + HAProxy + pgBackRest。

五、未来趋势:云原生、超融合与 AI4DB

PostgreSQL 高可用生态仍在快速演进,几个显著方向值得关注:

5.1 云原生数据库的冲击

  • Aurora PostgreSQL:存储与计算分离,复制在存储层完成,RPO 接近 0,故障恢复秒级。对传统基于 WAL 流复制的架构提出挑战,但代价是绑定特定云。
  • Neon:开源 serverless PostgreSQL,将 WAL 与 page 分离,类似 Aurora 但开源,可实现分支、即时恢复等高级功能。
  • Google AlloyDB:智能存储 + 列式引擎,宣称比标准 PostgreSQL 快 4 倍。

这些新架构在某些场景下可能取代自建高可用方案,但在可预见的未来,大量企业仍会坚持自管理 PostgreSQL,因为避免厂商锁定、控制成本、满足合规是硬需求。

5.2 Kubernetes 的统治力上升

Patroni 社区和 Operator 模式已经证明:在 Kubernetes 上运行有状态数据库是可行的。未来趋势:

  • 更多数据库 Operator 将 Patroni 内置,提供声明式高可用
  • DCS 将逐渐从 etcd 转向 Kubernetes API server 原生能力(如 Lease API)
  • StatefulSet + 本地 SSD + 延迟敏感的调度策略日趋成熟

5.3 存储与复制的融合

Ceph、Longhorn 等分布式存储提供多副本能力,上层 PostgreSQL 甚至不需要流复制。但性能损耗和跨节点延迟仍然是挑战。适合 I/O 要求不高但运维极简的场景。

5.4 AI 驱动的智能运维

AI4DB 开始渗透到高可用领域:

  • 故障预测:根据系统指标提前预警主库可能宕机,主动切换。
  • 参数调优:根据负载特征自动调整 synchronous_commitmax_wal_senders 等。
  • 根因分析:故障后自动分析 WAL、日志、DCS 记录,给出精确的切换原因。

虽然成熟产品尚少,但 PostgreSQL 社区和商业厂商都在探索。

六、系列回顾与致谢

从第一期到第七期,我们完整走过了 PostgreSQL 复制与高可用的知识体系:

期数 核心主题 关键收获
宏观框架 WAL 基石,物理 vs 逻辑,同步 vs 异步
物理流复制实战 主从搭建,pg_basebackuprecovery.signal
同步与异步工程权衡 RPO/RTO 量化,多数派同步,压测数据
逻辑复制深度 发布/订阅,跨版本迁移,冲突处理,DDL 问题
WAL 内核与 PITR 备份恢复,pgBackRest,时间点恢复
Patroni 生产部署 自动切换,DCS 选型,K8s 集成
架构全景与选型 级联复制,方案对比,未来趋势

通过这七期,读者应当能够:

  1. 独立搭建 具备故障自动切换能力的 PostgreSQL 高可用集群。
  2. 量化分析 不同复制模式对 RPO/RTO 和性能的影响。
  3. 制定备份策略 并定期执行 PITR 演练。
  4. 根据业务场景 选择最适合的高可用方案。
  5. 跟踪演进 将云原生、K8s 等新趋势融入架构。

写在最后

数据库高可用不是搭建完就一劳永逸的,而是一个持续迭代、验证、改进的过程。定期进行混沌工程实验(如模拟杀主库进程、网络分区)比任何文档都更能检验集群的真实韧性。

本系列尽可能避免空洞的理论,而是以工程视角呈现配置、脚本、命令和最佳实践。希望您能将其中至少一个章节的知识点转化为下一阶段的落地计划——无论是优化流复制参数、部署 PITR 演练,还是引入 Patroni。

技术之路,行稳致远。感谢一路陪伴,愿您在 PostgreSQL 的路上越走越宽。

附录:快速参考链接


绩隐金 , 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:PostgreSQL 复制与高可用系列(七):架构全景与选型决策——从单点到韧性系统
喜欢 (0)
发表我的评论
取消评论
表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址