• 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) 12次浏览 0个评论

PostgreSQL 复制与高可用系列(一):从单点到集群,构建生产级数据基石

PostgreSQL 已成为无数企业核心系统的首选数据库,但单机部署始终是一个绕不开的问题:单点就是风险。当硬件故障、网络波动或人为误操作不期而至时,缺乏高可用架构的应用将面临不可预测的停机时间,甚至数据丢失。

本系列旨在系统梳理 PostgreSQL 复制与高可用技术,从原理到实践,从基础到进阶。作为开篇,本文将聚焦于核心概念、技术演进与关键原理,帮助读者建立完整的知识框架,为后续的动手实践打下坚实基础。

一、为什么要谈复制与高可用?

1.1 核心驱动力

在生产环境中建设高可用体系,根本目的是满足两个关键指标:

  • RPO(Recovery Point Objective):能容忍的最大数据丢失量,即灾难发生后,最多能接受丢失多长时间的数据。
  • RTO(Recovery Time Objective):能容忍的最大恢复时间,即从故障发生到服务恢复,允许经过多长时间。

这两个指标直接决定了架构设计的走向。追求 RPO=0(零数据丢失)往往意味着采用同步复制,而这可能牺牲写入性能;追求极低 RTO 则需要自动化故障切换能力,但又可能引入脑裂等风险。

1.2 复制的三大价值

复制不仅仅是高可用的技术手段,它带来的核心价值体现在三个层面:

价值维度 说明
高可用与容灾 主库故障时,备库可在秒级内接管服务,将停机时间从小时级压缩到秒级
读负载扩展 将读查询分发到只读备库,大幅提升系统整体吞吐能力
零停机运维 通过主从切换实现版本升级、硬件更换、系统维护,业务无感知

一个简单的论断值得记住:备份给你的是恢复能力,复制给你的是连续性

二、技术演进与应用场景

PostgreSQL 的高可用与复制能力并非一蹴而就,其演进大致可划分为三个阶段:

时期 定位 关键成果
2000–2010 单机深耕 WAL 机制奠基,ACID 与 SQL 标准为核心,追求强一致性
2010–2020 复制时代 流复制(9.0)、热备(9.0)、逻辑复制(10.0)相继落地,读写分离成为标准能力
2020至今 云原生智能 Patroni、Kubernetes Operator、声明式运维、自愈系统成为主流

不同场景对复制技术有着不同的诉求。例如,金融交易系统需要同步复制来保证零数据丢失(RPO=0),而报表分析场景可能只需异步复制的读扩展能力即可满足要求。理解这一演进脉络,有助于我们在选型时做出符合自身业务阶段的决策。

三、数据同步的基石:WAL

在深入具体的复制方案之前,需要先认识 PostgreSQL 的核心机制——预写日志(Write-Ahead Log,WAL)

3.1 WAL 的工作原理

WAL 记录了对数据库数据文件所做的所有更改。其核心原则是:在数据变更写入数据文件之前,先将变更记录写入日志。当系统崩溃时,PostgreSQL 可以通过“重放”自上次检查点以来的 WAL 记录,将数据库恢复到一致状态。

这个机制有两个关键意义:

  1. 崩溃恢复:无需依赖日志文件系统即可保证数据完整性。
  2. 复制的基础:WAL 记录正是数据同步的核心传输单位——无论是物理复制还是逻辑复制,数据变更的源头都来自 WAL。

3.2 持续归档与 PITR

除了用于崩溃恢复,WAL 还支撑着持续归档(Continuous Archiving)与时间点恢复(Point-in-Time Recovery,PITR)。这一能力的实现方式是:周期性执行文件系统级别的全量备份,同时持续归档此后生成的 WAL 文件。当需要恢复时,先还原全量备份,再按顺序重放归档的 WAL 文件,即可将数据库恢复到任意指定的时间点。

PITR 是应对数据误删除等人为错误的重要手段,属于备份恢复体系的利器,它与复制(维持在线备库)各司其职、互为补充。

四、物理复制 vs 逻辑复制:殊途同归的两种模型

PostgreSQL 提供两种核心复制技术——物理流复制和逻辑复制。理解两者的区别,是设计高可用架构的第一步。

