广告
返回顶部
首页 > 资讯 > 数据库 >PostgreSQL逻辑复制解密原理解析
  • 779
分享到

PostgreSQL逻辑复制解密原理解析

2024-04-02 19:04:59 779人浏览 独家记忆
摘要

目录1 概念与原理复制槽输出插件复制协议与消息开启流式传输WAL工作流程2 问题与演进问题一:Failover slot问题二:DDL同步问题三: 双向同步其他问题:3 应用与实践全量与增量同步自建实例迁移上云实践在数字

在数字化时代的今天,我们都认同数据会创造价值。为了最大化数据的价值,我们不停的建立着数据迁移的管道,从同构到异构,从关系型到非关系型,从云下到云上,从数仓到数据湖,试图在各种场景挖掘数据的价值。而在这纵横交错的数据网络中,逻辑复制扮演着及其重要的角色。让我们将视角从复杂的网络拉回其中的一个端点,从postgresql出发,对其逻辑复制的原理进行解密。

在数字化时代的今天,我们都认同数据会创造价值。为了最大化数据的价值,我们不停的建立着数据迁移的管道,从同构到异构,从关系型到非关系型,从云下到云上,从数仓到数据湖,试图在各种场景挖掘数据的价值。而在这纵横交错的数据网络中,逻辑复制扮演着及其重要的角色。

让我们将视角从复杂的网络拉回其中的一个端点,从Postgresql出发,对其逻辑复制的原理进行解密。

1 概念与原理

逻辑复制,是基于复制标识复制数据及其变化的一种方法。区别于物理复制对页面操作的描述,逻辑复制是对事务及数据元组的一种描述。

PostgreSQL逻辑复制解密原理解析

图-WAL数据流示例

如图所示,物理复制的数据流是对tablespace/database/filenode文件的块进行操作,而逻辑复制的内容是对元组进行描述。

接下来我们来看逻辑复制中的几个概念:

复制槽

复制槽是记录复制状态的一组信息。由于WAL(预写式日志)文件在数据真正落盘后会删除,复制槽会防止过早清理逻辑复制解析所需的WAL日志。在逻辑复制中,每个插槽从单个数据库流式传输一系列更改,创建复制槽需要指定其使用的输出插件,同时创建复制槽时会提供一个快照。

输出插件

输出插件负责将WAL日志解码为可读的格式,常用的插件用test_decoding(多用来测试),pGoutput(默认使用),wal2JSON(输出为json)。PostgreSQL定义了一系列回调函数,我们除了使用上述插件,可以通过回调函数编写自己的输出插件。

PostgreSQL逻辑复制解密原理解析

图-复制槽数据流

复制协议与消息

通过复制协议,我们可以从源端获取WAL数据流。例如通过PSQL工具建议复制连接

psql "dbname=postgres replication=database"

开启流式传输WAL

START_REPLICATION[ SLOT slot_name] [ PHYSICAL] XXX/XXX[ TIMELINE tli]

无论是物理复制,还是逻辑复制,使用PostgreSQL的发布订阅或者pg_basebackup搭建流复制,都是通过复制协议与定义的消息进行交互(物理复制和逻辑复制数据流内容不同)

PostgreSQL逻辑复制解密原理解析

图- WAL数据流消息类型

PostgreSQL逻辑复制解密原理解析

图-逻辑复制中的XLogData消息

工作流程

当我们了解了概念之后,来看一下整个解析的工作流程。由于WAL文件里一个事务的内容并不一定是连续的,所以需要通过Reorder后放在buffer中,根据事务ID组织成一条消息,COMMIT后发送给输出插件,输出插件解析后将消息流发送给目标端。

PostgreSQL逻辑复制解密原理解析

图-逻辑解析工作流程

2 问题与演进

当我们掌握了逻辑复制的原理,计划使用其构建我们的数据迁移应用之前,我们还有一些问题并没有解决。让我们来一起看看是什么亟待解决的问题,以及我们如何进行处理。

