PostgreSQL作为企业级开源数据库,内置了多种数据复制能力,其中流复制与逻辑复制是最核心的两种机制。流复制从诞生之初便服务于高可用与灾备,通过将预写日志(WAL)实时传输到备节点重放,保证物理层一致;逻辑复制则在第九个主要版本中引入,借助逻辑解码插件把WAL转化为逻辑变更流,实现表级别、跨架构的数据同步。理解二者底层差异,是设计稳定系统的前提。

流复制的工作原理与部署方式
流复制依赖于PostgreSQL的WAL机制。主库在提交事务时生成WAL记录,后台walsender进程通过TCP将WAL段或增量记录发送给备库的walreceiver。备库接收后写入本地WAL,再由startup进程按物理块顺序重放,使数据文件与主库逐字节一致。这种物理复制不关心具体表结构,只保证磁盘页相同,因此备库无法单独开放写入,通常作为只读节点或潜在主节点存在。
配置流复制需要在主库创建复制专用角色并修改<pg_hba.conf>允许备库连接,同时设置<postgresql.conf>中的<wal_level>为replica或更高。备库则通过<primary_conninfo>指向主库,并使用<pg_basebackup>获取基础备份。以下是最简配置示例:
-- 主库创建复制用户 CREATE ROLE repl_user WITH REPLICATION PASSWORD 'secret' LOGIN; -- 主库 postgresql.conf wal_level = replica max_wal_senders = 5 listen_addresses = '*' -- 备库 postgresql.conf primary_conninfo = 'host=192.168.0.1 port=5432 user=repl_user password=secret' hot_standby = on
流复制支持同步与异步两种模式。同步模式下,主库提交需等待至少一个备库确认写入,通过<synchronous_commit>与<synchronous_standby_names>控制,可做到零数据丢失但增加写入延迟;异步模式吞吐更高,但故障切换可能丢失最后几笔事务。在金融核心交易中常采用一同步一异步的级联方案平衡安全与性能。
逻辑复制的数据流与典型用法
逻辑复制绕开了物理块,借助<logical_decoding>将WAL解析为逻辑操作。系统预置test_decoding或pgoutput插件,把插入、更新、删除事件以文本或二进制形式推送给订阅端。订阅端将变更应用到目标表,源与目标可以是不同大版本甚至不同引擎,只要表结构兼容即可。它支持发布端按表、按行过滤,极大提升了同步灵活性。
建立逻辑复制分为创建发布与订阅两步。发布端用<CREATE PUBLICATION>声明要同步的表,订阅端用<CREATE SUBSCRIPTION>连接并拉取。下面展示一个跨库同步用户表的例子:
-- 发布端 CREATE PUBLICATION user_pub FOR TABLE users, orders; -- 订阅端 CREATE SUBSCRIPTION user_sub CONNECTION 'host=192.168.0.1 dbname=app user=repl_user password=secret' PUBLICATION user_pub; -- 查看订阅状态 SELECT subname, subenabled FROM pg_subscription;
逻辑复制不会复制DDL,因此表结构变更需手动在两端执行,否则订阅会报错中断。它也不保证全局事务顺序跨表一致,仅单表内有序。这些限制使得逻辑复制更适合数据分发、数仓抽取、微服务数据库解耦等场景,而非整体容灾。当业务需要只同步部分省份订单到报表库时,逻辑复制比流复制节省大量带宽。
两种复制机制的对比与选型建议
从一致性视角看,流复制是物理一致,备库可与主库随时角色互换;逻辑复制是逻辑一致,允许两端表结构略有差异,但存在订阅延迟与冲突可能。延迟方面,流复制通常在毫秒级,逻辑复制因解码与重放开销常处于秒级甚至更高。运维复杂度上,流复制依赖基础备份与WAL归档,逻辑复制需管理发布订阅生命周期并监控冲突。
下表归纳核心差异:
| 维度 | 流复制 | 逻辑复制 |
|---|---|---|
| 复制粒度 | 实例级物理块 | 表级逻辑行 |
| 版本要求 | 主备大版本需一致 | 支持跨大版本 |
| 典型用途 | 高可用、灾备 | 数据集成、拆分 |
| DDL同步 | 自动跟随 | 不支持 |
实际架构中两者可并存:用流复制搭建双节点高可用底座,再在主机上开启逻辑复制将明细表投递到分析库。这样既获得故障自动切换能力,又避免分析查询拖累交易库。规划阶段应明确恢复点目标与恢复时间目标,若允许分钟级数据丢失且需跨云同步,逻辑复制加定时校验即可;若要求秒级切换零丢失,流复制同步提交不可替代。技术团队还应定期演练切换流程,验证复制链路在峰值流量下的稳定性。
PostgreSQLstream_replicationlogical_replication修改时间:2026-08-16 19:40:32