4.1 物理流复制

原理:主节点将 WAL 日志(块级别的 REDO 记录)实时传输给从节点,从节点以相同顺序重放这些日志,从而在主从间建立起一份字节级别完全相同的副本。

从架构上看,主库通过 wal_sender 进程将 WAL 记录实时发送给备库,备库的 wal_receiver 进程接收并应用这些记录。配置层面的关键参数包括:wal_level = replicamax_wal_senders 用于控制并发发送进程数量,备库启用 hot_standby = on 以支持只读查询。

特点与适用

维度 说明
粒度 整个数据库集群级别,不支持选择性复制
延迟 极低,可用于高可用和实时灾备
备库可读写 备库默认只读
跨版本 通常要求主备版本一致,升级时需要停机
典型场景 主从高可用、读写分离、灾难恢复

一句话总结:物理流复制是 PostgreSQL 高可用的主力方案,简单、可靠、高效。

4.2 逻辑复制

原理:基于发布/订阅(Publication/Subscription)模型,主节点将指定表的 WAL 日志解析为逻辑变更(如 INSERT/UPDATE/DELETE),订阅节点接收并应用。

逻辑复制的架构与物理流复制类似,同样通过 walsenderapply 进程实现,但工作在不同层次。其关键配置要求为 wal_level = logical,同时需要提前创建发布和订阅对象。

特点与适用

维度 说明
粒度 表级选择性复制,可按需同步
灵活性 订阅端可写入其他数据,甚至可与其他版本 PG 同步
限制 需手动处理 DDL 变更,不支持 DDL 自动同步
典型场景 数据集成、跨版本迁移(如 12→15)、微服务数据分片

值得注意的是,物理复制与逻辑复制并非互斥——在实际生产中,经常将两者结合使用,例如通过物理复制构建高可用集群,同时在从库上配置逻辑复制将特定表数据同步至分析型数据库。

4.3 选型决策:一张表快速判断

如果您的需求是… 推荐方案
整个集群的高可用容灾 物理流复制
读写分离、读负载扩展 物理流复制
跨 PostgreSQL 大版本升级 逻辑复制
仅同步部分表到另一个库 逻辑复制
接收端也需要写入 逻辑复制(需处理冲突)
零数据丢失(RPO=0) 物理同步复制 + 多数派确认

五、同步 vs 异步:性能与安全之间的权衡

在物理流复制的基础之上,还有一个至关重要的配置选项:同步模式

5.1 异步复制

主库提交事务后无需等待备库接收确认,直接返回客户端成功。这是 PostgreSQL 流复制的默认模式。

优势:对主库性能影响最小,备库不可用时不影响主库服务。 风险:主库宕机时,可能丢失尚未传输到备库的 WAL 数据,RPO > 0。

5.2 同步复制

主库提交事务时,必须等待至少一个备库确认收到并持久化 WAL 后,才向客户端返回提交成功。

优势:主库故障时备库拥有完整的最新数据,RPO = 0。 代价:增加写入延迟;若备库故障,主库写入可能阻塞(除非配置降级策略)。

5.3 半同步(Quorum-based)

PostgreSQL 提供灵活的配置方式,例如 synchronous_standby_names = 'ANY 1 (standby1, standby2)' 表示等待 standby1 和 standby2 中的任意 1 个确认即可。这种多数派确认机制允许在数据安全与可用性之间寻找平衡点。

5.4 选型建议

同步复制适合金融、支付等对数据零丢失有强要求的业务,但必须配合高可靠的网络环境和充足硬件资源;异步复制则适用于可接受少量数据丢失、追求高性能的场景。在实际生产中,亦可采用“混合策略”——跨 IDC 的灾备链路采用异步,同机房备库配置为同步。

选型原则清晰明了:同步保数据,异步保性能,多数派求平衡

六、进阶模型阅读(简要介绍)

在掌握了物理与逻辑复制、同步与异步等核心概念后,还有几个进阶技术值得了解,本系列后续将深入讲解,此处先作简要介绍:

6.1 级联复制(Cascading Replication)