问题一:Failover slot

为了高可用性,数据库至少会存在一主一备的架构,当主库故障进行高可用切换时,备库却没有相应的复制槽信息,也就是缺少failover slot。这是由于保存slot信息的物理文件,未同步至备库。那么我们如何手动创建一个faliover slot呢?

1. 主库创建复制槽,检查备库wal文件是否连续

2. 复制包含slot信息的物理文件至备库,在pg_repslot目录下

3. 备库重启,重启后才可以看到复制槽信息,原因是读取slot物理文件的函数StartupReplicationSlots只会在postmaster进程启动时调用。

4. 定期查询主库slot状态,使用pg_replication_slot_advance函数推进备库复制槽

自此,我们在备库上也有了相应的信息,手动实现了failover slot。PostgreSQL生态中著名的高可用软件Patroni也是以这种方式进行了实现,区别只是在Patroni查询主库slot状态时将信息写入了DCS中,备库拿到DCS中的位点信息进行推进。

问题二:DDL同步

原生的逻辑复制不支持解析DDL语句,我们可以使用事件触发器来进行处理。

1. 使用事件触发器感知表结构变更,记录到DDL_RECORD表中,并将该表通过逻辑复制进行发布。

2. 接收端获取到该表的数据变更,即可处理为相应DDL语句进行执行。

PostgreSQL逻辑复制解密原理解析

图-事件触发器实现DDL同步

问题三: 双向同步

当数据迁移涉及双向同步的管道时,例如想实现双主双写,对数据库同一对象进行操作,就会出现WAL循环。

PostgreSQL逻辑复制解密原理解析

图-相同表双向同步导致数据循环

部分DTS应用为了解决这个问题会创建辅助表,在事务中先对辅助表进行操作,通过解析到对辅助表的操作而得知该记录是又DTS应用插入,从而过滤该事务,不再循环解析。PostgreSQL对事务提供了Origin记录,无须辅助表,通过pg_replication_origin_session_setup函数或者发布订阅中的replorigin_create即可指定Origin ID。

指定Origin ID后,我们除了可以解析后通过DTS应用进行过滤,还也可以通过解析插件中的FilterByOriginCB回调函数在解析过程中过滤,这种方式减少了数据传输,效率更高。

PostgreSQL逻辑复制解密原理解析

图-test_decoding中OriginFilter函数DEMO

其他问题:

除了以上三个问题,还有一些使用的问题或限制。这里列出了一些,不再展开,仅简要说明。

Toast处理:对于toast值(消息格式中可以判断),我们在处理时一般使用占位符进行处理,接收端接收到占位符就不对这一列进行处理,虽然有些麻烦,但这也是在和传输toast值的方案中权衡的结果。

心跳表:由于复制槽记录的XMIN是全局的,当我们发布的表一直没有更新时,XMIN没有推进导致WAL积压,我们可以创建一张心跳表,周期性写入数据并发布,使XMIN进行推进。

大事务延迟: 根据前文提到的工作流程我们可以知道默认事务在COMMIT后才会进行解析,这对于大事务来说势必会导致延迟,PG14版本提供了streamin模式进行解析,即事务进行中进行解析并发送至接收端。

3 应用与实践

前两节我们从原理及问题的角度对PostgreSQL进行了解密,接下来我们看如何通过我们掌握的逻辑复制原理,进行数据迁移的应用与实践。

全量与增量同步

在真实的数据迁移场景中,大部分都是全量和增量都要同步的场景,并且我们打通了数据传输的通道后,也对这条通道的安全,效率,以及功能的扩展,例如清洗,脱敏等ETL能力提出了新的要求。我们先来看一下如果实现全量与增量的同步。

PostgreSQL逻辑复制解密原理解析

图-数据流向示意图

主要流程包括:

1. 创建复制槽并导出快照

2. 根据快照进行全量数据迁移

3. 根据复制槽进行增量数据的迁移

