PostgreSQL——逻辑复制

目录

1. 逻辑复制架构

2.关键技术概念

(1) WAL(Write-Ahead Logging)机制

(2) 逻辑复制插件

3. 复制过程

(1) 初始数据快照

(2) 持续数据变更捕获

(3) 数据同步与应用

4. 逻辑复制的组件

5. 逻辑复制的优势

6. 典型应用场景


PostgreSQL的逻辑复制(Logical Replication)是一种数据复制技术,允许数据库之间复制特定表或数据流,而不仅仅是物理复制的整个数据库块。与物理复制不同,逻辑复制是基于SQL层的,并且能够实现更精细的数据同步控制。其核心原理如下:

1. 逻辑复制架构

逻辑复制采用发布-订阅模型:

  • 发布者(Publisher)
    • 发布者是提供数据复制源的PostgreSQL实例。它定义了一个或多个“发布”(Publication),并包含需要同步到其他数据库的表或数据变更。发布者通过逻辑复制槽(Logical Replication Slot)将数据变更转换为逻辑变更流并发送给订阅者。
    • 发布内容可以包括INSERTUPDATEDELETE操作。
  • 订阅者(Subscriber)
    • 订阅者是从发布者接收数据并将其应用到自身数据库的PostgreSQL实例。它通过订阅(Subscription)来连接到发布者,并从发布者那里订阅逻辑变更流。
    • 订阅者接收到的数据可以被实时应用到其数据库中的表上,也可以通过应用触发器或其它自定义逻辑进一步处理这些变更。

通过这种模型,用户可以选择只复制某些表,而不是整个数据库实例的所有内容,也就是发布者和订阅者之间进行双向通信,多个订阅者也可以同时订阅一个发布者。

2.关键技术概念

(1) WAL(Write-Ahead Logging)机制

WAL机制确保在数据修改之前,将变更写入日志,以防止在崩溃后数据丢失。逻辑复制通过解析WAL日志获取逻辑操作,而物理复制则传递整个WAL日志。

(2) 逻辑复制插件

PostgreSQL中的逻辑复制依赖于逻辑复制插件(如 pgoutput),该插件能够解析WAL日志并将物理操作转换为逻辑变更流(SQL语句级别的变更)。

3. 复制过程

逻辑复制的工作流程可以分为以下几个步骤:

(1) 初始数据快照
  • 在订阅建立时,订阅者首先从发布者那里接收相关表的一个完整快照。这是一个一致的视图,确保订阅者在复制开始前拥有正确的数据基线。
(2) 持续数据变更捕获
  • 当初始快照传输完毕后,发布者将持续监控这些表的变更,并将每个变更记录到WAL日志中。逻辑复制插件会解析WAL日志,提取逻辑变更(INSERTUPDATEDELETE),并将这些变更打包成逻辑复制流。
(3) 数据同步与应用
  • 订阅者接收到逻辑复制流,并将这些变更按顺序应用到本地数据库的相应表上。数据变更可以实时或接近实时应用,确保订阅者与发布者的数据保持同步。

4. 逻辑复制的组件

  • Publication(发布)

           发布是由发布者定义的数据变更集合。每个发布可以包括多个表,发布的表也可以是不同的表(并非整个数据库)。在定义发布时,可以选择复制特定的DML操作类型,如INSERTUPDATEDELETE,具体步骤如下:

    • 使用命令 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),用于故障转移可以是独立的数据库,允许读写操作
延迟低延迟可能会有延迟,特别是在高负载下
适用场景高可用性、故障转移数据分发、选择性同步、双向复制
故障转移支持快速故障转移不适合用于故障转移
双向复制不支持可以实现双向复制(通过逻辑复制槽)
配置复杂性简单,直接同步整个实例配置灵活,需定义发布-订阅模型

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值