在级联复制架构中,一台备库不仅可以接收来自上游的 WAL 流,还可以将其转发给下游的其他备库,充当“中继站”角色。这有助于减少主库的连接压力、优化跨地区部署的带宽使用——例如,主库在北京,级联备库在上海,杭州、深圳再通过上海同步数据。

6.2 延迟复制(Delayed Replication)

延迟复制是通过人为控制备库延迟应用 WAL 的技术。其核心价值在于应对人为误操作:当主库上发生误删数据时,延迟备库仍保留着正确状态,为数据恢复争取宝贵时间窗口。

6.3 复制槽(Replication Slot)

复制槽用于防止主库在备库尚未接收的情况下回收 WAL 日志,避免备库因日志丢失而需要重建。主要适用于带宽有限或备库可能短暂落后的场景,但也需注意监控其使用情况,避免因备库长期离线导致 WAL 无限堆积、磁盘空间耗尽。

七、从复制到高可用:自动化与连接管理

仅仅建立主备复制关系,距离真正的生产级高可用还有一段距离。以下工具构成了高可用集群的拼图:

7.1 自动化故障切换

  • Patroni:目前社区最流行的高可用管理工具,基于 Python 开发,结合 DCS(如 Etcd、Consul、ZooKeeper)实现集群状态管理和自动故障切换。Patroni 负责 PostgreSQL 进程的启动、关闭、故障检测和自动主从切换。
  • repmgr:另一款成熟的 PostgreSQL 集群管理工具,同样支持自动故障转移。
  • pg_auto_failover:Microsoft 开源的简化版高可用方案,降低配置复杂度。
  • Stolon:云原生场景下的高可用方案,通过 Keeper、Sentinel、Proxy 三大组件配合 etcd 实现自动故障检测与切换。

7.2 连接管理

  • HAProxy:高性能 TCP 层负载均衡器,可根据健康检查将读写流量分发到不同节点。
  • PgBouncer:轻量级 PostgreSQL 连接池,减少频繁创建连接的开销,通常与 HAProxy 搭配使用。
  • Keepalived + VIP:通过虚拟 IP 实现主备切换时应用入口的自动漂移。

八、一个典型的完整容灾体系结构

现代企业的 PostgreSQL 高可用体系往往不是单一方案,而是多个技术层次共同构成的容灾矩阵。一个高可用的完整部署方案通常包括以下结构:

  • 主节点:处理全部写请求(1 台)
  • 从节点:承载读请求 + 热备容灾(2–3 台)
  • 独立监控节点:负责心跳检测、故障判断、自动切换选举
  • 备份系统:定期全量备份 + WAL 持续归档+PITR时间点恢复

这种分层设计的好处在于:复制保障连续性,备份兜底数据安全,二者协同实现真正的“高可用”。

九、系列预告:后续内容规划

第一期以宏观视角搭建了知识框架,后续将逐步深入每个技术细节:

期数 主题 亮点
第二期 物理流复制深度实战 从零搭建流复制集群,全配置参数解读
第三期 同步与异步复制工程实践 RPO/RTO 量化分析,性能压测对比
第四期 逻辑复制从入门到精通 发布/订阅详解,跨版本迁移实战
第五期 WAL 与 PITR 备份恢复 持续归档与实践演练
第六期 Patroni 高可用集群部署 自动化容灾落地,K8s 集成
第七期 水平扩展与混合架构 级联复制、读写分离、分区表与高可用

十、推荐资源

写在最后

PostgreSQL 的复制与高可用是一套庞大而精妙的技术体系:WAL 机制是它的心脏,流复制是它的血脉,而各类工具构成了它的神经网络。

理解 PostgreSQL 高可用技术的演进路径和核心取舍,是构建健壮数据基础设施的起点。本系列以第一期为起点,将逐一深入各个技术层次。正如在技术社区中反复被验证的一个判断:“最好的架构不是最复杂的,而是最适合业务场景的”

第二期将从物理流复制的部署配置开始,带领读者亲手搭建第一个主从集群。欢迎持续关注。


绩隐金 , 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:PostgreSQL 复制与高可用系列(一):从单点到集群,构建生产级数据基石
喜欢 (0)
发表我的评论
取消评论
表情 贴图 加粗 删除线 居中 斜体 签到

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

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