PostgreSQL 逻辑复制模块(一)

这篇具有很好参考价值的文章主要介绍了PostgreSQL 逻辑复制模块(一)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前言

本文主要介绍 PostgreSQL 逻辑复制家族、核心技术、同步过程及同步原理,预知PostgreSQL 逻辑复制社区插件原理与功能、逻辑订阅处理流程解析、适应场景等等,点击PostgreSQL 逻辑复制模块(二)。

流复制

大家都知道Streaming Replication已经成为PostgreSQL的一部分,并且通常用于PostgreSQL的高可用和读写分离,流复制是基于 WAL 日志的物理复制,适用于整个数据库集簇的复制,并且备库是只读的。

流复制(物理复制)是一个更为传统数据同步方式,在 PostgreSQL 10 之前流复制承载了PostgreSQL主备之间数据同步的功能,它的实现方式是将wal日志中记录的内容按照确切的块地址逐字节的拷贝到备库,因此主备之间数据分布是一致的,这意味着在主备机器上,同一条记录的ctid是相同的。
PostgreSQL 逻辑复制模块(一)

1 PostgreSQL 逻辑复制介绍

在PostgreSQL 10版本中新增了一个逻辑复制的特性,逻辑复制是基于逻辑解析进行复制。它使用类似消息队列的发布者、订阅者的模型,利用复制槽的技术,发布者将wal日志解析成一定格式的数据流,订阅者对解析后的wal日志数据流进行回放应用,从而实现数据的同步。但是需要注意的是,PostgreSQL的逻辑复制不是“SQL”复制,而是复制SQL操作的结果。

1.1 逻辑复制家族

PostgreSQL 逻辑复制模块(一)
logical decoding是实现所有logical功能的核心技术,下面有对它的详细解释。跟这个核心技术一起加入PG内核的还有一个demo级别的功能test_decoding,但是test_decoding的输出结果看起来没有那么容易被二次开发使用,wal2json以一个 contrib 的形式出现,它的输出结果对二次开发更加友好。BDR和pglogical是实现了逻辑复制的插件,BDR特点是支持多主机、DDL复制、全局序列、全局DDL锁,pglogical特点是灵活性高、支持级联逻辑复制,在他们的基础上PG内核引入了logical replication,它实现了逻辑复制的功能,从使用方法来看logical replication与pglogical更为一致。

1.2 核心技术:logical decoding

PostgreSQL 逻辑复制模块(一)

walsender进程不断的从自己的复制槽中获取新产生的wal record,并通过内核中的LogicalDecodingProcessRecord()函数进行wal record的初步过滤和解析,解析结果为一个ReorderBufferChange结构的数据(对于DML语句而言这个结构里面主要的信息为oldtuple和newtuple),并将这个解析结果放置到当前事务ID对应的解析 buf 中去。当某个事务发生了提交,这个事务对应的buf里面的ReorderBufferChange会被指定的plugin做二次处理,并将处理结果按照指定的途径输出。

1.3 逻辑同步的过程

1.逻辑同步接收部分。是逻辑同步的接收端,接收 walsender 进程发送的报文进行解析。接收到的包,如果以 ‘k’ 开头,是保活通信包;如果是以 'w‘ 开头是 wal 日志包。包结构为:
messagetype[1]+datastart[8]+walEnd[8]+sendtime[8]+message

2.walsender 部分。是以进程的形式向逻辑同步接收端提供服务。负责后台各部分调度和接收端的通信。

3.slot 复制槽部分。对于解析 wal 日志的事务控制,保证事务发送的完整性。有以下几种操作,创建复制槽(逻辑解码动态库-插件的名称);删除复制槽;切换到下一事务;重新开始;从某个指宣的 lsn 开始。

4.逻辑解码部分。这部分将 wal 日志解析为各种形式,比如说标准 sql,倒排 sql 和其他需要方式。比如开源的有test_decoding 和 ali_decoding。pg 源码中也有一个 pgoutput 的默认格式。除了解析SQL外还在这块部分里添加发送包里的信息,比如说 xid(事务号),commit_lsn(commit的lsn)等。

5.wal 文件解析部分。这个部分是逻辑同步的最核心的部分,最主要的功能就是将 wal 日志以事务为单位进行整理。一个数据库集簇中的 wal 日志同时只有一份,在多并发和长事务的的操作下,wal 日志会出现交叉混打,wal 日志的事务的 lsn 不是顺序的。如果没有这个部分,基本上是不可读的。

2 PostgreSQL 逻辑复制原理

在wal日志产生的数据库上,由逻辑解析模块对wal日志进行初步的解析,它的解析结果为ReorderBufferChange(可以简单理解为HeapTupleData),再由pgoutput plugin对中间结果进行过滤和消息化拼接后,然后将其发送到订阅端,订阅端根据接收到的HeapTupleData重新对其执行insert、delete、update的操作。这里要注意,流复制是将数据从walrecord拷贝到数据页,逻辑复制是将数据重新执行一次insert、update或delete。

通俗的说:逻辑复制也是基于 WAL文件,在逻辑复制中把主库称为源端库,备库称为目标端数据库,源端数据库根据预先指定好的逻辑解析规则对WAL文件进行解析,把DML操作解析成一定的逻辑变化信息(标准SQL语句),源端数据库把标准SQL语句发给目标端数据库,目标端数据库接收到之后进行应用,从而实现数据同步。

PostgreSQL 逻辑复制模块(一)

3 流复制和逻辑复制对比

   1.流复制是对实例级别的复制(整个PostgreSQL数据库集簇);逻辑复制是选择性的复制一些表,是对表级别的复制。
   2.流复制主库上的事务提交可以不需要等待备库接收到WAL文件后的确认;逻辑复制相反。
   3.流复制要求主备库的大版本一致;逻辑复制可以跨大版本的数据同步,也可以实现异构数据库的数据同步。
   4.流复制的主库可读写,从库只允许读;逻辑复制的目标端数据库要求可读写。
   5.流复制有主库的DDL、DML操作,逻辑复制只有DML操作。

