目录
(1) WAL(Write-Ahead Logging)机制
PostgreSQL的逻辑复制(Logical Replication)是一种数据复制技术,允许数据库之间复制特定表或数据流,而不仅仅是物理复制的整个数据库块。与物理复制不同,逻辑复制是基于SQL层的,并且能够实现更精细的数据同步控制。其核心原理如下:
1. 逻辑复制架构
逻辑复制采用发布-订阅模型:
- 发布者(Publisher):
- 发布者是提供数据复制源的PostgreSQL实例。它定义了一个或多个“发布”(Publication),并包含需要同步到其他数据库的表或数据变更。发布者通过逻辑复制槽(Logical Replication Slot)将数据变更转换为逻辑变更流并发送给订阅者。
- 发布内容可以包括
INSERT
、UPDATE
、DELETE
操作。
- 订阅者(Subscriber):
- 订阅者是从发布者接收数据并将其应用到自身数据库的PostgreSQL实例。它通过订阅(Subscription)来连接到发布者,并从发布者那里订阅逻辑变更流。
- 订阅者接收到的数据可以被实时应用到其数据库中的表上,也可以通过应用触发器或其它自定义逻辑进一步处理这些变更。
通过这种模型,用户可以选择只复制某些表,而不是整个数据库实例的所有内容,也就是发布者和订阅者之间进行双向通信,多个订阅者也可以同时订阅一个发布者。
2.关键技术概念
(1) WAL(Write-Ahead Logging)机制
WAL机制确保在数据修改之前,将变更写入日志,以防止在崩溃后数据丢失。逻辑复制通过解析WAL日志获取逻辑操作,而物理复制则传递整个WAL日志。
(2) 逻辑复制插件
PostgreSQL中的逻辑复制依赖于逻辑复制插件(如 pgoutput
),该插件能够解析WAL日志并将物理操作转换为逻辑变更流(SQL语句级别的变更)。
3. 复制过程
逻辑复制的工作流程可以分为以下几个步骤:
(1) 初始数据快照
- 在订阅建立时,订阅者首先从发布者那里接收相关表的一个完整快照。这是一个一致的视图,确保订阅者在复制开始前拥有正确的数据基线。
(2) 持续数据变更捕获
- 当初始快照传输完毕后,发布者将持续监控这些表的变更,并将每个变更记录到WAL日志中。逻辑复制插件会解析WAL日志,提取逻辑变更(
INSERT
、UPDATE
、DELETE
),并将这些变更打包成逻辑复制流。
(3) 数据同步与应用
- 订阅者接收到逻辑复制流,并将这些变更按顺序应用到本地数据库的相应表上。数据变更可以实时或接近实时应用,确保订阅者与发布者的数据保持同步。
4. 逻辑复制的组件
- Publication(发布):
发布是由发布者定义的数据变更集合。每个发布可以包括多个表,发布的表也可以是不同的表(并非整个数据库)。在定义发布时,可以选择复制特定的DML操作类型,如
INSERT
、UPDATE
、DELETE
,具体步骤如下:- 使用命令
CREATE PUBLICATION
定义发布内容。例如:CREATE PUBLICATION my_publication FOR TABLE my_table;
- 使用命令
- Subscription(订阅):
订阅者通过订阅来指定需要从哪个发布者接收哪些发布。订阅者需要了解发布者的连接信息(主机名、端口、用户、数据库等)来建立连接并获取发布内容。订阅定义时,可以指定要从哪些发布中接收数据:
- 使用命令
CREATE SUBSCRIPTION
创建订阅,例如:CREATE SUBSCRIPTION my_subscription CONNECTION 'dbname=mydb host=publisher_host user=rep_user' PUBLICATION my_publication;
- 使用命令
- Logical Replication Slot(逻辑复制槽):
逻辑复制槽是发布者端的机制,确保WAL(Write-Ahead Logging)日志中的变更保持可用,直到订阅者成功接收到这些变更。复制槽的核心作用是:
- 保证发布者保留特定的WAL日志,直到订阅者确认接收和处理了对应的逻辑变更。
- 防止在复制过程中丢失数据。
- 创建逻辑复制槽的命令为:
SELECT * FROM pg_create_logical_replication_slot('slot_name', 'output_plugin');
5. 逻辑复制的优势
- 灵活性(选择性复制):可以选择复制特定表,而不是整个数据库实例。
- 数据过滤与转换:可以使用触发器、函数等工具对逻辑变更进行过滤或转换。
- 异构数据同步:由于是基于SQL层的操作,可以实现不同数据库实例之间的数据同步,甚至可以在PostgreSQL与其他数据库系统之间同步。
- 灵活扩展:发布者和订阅者的架构支持多个订阅者同时订阅一个发布,允许数据在多个位置分发。
- 实时复制:通过WAL日志和复制槽,逻辑复制能够实时同步数据,适用于高可用性系统。
6. 典型应用场景
- 多主复制:不同数据库实例之间的相互同步。
- 数据共享:将数据共享到多个数据中心或不同的用户实例。
- 在线升级:可以通过逻辑复制进行版本之间的无缝迁移和升级。
特性 | 流复制(Streaming Replication) | 逻辑复制(Logical Replication) |
---|---|---|
复制机制 | 基于 WAL 日志的物理级复制 | 基于 SQL 变更的行级复制 |
复制内容 | 整个数据库实例 | 可以选择特定的表或数据 |
备库的用途 | 只读备库(Hot Standby),用于故障转移 | 可以是独立的数据库,允许读写操作 |
延迟 | 低延迟 | 可能会有延迟,特别是在高负载下 |
适用场景 | 高可用性、故障转移 | 数据分发、选择性同步、双向复制 |
故障转移 | 支持快速故障转移 | 不适合用于故障转移 |
双向复制 | 不支持 | 可以实现双向复制(通过逻辑复制槽) |
配置复杂性 | 简单,直接同步整个实例 | 配置灵活,需定义发布-订阅模型 |