PostgreSQL 物理复制(Physical Replication)和逻辑复制(Logical Replication)的区别是什么?
在 PostgreSQL 中,物理复制(Physical Replication)和逻辑复制(Logical Replication)是两种截然不同的数据同步机制。它们在底层原理、复制粒度、灵活性以及适用场景上都有显著的区别。
以下是两者的详细对比和核心区别:
1. 核心原理
- 物理复制:
- 机制: 基于预写式日志(WAL, Write-Ahead Log)的二进制数据块(Block)级别的复制。主库将底层的磁盘块修改记录直接发送给备库,备库接收后在其本地“重放(Replay)”这些日志。
- 通俗理解: 相当于对主库的硬盘数据文件进行“逐字节”的镜像克隆。备库的状态本质上是一个持续处于“崩溃恢复”状态的数据库。
- 逻辑复制:
- 机制: 基于数据行(Row)和事务级别的复制。主库通过“逻辑解码(Logical Decoding)”技术,将底层的 WAL 日志解析为具体的行修改操作(INSERT、UPDATE、DELETE),然后以发布/订阅(Publish/Subscribe)的模式发送给订阅端。
- 通俗理解: 相当于主库把“我向 A 表插入了一条张三的数据”这个具体的 SQL 动作告诉备库,备库再把这个动作执行一遍。
2. 详细对比分析(核心区别)
| 维度 | 物理复制 (Physical) | 逻辑复制 (Logical) |
|---|---|---|
| 复制粒度 | 整个集群(Instance)。包含所有数据库、表、角色、权限。 | 细粒度(表级别/数据库级别)。可以只同步某几张表。 |
| 底层数据传输 | 传输二进制的 WAL 日志块。 | 传输逻辑解码后的数据行变更(Tuples)。 |
| 目标库状态 | 严格只读(Hot Standby)。备库不能写入任何数据。 | 可读可写。订阅端接收数据的同时,也可以写入其他数据。 |
| DDL 支持 | 完美支持。表结构变更(如 ALTER TABLE)、建库等会自动同步。 |
不支持(直到 PG 16 仍不原生支持 DDL 复制)。需要在主备库分别手动执行表结构变更。 |
| 版本与系统限制 | 主备必须是相同的 PostgreSQL 主版本(如都是 PG 14),且操作系统架构也需相同。 | 支持跨版本、跨操作系统。例如可以将 PG 11 的数据同步到 PG 15。 |
| 性能与资源开销 | 性能极高,CPU 开销极小,直接应用磁盘块。 | 性能稍逊,主库需要 CPU 进行逻辑解码,备库需要执行 SQL 逻辑。 |
| 主键要求 | 无要求。 | 表通常需要有主键(Primary Key)或设置 REPLICA IDENTITY,否则无法同步 UPDATE/DELETE。 |
| 全局对象 | 自动复制用户、角色、密码、表空间等。 | 不复制全局对象、序列(Sequences)或大对象(Large Objects)。 |
3. 各自的优缺点与适用场景
🔴 物理复制 (Physical Replication)
- 优点:
- 设置简单,运行稳定可靠。
- 性能极高,延迟极低(尤其在流复制模式下)。
- 100% 镜像,不用担心遗漏任何表结构变更(DDL)或全局对象。
- 缺点:
- “全有或全无”,不能只复制一个库或一张表,浪费不必要的存储。
- 备库只能查,不能写,无法在备库上建立专门用于查询的额外索引。
- 无法用于跨大版本的数据库升级。
- 适用场景:
- 高可用(HA, High Availability): 如搭配 Patroni 做到主备自动切换。
- 容灾(DR, Disaster Recovery): 异地备份。
- 读写分离: 将纯查询的压力分摊到只读备库。
🔵 逻辑复制 (Logical Replication)
- 优点:
- 极其灵活,可以实现“只把核心业务表同步到另一个库”。
- 目标库可写,可以把多个不同主库的数据汇总到一个数据仓库中。
- 可以跨大版本同步,是实现零停机时间平滑升级的利器。
- 缺点:
- 维护成本高:如果主库修改了表结构(加减字段),必须小心翼翼地同步修改订阅端,否则复制会中断。
- 无法同步
TRUNCATE(部分支持)、Sequences(序列)和 DDL。 - 对主库的 CPU 有一定消耗(因为要进行逻辑解码)。
- 适用场景:
- 跨版本升级: 从旧版本 PostgreSQL 平滑升级到新版本。
- 数据汇聚与分发: 将多个分支机构的数据库表汇总到总部的中心库(多对一);或将总部的基础数据分发给各个系统(一对多)。
- 微服务数据解耦: 提取特定业务表的数据供其他微服务消费(常结合 Debezium 等 CDC 工具)。
- 需要对备库数据进行二次加工: 比如在备库加上不同于主库的索引以供报表系统查询。
总结:如何选择?
- 如果你需要的是“一旦主库挂了,备库立刻顶上”,或者单纯为了“分担主库查询压力”,请选择 物理复制。
- 如果你需要“跨版本升级”、“数据中心汇总”、“只同步某几张表”,或者对接 Kafka/Flink 等大数据平台(CDC),请选择 逻辑复制。