第二节 逻辑复制与物理复制对比

目标:深入理解 PostgreSQL 中两种核心的复制技术——物理复制(Physical Replication)和逻辑复制(Logical Replication)——的工作原理、优缺点和各自的适用场景。

PostgreSQL 的复制能力是其高可用性和扩展性架构的基石。它主要提供两种复制方式,理解它们的根本区别,对于设计正确的数据库架构至关重要。


一、物理复制 (Physical Replication)

物理复制,也常被称为流复制(Streaming Replication),是 PostgreSQL 最传统、最常用的复制方式。

工作原理:

  • 基于 WAL (Write-Ahead Log):主节点(Primary)将其产生的 WAL 记录,通过网络,以二进制流的形式,实时地传输给副本节点(Replica)。
  • 块级别的复制:副本节点接收到这些 WAL 记录后,不断地重放(Replay)它们,从而在物理层面(数据块、字节级别)上,与主节点保持一模一样的状态。
  • 结果:副本节点是主节点的一个精确到物理块的、只读的克隆

Physical Replication 图片来源: EnterpriseDB 官方博客

优点:

  1. 简单可靠:配置简单,技术成熟,经过了多年的生产环境验证。
  2. 性能极高:由于是底层的二进制流复制,开销非常小。
  3. 完全一致:可以保证副本是主节点的一个 100% 精确的、实时的物理拷贝。

缺点:

  1. 灵活性差
    • 全量复制:必须复制整个数据库实例的所有变更,无法选择只复制某张表或某个数据库。
    • 版本严格一致:主节点和副本节点的 PostgreSQL 主版本号必须完全相同,操作系统和硬件架构也必须兼容。
    • 副本是只读的:无法在副本上进行任何写操作。
  2. 不适用于多主:其单向、全量复制的特性,决定了它无法用于实现多主复制。

适用场景:

  • 高可用(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 命令一样,将这些变更应用到自己的表中。
  • 结果:订阅者在逻辑层面(数据行)上,与发布者的数据保持一致,但其底层的物理存储可以完全不同。

Logical Replication 图片来源: EnterpriseDB 官方博客

优点:

  1. 高度灵活
    • 选择性复制:可以选择只发布(复制)某几张表,甚至可以选择只复制 INSERTUPDATE,而不复制 DELETE
    • 跨版本/平台复制:由于复制的是逻辑变更,主节点和订阅者可以使用不同的 PostgreSQL 主版本(例如,从 14 复制到 15),甚至可以运行在不同的操作系统上。
    • 多对一/一对多:可以实现将多个发布者的数据汇总到一个订阅者,或将一个发布者的数据分发给多个订阅者。
  2. 多主复制的基础:像 BDR 这样的多主复制方案,正是建立在逻辑复制的基础之上。

缺点:

  1. 性能开销稍高:逻辑解码和重放 SQL 的过程,比直接应用 WAL 的二进制流要多一些 CPU 开销。
  2. 功能限制
    • 无法复制 DDL(Data Definition Language)变更。如果在主节点上 ALTER TABLE,这个变更不会被自动复制到订阅者,需要手动执行。
    • 无法复制大对象(Large Objects)。
    • 初始化的数据同步(Initial Data Sync)可能比物理复制更复杂。

适用场景:

  • 在线数据库升级:在不停机的情况下,将数据从旧版本的 PostgreSQL 迁移到新版本。
  • 数据共享与集成:在不同业务部门或微服务之间,选择性地共享一部分表的数据。
  • 构建数据仓库:将多个生产数据库的变更,实时地汇总到一个中央数据仓库中进行分析。
  • 多主复制:实现 BDR 等高级复制架构的基础。

📌 总结对比

特性物理复制 (流复制)逻辑复制
复制粒度整个数据库实例选择性的表
复制内容二进制 WAL 记录 (物理变更)行级别的逻辑变更 (DML)
灵活性
跨版本/平台
副本可写性严格只读订阅者是可写的(但要小心冲突)
性能开销极低稍高
DDL 复制
主要用途高可用、读写分离数据集成、在线升级、多主基础

选择建议

  • 对于标准的高可用和读写分离需求,物理复制因其简单、高效和可靠,仍然是首选方案。
  • 当你需要更精细的控制,例如只想复制一部分数据、需要在不同 PostgreSQL 版本间同步、或者要构建更复杂的拓扑结构时,逻辑复制则能提供无与伦比的灵活性。