第十六章 多主复制与读写分离 - 第二节:逻辑复制与物理复制对比
文章目录
第二节 逻辑复制与物理复制对比
目标:深入理解 PostgreSQL 中两种核心的复制技术——物理复制(Physical Replication)和逻辑复制(Logical Replication)——的工作原理、优缺点和各自的适用场景。
PostgreSQL 的复制能力是其高可用性和扩展性架构的基石。它主要提供两种复制方式,理解它们的根本区别,对于设计正确的数据库架构至关重要。
一、物理复制 (Physical Replication)
物理复制,也常被称为流复制(Streaming Replication),是 PostgreSQL 最传统、最常用的复制方式。
工作原理:
- 基于 WAL (Write-Ahead Log):主节点(Primary)将其产生的 WAL 记录,通过网络,以二进制流的形式,实时地传输给副本节点(Replica)。
- 块级别的复制:副本节点接收到这些 WAL 记录后,不断地重放(Replay)它们,从而在物理层面(数据块、字节级别)上,与主节点保持一模一样的状态。
- 结果:副本节点是主节点的一个精确到物理块的、只读的克隆。
图片来源: EnterpriseDB 官方博客
优点:
- 简单可靠:配置简单,技术成熟,经过了多年的生产环境验证。
- 性能极高:由于是底层的二进制流复制,开销非常小。
- 完全一致:可以保证副本是主节点的一个 100% 精确的、实时的物理拷贝。
缺点:
- 灵活性差:
- 全量复制:必须复制整个数据库实例的所有变更,无法选择只复制某张表或某个数据库。
- 版本严格一致:主节点和副本节点的 PostgreSQL 主版本号必须完全相同,操作系统和硬件架构也必须兼容。
- 副本是只读的:无法在副本上进行任何写操作。
- 不适用于多主:其单向、全量复制的特性,决定了它无法用于实现多主复制。
适用场景:
- 高可用(High Availability):搭建一个热备份(Hot Standby)节点,在主节点宕机时可以快速接管服务。
- 读写分离(Read Scaling):将读请求分散到多个只读副本上,以扩展读取能力。
二、逻辑复制 (Logical Replication)
逻辑复制是 PostgreSQL 10 版本引入的、更现代、更灵活的复制方式。
工作原理:
- 基于逻辑解码(Logical Decoding):主节点(称为发布者,Publisher)将 WAL 记录解码成一种逻辑的、与存储无关的格式(例如,
INSERT INTO my_table (id, name) VALUES (1, 'Alice')
这样的高级别变更)。 - 行级别的复制:发布者将这些逻辑变更流发送给订阅者(Subscriber)。订阅者接收到后,像执行普通的 SQL 命令一样,将这些变更应用到自己的表中。
- 结果:订阅者在逻辑层面(数据行)上,与发布者的数据保持一致,但其底层的物理存储可以完全不同。
图片来源: EnterpriseDB 官方博客
优点:
- 高度灵活:
- 选择性复制:可以选择只发布(复制)某几张表,甚至可以选择只复制
INSERT
和UPDATE
,而不复制DELETE
。 - 跨版本/平台复制:由于复制的是逻辑变更,主节点和订阅者可以使用不同的 PostgreSQL 主版本(例如,从 14 复制到 15),甚至可以运行在不同的操作系统上。
- 多对一/一对多:可以实现将多个发布者的数据汇总到一个订阅者,或将一个发布者的数据分发给多个订阅者。
- 选择性复制:可以选择只发布(复制)某几张表,甚至可以选择只复制
- 多主复制的基础:像 BDR 这样的多主复制方案,正是建立在逻辑复制的基础之上。
缺点:
- 性能开销稍高:逻辑解码和重放 SQL 的过程,比直接应用 WAL 的二进制流要多一些 CPU 开销。
- 功能限制:
- 无法复制 DDL(Data Definition Language)变更。如果在主节点上
ALTER TABLE
,这个变更不会被自动复制到订阅者,需要手动执行。 - 无法复制大对象(Large Objects)。
- 初始化的数据同步(Initial Data Sync)可能比物理复制更复杂。
- 无法复制 DDL(Data Definition Language)变更。如果在主节点上
适用场景:
- 在线数据库升级:在不停机的情况下,将数据从旧版本的 PostgreSQL 迁移到新版本。
- 数据共享与集成:在不同业务部门或微服务之间,选择性地共享一部分表的数据。
- 构建数据仓库:将多个生产数据库的变更,实时地汇总到一个中央数据仓库中进行分析。
- 多主复制:实现 BDR 等高级复制架构的基础。
📌 总结对比
特性 | 物理复制 (流复制) | 逻辑复制 |
---|---|---|
复制粒度 | 整个数据库实例 | 选择性的表 |
复制内容 | 二进制 WAL 记录 (物理变更) | 行级别的逻辑变更 (DML) |
灵活性 | 低 | 高 |
跨版本/平台 | 否 | 是 |
副本可写性 | 严格只读 | 订阅者是可写的(但要小心冲突) |
性能开销 | 极低 | 稍高 |
DDL 复制 | 是 | 否 |
主要用途 | 高可用、读写分离 | 数据集成、在线升级、多主基础 |
选择建议:
- 对于标准的高可用和读写分离需求,物理复制因其简单、高效和可靠,仍然是首选方案。
- 当你需要更精细的控制,例如只想复制一部分数据、需要在不同 PostgreSQL 版本间同步、或者要构建更复杂的拓扑结构时,逻辑复制则能提供无与伦比的灵活性。