基于本文回答

播面 播面

刷题像听歌,多听自然懂
0
评论

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),请选择 逻辑复制
00:00
00:00