PgSQL · PostgreSQL 逻辑流复制技术的秘密

本文涉及的产品
云原生数据库 PolarDB MySQL 版,Serverless 5000PCU 100GB
云原生数据库 PolarDB 分布式版,标准版 2核8GB
云数据库 RDS MySQL Serverless,0.5-2RCU 50GB
简介: 自 PostgreSQL 9.4 ,终于支持了逻辑流复制。本篇文章为大家带来这部分的技术细节的分析。1. 背景PostgreSQL 9.4 对逻辑流复制的支持具有相当的意义。我们可以用该技术完成很多企业级的需求。PostgreSQL 的大版本升级,由于可以使用流复制做增量数据同步,所以停机服务时间会非常短。 PostgreSQL 自定义逻辑拆库。由于是逻辑数据,所以很容易自定义分发

自 PostgreSQL 9.4 ,终于支持了逻辑流复制。本篇文章为大家带来这部分的技术细节的分析。

1. 背景

PostgreSQL 9.4 对逻辑流复制的支持具有相当的意义。我们可以用该技术完成很多企业级的需求。

  1. PostgreSQL 的大版本升级,由于可以使用流复制做增量数据同步,所以停机服务时间会非常短。
  2. PostgreSQL 自定义逻辑拆库。由于是逻辑数据,所以很容易自定义分发规则。例如按表拆,逻辑分表,白名单,黑名单等等。
  3. PostgreSQL 增量同步到其他异构数据库,例如 PG 同步到 Mysql;PG 同步到 Oracle。
  4. 逻辑主备同步,逻辑多节点同时可写集群。

2. 名词解析

Logical Decoding PostgreSQL 的逻辑日志来源于解析物理 WAL 日志。
解析 WAL 成为逻辑数据的过程叫 Logical Decoding。
Replication Slots 保存逻辑或物理流复制的基础信息。类似 Mysql 的位点信息。
一个 逻辑 slot 创建后,它的相关信息可以通过 pg_replication_slots 系统视图获取。
如果它在 active 状态,则可以通过系统视图 pg_stat_replication 看到一些 slot 的实时的状态信息。
Output Plugins PostgreSQL 的逻辑流复制协议开放一组可编程接口,用于自定义输数据到客户端的逻辑数据的格式。
这部分实现使用插件的方式被内核集成和使用,称作 Output Plugins。
Exported Snapshots 当一个逻辑流复制 slot 被创建时,系统会产生一个快照。客户端可以通过它订阅到数据库任意时间点的数据变化。

3. 逻辑流复制输出的数据格式

Logical Decoding 是把 WAL 日志解析成逻辑日志的过程。这个过程输出的是数据格式可以描述为:

  1. 事物开始 任何的变化总是在一个事物中,所以订阅的数据变化的开始是是一个事物被启动的消息,他包括了事物 ID,LSN,开始时间等信息。
  2. 数据的变化 包括当前事物中修改的数据。即对某些表的 insert update delete 操作来带的数据变化。
    • 一个事物内可以包含任意个表和任意行数据的变化。
    • 输出的数据的格式和对应表的定义和索引相关,详细信息看后面文章的描述。
  3. 事物的提交 包括事物提交的 LSN,时间等相关信息。

4. Output Plugins 需要完成的工作

上一节的内容提到的数据需要通过 Output Plugins 确定最终的数据格式,再发送给客户端。

这部分的接口表现为下列回调函数:

  1. LogicalDecodeStartupCB startup_cb;
  2. LogicalDecodeBeginCB begin_cb;
  3. LogicalDecodeChangeCB change_cb;
  4. LogicalDecodeCommitCB commit_cb;
  5. LogicalDecodeShutdownCB shutdown_cb;

函数 1,5 是分配和清理插件所需的内存结构。此外的 2,3,4 三个回调函数完全对应上一节中的三个部分。
开发者可以根据需求实现这一组函数。

4.1 技术细节

毫无疑问,定制逻辑数据格式成为了 Output Plugins 的关键。根据不同的需求产生的数据也会有显著的不同。

  1. 发送的数据可以是普通字符串,也可以是二进制字符串。为了客户端解析数据更容易,通常使用二进制字符串表达数据。
  2. 如果做同构数据库数据同步,传输的数据可以比较简单。原因是可以使用内部数据直接表达变化的数据。
  3. 如果要做异构数据库同步,情况会复杂一些。目前的方案是把增量数据组合成通用 SQL,再写入到异构数据库中。这样就需要给出转换数据成 SQL 语句的所有信息。在变化的数据本身外,还需要包括表名,列名,列数据类型,索引信息等等。
  4. 针对不同数据库的特殊字符,还需要处理转译字符的问题。
  5. 针对表中的长字段,需要优化。如果不修改这些大字段,可以选择不传输它们。

4.2 REPLICA IDENTITY 如何影响数据的格式