我们使用了PG数据库或者消息队列MQ作为数据代理,全量与增量解析可以同时进行,当全量数据处理完毕后,状态机通知增量处理程序进行增量发布。而对于代理中的数据,可以在解析后进行预处理。

自建实例迁移上云实践

最后和大家分享一个自建实例迁移上云的实践,该案例是将自建的PG10版本实例迁移至京东云上的RDS PG 11版本,通过对增量数据的回流以及数据校验保证了数据安全与业务平稳切换。

PostgreSQL逻辑复制解密原理解析

图-数据迁移上云

DTS应用主要分为如下几个阶段:

1. 数据检查阶段: 检查主键,权限,配置

2. 数据迁移阶段: 结构,存量,增量数据迁移,监控迁移状态

3. 应用迁移阶段: 切换域名,引入流量

4. 回滚阶段: 增量数据回流,若出现问题可快速回滚。

到此这篇关于PostgreSQL逻辑复制解密原理解析的文章就介绍到这了,更多相关PostgreSQL逻辑复制解密内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

您可能感兴趣的文档:

--结束END--

本文标题: PostgreSQL逻辑复制解密原理解析

本文链接: https://www.lsjlt.com/news/34136.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • PostgreSQL逻辑复制解密原理解析
    目录1 概念与原理复制槽输出插件复制协议与消息开启流式传输WAL工作流程2 问题与演进问题一:Failover slot问题二:DDL同步问题三: 双向同步其他问题:3 应用与实践全量与增量同步自建实例迁移上云实践在数字...
    99+
    2022-09-21
  • PostgreSQL逻辑备份pg_dump使用及其原理解析
    一、原理分析 1、循环调用getopt_long解析命令行参数,将参数保存到static DumpOptions dopt;中2、判断参数是否相容,不相容则退出: options -s/--sche...
    99+
    2022-10-18
  • Java 逻辑控制详解分析
    目录顺序结构分支结构if 语句悬垂 else 问题switch 语句循环结构while 循环breakcontinuefor循环do while 循环顺序结构 顺序结构就是按照代码从...
    99+
    2022-11-12
  • Vue3 Reactive响应式原理逻辑详解
    目录前言一、怎么实现变量变化二、怎么实现变量变化三、将多个dep存储在Map中四、将多个object的depsMap继续存储起来五、核心六、源码解析(TypeScript)前言 本篇...
    99+
    2022-11-13
  • Spring Security密码解析器PasswordEncoder自定义登录逻辑
    目录一、PasswordEncoder密码解析器详解1.接口介绍2.内置解析器介绍3.BCryptPasswordEncoder简介4.代码演示二、自定义登录逻辑1.编写配置类2.自...
    99+
    2022-11-13
    Spring Security密码解析器 PasswordEncoder自定义登录逻辑
  • 深入理解PHP trait DTO的实现原理与核心逻辑
    引言:在PHP编程中,对象的数据传输对象(Data Transfer Object)在实际开发中起到了非常重要的作用。特别是在复杂的应用中,数据传输对象可以简化代码结构、提高代码可读性和可维护性。本文将深入探讨PHP中使用trait来实现数...
    99+
    2023-10-21
    实现原理 PHP trait(特质) DTO(数据传输对象)
  • 详解Redis复制原理
    目录前言一.配置与实践配置实践只读二.工作原理三.数据同步全量复制部分复制前言 本文主要介绍Redis复制机制 一.配置与实践 配置 Redis实例分为主节点(master)和从节...
    99+
    2022-11-12
  • monogdb复制原理详解
    一、复制介绍复制是在多台服务器之间同步数据的过程。 复制在为数据提供了冗余同时,也提高了数据的可用性。由于在不同的数据库服务器上拥有多个数据镜像,复制可以有效的防止由于单台服务器故障而导致的数据丢...
    99+
    2022-10-18
  • jsjiami.v6解密原理示例分析
    正文 JS加密是Web前端开发中常用的一种技术,可以用于保护敏感数据或者代码,避免被恶意攻击者窃取或篡改。其中,JS加密库JSJiami.v6是一款广受欢迎的JS加密库,下面我们...
    99+
    2023-05-16
    jsjiami.v6解密分析 jsjiami.v6 解密
  • 无UI 组件Headless框架逻辑原理用法示例详解
    目录概述精读总结概述 Headless 组件即无 UI 组件,框架仅提供逻辑,UI 交给业务实现。这样带来的好处是业务有极大的 UI 自定义空间,而对框架来说,只考虑逻辑可以让自己更...
    99+
    2022-11-13
    无UI组件Headless框架逻辑  Headless组件原理
  • 详解MySQL执行原理、逻辑分层、更改数据库处理引擎
    用了那么长时间的MySQL,sql语句相信早已烂熟于心,于是,我就试着去了解它的执行原理,以下是我学习过程中的总结要点。 只要是B/S架构,都是会有客户端与服务端,mysql也不例外。 首先客户端发出一个请...
    99+
    2022-10-18
  • Android6.0 消息机制原理解析
    消息都是存放在一个消息队列中去,而消息循环线程就是围绕这个消息队列进入一个无限循环的,直到线程退出。如果队列中有消息,消息循环线程就会把它取出来,并分发给相应的Handler进...
    99+
    2022-06-06
    消息机制 Android
  • SpringbootFatJa原理机制源码解析
    目录一、概述二、标准的 jar 包结构三、探索JarLauncher3.1 只能拷贝出来一份儿3.2 携带程序所依赖的jar而非仅class四、 自定义类加载器的运行机制4.1 指定...
    99+
    2022-12-26
    Springboot FatJa原理机制 Springboot FatJa
  • zookeeper的watch机制原理解析
    目录一、Watch机制介绍二、zkCli客户端使⽤watch2.1、get -w命令详解2.2、ls -w命令详解2.3、ls -R -w命令详解三、curator客户端使⽤watc...
    99+
    2022-11-13
  • AndroidRecyclerView缓存复用原理解析
    目录一、牵出缓存1.缓存还在屏幕内的ViewHolder——Scrap缓存mAttachedScrapmChangeScrap用一个例子说明2.缓存屏幕之外的...
    99+
    2022-11-13
    Android RecyclerView缓存复用 Android RecyclerView
  • MySQL复制优点、原理详解
    复制是将主数据库的DDL和DML操作通过二进制日志传到从库上,然后再从库重做,从而使得从库和主库保持数据的同步。MySQL可以从一台主库同时向多台从库进行复制,从库同时也可以作为其他从库的主库,实现链式复制...
    99+
    2022-10-18
  • 如何解析Redis中的集群主从复制原理
    这篇文章将为大家详细讲解有关如何解析Redis中的集群主从复制原理,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。 本篇文章带大家...
    99+
    2022-10-19
  • MySQL主从复制原理解析与最佳实践过程
    目录一、主从复制1、复制的基本原理2、复制的基本原则 二、最佳实践1、ping测试2、主服务器配置3、从服务器配置4、主服务器设置5、从服务器设置6、主从测试7、关闭slave总结一、主从复制 1、复制的基本原理 主要涉...
    99+
    2023-05-16
    MySQL主从复制原理解析 MySQL主从复制 MySQL主从复制实践
  • MySQL数据库锁机制原理解析
    在并发访问情况下,很有可能出现不可重复读等等读现象。为了更好的应对高并发,封锁、时间戳、乐观并发控制(乐观锁)、悲观并发控制(悲观锁)都是并发控制采用的主要技术方式。 锁分类 ①、按操作划分:DML锁,DDL锁 ...
    99+
    2022-05-21
    MySQL 数据库 锁机制
  • MySQL索引长度限制原理解析
    这篇文章主要介绍了MySQL索引长度限制原理解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 索引 TextField是不支持建立索引的 MySQL对...
    99+
    2022-10-18
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作