声明

因小编个人水平有限,专栏中难免存在错漏之处,请勿直接复制文档中的参数、命令或方法应用于线上环境中操作。

近期文章推荐
PostgreSQL体系结构(上)
PostgreSQL体系结构(下)
MySQL 如何响应 KILL 效果文章来源地址https://www.toymoban.com/news/detail-480769.html

到了这里,关于PostgreSQL 逻辑复制模块(一)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 什么是PostgreSQL?简要介绍其主要特点和用途

    PostgreSQL是一种开源的关系型数据库管理系统(DBMS),它是最强大和广泛使用的开源数据库之一。PostgreSQL的名称起源于其前身,称为\\\"Ingres\\\"项目,后来被命名为Postgres,而PostgreSQL则是它的进一步发展和完善的版本。 1.开源 : PostgreSQL是完全开源的,这意味着任何人都可以自由

    2024年02月15日
    浏览(71)
  • 【PCL自学:目录】PCL简介及主要功能模块介绍 (持续更新)

    当你知道一切都不重要时,世界就是你的了。 ——《瑞克和莫蒂》S3E8   对于从事计算机视觉、机器视觉领域的从业者来说,OpenCV库并不陌生,甚至是我们入门这个领域时的学习的第一个开源库,如果说OpenCV是二维信息处理方面的工兵铲,那PCL(Point Cloud Library)就是在三维

    2024年02月06日
    浏览(51)
  • PostgreSQL详细教程(一)—— 前言

    目录 PostgreSQL简介 PostgreSQL 特征   PostgreSQL 是一个免费的对象-关系数据库服务器(ORDBMS),在灵活的BSD许可证下发行。 PostgreSQL 开发者把它念作 post-gress-Q-L。 PostgreSQL 的 Slogan 是 \\\"世界上最先进的开源关系型数据库\\\"。 PostgreSQL与Oracle一样是使用共享内存的进程结构,而大家都比较

    2024年02月12日
    浏览(47)
  • uniapp富文本文字长按选中(用于复制,兼容H5、APP、小程序三端)

    方案:使用u-parse的selectable属性 u-parse :selectable=\\\"true\\\" :html=\\\"content\\\"/u-parse 注意:u-parse直接使用是不兼容小程序的,需要对u-parse进行改造: 1. 查看u-parse源码发现小程序走到以下逻辑:(没有传入selectable属性,需要将selectable传入trees组件) 改造前:  改造后: 2. 进入trees组件,

    2024年02月20日
    浏览(55)
  • 微软成为PostgreSQL主要贡献者

      微软对PostgreSQL贡献的很多新功能都来自于客户在使用微软Azure上的PostgreSQL管理实例数据库,所以这些新功能都来自于真实的客户需求 微软贡献的这些新功能都是比较实用的功能 在这里,【 真实的客户需求 】要突出一下,因为现在很多社区贡献者贡献的代码都不是从真实

    2024年02月03日
    浏览(42)
  • 外汇网站主要业务逻辑梳理

    上图为工行ICBC的外汇 保证金交易界面。 当需要买入帐户欧元(欧元人民币)时,买入100欧元,因为没有杠杆,虽然欧元中间价是782.34,但实际需要支付783.14元人民币的保证金,这个兑换不是真实的外汇兑换。银行只是将这些保证金扣除了,给您了一个100欧元的合约,这个合

    2024年02月02日
    浏览(37)
  • 将GPU版本的torch和torchvision下载至本地进行安装,解决torch.cuda.is_available()为False的情况,本文主要解决CPU版本的torch问题。

    这是困扰我很久的问题,今天花了一点时间去研究一下为什么我的cuda和cudann安装完成了,却不能使用GPU,原因是我的torch和torchvision是cpu版本的,必须下载GPU版本的才能使torch.cuda.is_available()为True,本文使用将文件下载到文件夹后进行安装。 1、打开Anaconda Prompt(Anaconda3)  2、打开

    2024年02月10日
    浏览(63)
  • PGSQL(PostgreSQL)数据库基础篇:PostgreSQL 的 主要优点 、 劣势 、体系结构 、核心功能 、安装教程。

    1.维护者是PostgreSQL Global Development Group,首次发布于1989年6月。 2.操作系统支持WINDOWS、Linux、UNIX、MAC OS X、BSD。 3.从基本功能上来看,支持ACID、关联完整性、数据库事务、Unicode多国语言。 4.表和视图方面,PostgreSQL支持临时表,而物化视图,可以使用PL/pgSQL、PL/Perl、PL/Python或其

    2024年04月26日
    浏览(65)
  • 1.前言和介绍

    从零学习算法部署-TensorRT篇 杜老师推出的 tensorRT从零起步高性能部署 课程,之前有看过一遍,但是没有做笔记,很多东西也忘了。这次重新撸一遍,顺便记记笔记 本次主要是对课程的内容和所需环境做一个简要的介绍 课程大纲可看下面的思维导图 本课程以 TensorRT 和 PyTor

    2024年02月13日
    浏览(56)
  • WebGL前言——WebGL相关介绍

    第一讲内容主要介绍WebGL技术和相应的硬件基础部分,在初级课程和中级课程的基础上,将技术和硬件基础进行串联,能够对WebGL从产生到消亡有深刻全面的理解。同时还介绍WebGL大家在初级课程和中级课程中的一些常见错误以及错误调试的办法。 先热身一下吧,看个问题:如

    2023年04月08日
    浏览(46)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包