逻辑流复制利用索引的方式优化传输数据的效率,它们可以按表为单位定制。大致分为三种情况:

  1. 如果修改的表有 primary key, 则表的变化的逻辑数据只会包括该表变化的列和pk列数据,如果 pk 列被修改,则还会输出老的 pk 列数据。
  2. 如果修改的表没有 primary key,则可以使用 alter table 指定一个 REPLICA index,同时需要这个索引列为非空,其产生的效果和 1 相同。
  3. 如果修改的表不满足上面的两个条件,而又要做同步,可以使用 alter table 设置这个表的 REPLICA IDENTITY 为 FULL。于是系统在表修改时会记录修改行的所有列,不会做任何的优化。

很明显,给对应的表设置 PK 或指定索引,在数据同步时效率更高。我们可以安需定制同步策略。在实现功能的过程中需要考虑这部分变化。

5. 总结

逻辑流复制特性对 PostgreSQL 意义重大,目前已经有很多相关的数据同步产品应运而生,比如 2nd quadrant 公司的 BDR/UDR。也有公司调整了已有产品原有的技术方案,使用逻辑流复制为增量数据的同步方案,比如 EDB 公司的 xDB。阿里云 RDS 团队也利用该特性推出了 PostgreSQL 的数据迁移服务,并且开源了相关代码。
最后,我们期待更多相关产品的出现。
谢谢!

相关实践学习
使用PolarDB和ECS搭建门户网站
本场景主要介绍基于PolarDB和ECS实现搭建门户网站。
阿里云数据库产品家族及特性
阿里云智能数据库产品团队一直致力于不断健全产品体系,提升产品性能,打磨产品功能,从而帮助客户实现更加极致的弹性能力、具备更强的扩展能力、并利用云设施进一步降低企业成本。以云原生+分布式为核心技术抓手,打造以自研的在线事务型(OLTP)数据库Polar DB和在线分析型(OLAP)数据库Analytic DB为代表的新一代企业级云原生数据库产品体系, 结合NoSQL数据库、数据库生态工具、云原生智能化数据库管控平台,为阿里巴巴经济体以及各个行业的企业客户和开发者提供从公共云到混合云再到私有云的完整解决方案,提供基于云基础设施进行数据从处理、到存储、再到计算与分析的一体化解决方案。本节课带你了解阿里云数据库产品家族及特性。
目录
相关文章
|
关系型数据库 流计算 PostgreSQL
关于PostgreSQL逻辑订阅中的复制状态
关于PostgreSQL逻辑订阅中的复制状态
2422 0
|
3月前
|
SQL 关系型数据库 分布式数据库
PolarDB for PostgreSQL逻辑复制问题之逻辑复制冲突如何解决
PolarDB for PostgreSQL是基于PostgreSQL开发的一款云原生关系型数据库服务,它提供了高性能、高可用性和弹性扩展的特性;本合集将围绕PolarDB(pg)的部署、管理和优化提供指导,以及常见问题的排查和解决办法。
|
5月前
|
存储 人工智能 关系型数据库
postgresql从入门到精通教程 - 第36讲:postgresql逻辑备份
postgresql从入门到精通教程 - 第36讲:postgresql逻辑备份
146 1
|
10月前
|
监控 关系型数据库 API
PostgreSQL 13、14中逻辑复制/解码改进
PostgreSQL 13、14中逻辑复制/解码改进
131 0
|
10月前
|
存储 关系型数据库 分布式数据库
PostgreSQL 14中两阶段提交的逻辑解码
PostgreSQL 14中两阶段提交的逻辑解码
124 0
|
10月前
|
SQL 机器学习/深度学习 存储
PostgreSQL逻辑备份pg_dump使用及其原理解析
PostgreSQL逻辑备份pg_dump使用及其原理解析
182 0
|
存储 SQL 安全
2 PostgreSQL 物理,逻辑,进程结构以及系统表系统函数|学习笔记
快速学习2 PostgreSQL 物理,逻辑,进程结构以及系统表系统函数
316 0
2 PostgreSQL 物理,逻辑,进程结构以及系统表系统函数|学习笔记
|
存储 容灾 关系型数据库
7 PostgreSQL 物理备份和还原,逻辑备份和还原|学习笔记
快速学习7 PostgreSQL 物理备份和还原,逻辑备份和还原
985 0
7 PostgreSQL 物理备份和还原,逻辑备份和还原|学习笔记
|
关系型数据库 PostgreSQL
『PostgreSQL』PGSQL手动创建Sequence序列
📣读完这篇文章里你能收获到 - 在PostgreSQL中对Sequence的管理及使用
553 0
『PostgreSQL』PGSQL手动创建Sequence序列
|
关系型数据库 数据库 数据安全/隐私保护
【RDS PostgreSQL】逻辑订阅
RDS PostgreSQL提供逻辑订阅功能,支持在多个RDS PostgreSQL实例之间实现准实时表级单向同步,可以用于数据共享、数据汇总、数据拆分等业务场景。 如果您在全国多个地域部署业务,可以通过逻辑订阅共享数据,例如将中心数据共享给其他地域,或者将其他地域数据汇总到中心进行实时分析查询等。 本文简单介绍逻辑订阅的使用流程。
189 0
【RDS PostgreSQL】逻辑订阅

相关产品

  • 云原生数据库 PolarDB