PostgreSQL 16 的新功能:双向逻辑复制

介绍

在这篇博客中,我们将讨论 Postgres 16 中新增的一些更高级的特性。假设您拥有一些 Linux、Postgres 和 SQL 的经验,因为我们不仅要讨论这些新功能,还要讨论如何实现它们。本博客是使用在 Ubuntu 23.04 上运行的 PostgreSQL 16(开发版本)编写的。首先,我将回顾一些背景知识并简要介绍什么是双向复制以及为什么它很重要,然后结束我们如何实现双向逻辑复制。

背景

在开始学习双向逻辑复制之前,我们首先必须了解逻辑复制。

逻辑复制基础知识

逻辑复制从 PostgreSQL 10 开始就得到支持,并在接下来的几年中得到了许多更新和改进。逻辑复制是将复制 表示为数据对象变更事件流。通过这种方式,我们可以仅复制表等对象的特定变更,而不是整个数据库,并跨不同平台和版本流式传输这些变更。这与物理复制形成鲜明对比,物理复制使用精确的块地址,因此仅限于复制整个数据库,并且不能跨平台或版本进行流式传输,因为数据必须在两者中匹配。

在这里插入图片描述

图 1:逻辑复制架构概述

逻辑复制还引入了实现 双向副本(Bi-Directional ) 所必需的两个非常重要的元素。它们是发布者和订阅者,你可以将它们视为领导者节点(发布者)和追随者节点(订阅者)。发布者将收集其最近的变更并将它们作为命令的有序列表发送给订阅者。一旦接收到,订阅者就会接受这一系列命令并将其应用于其数据。如果两个数据库都以相同的数据开始,则订阅服务器将与发布服务器保持同步。

双向复制

既然我们了解了逻辑复制是什么,那么双向复制有何不同之处呢?简而言之,双向逻辑复制是指复制中的所有节点既是发布者又是订阅者。现在,每个数据库都可以处理读取和写入请求,并且所有更改都将相互传输。这是双向的,因为变化不再像以前那样朝一个方向流动,而是朝两个方向流动。

在这里插入图片描述
图 2:双向复制架构概述

Postgres 16 添加了一个 WITH 语句的新参数,用于过滤掉某些节点的复制。双向逻辑复制使用此参数WITH(ORIGIN = NONE),这会过滤掉来自非NONE 源的连接的所有复制。本质上,这只允许复制新添加的数据,您可能会明白为什么会出现这种情况。如果一个数据库插入新数据并将其复制到第二个数据库,则第二个数据库将复制该数据并插入它,从而触发对原始数据库的另一次复制。我们很快就会得到无限的复制循环,这就是为什么这个选项对于保持一切有限是必要的。

好处

双向逻辑复制的主要好处是,由于我们有两个主节点,因此它可以为读取和写入请求提供更高的可用性。这对于特别需要写入的各种应用程序来说非常有益。

缺点

双向逻辑复制需要一些先决条件才能正确运行,因为它的许多缺点都来自这些特定条件。例如,在设置复制时,每个数据库中的表必须遵循相同的架构。相同的名称和列,否则订阅者将无法找到该表。在逻辑复制可以支持用于创建表的数据定义语言 (DDL) 的复制之前,用户必须手动执行此操作以确保一致性。

配置

现在我们了解了双向逻辑复制的基础知识,我们可以研究如何在两个数据库之间实现它。一开始与设置常规逻辑复制非常相似,但在创建发布者和订阅者时有一个非常重要的区别

首先,我们将创建两个相互跟随的主数据库:

$ initdb -D database1
$ initdb -D database2

在每个数据库的 postgres.conf 文件中,将每个数据库的 way_level 设置为逻辑级别,并为每个数据库指定一个唯一的端口号:

database1 的 postgres.conf配置

port = 5432
wal_level = logical

database2 的 postgres.conf 配置

port = 5433
wal_level = logical

启动两个数据库:

pg_ctl -D database1 -l database1.log start
pg_ctl -D database2 -l database2.log start

为每个数据库创建发布者:

 CREATE PUBLICATION mypub1 FOR TABLE mytable;CREATE PUBLICATION mypub2 FOR TABLE mytable;

为每个数据库创建订阅者:

 CREATE SUBSCRIPTION mysub1 CONNECTION 'host=127.0.0.1 port=5433 user=postgres dbname=postgres' PUBLICATION mypub2 WITH(ORIGIN = NONE);CREATE SUBSCRIPTION mysub2 CONNECTION 'host=127.0.0.1 port=5432 user=postgres dbname=postgres' PUBLICATION mypub1 WITH(ORIGIN = NONE); 

请注意我们创建发布者和订阅者的顺序,首先创建发布者然后创建订阅者非常重要。如果您想要更直观的表示,可以参考图 2,每个组件 角上的数字表示它们的创建顺序

现在,当任何数据插入任一数据库时,都应该在两个节点之间复制。

结论

在本博客中,我们回顾了 PostgreSQL 16 中新的双向逻辑复制功能。首先,我们回顾了逻辑复制和用于同步数据的发布者/订阅者模型的简要背景。然后,我们了解了双向逻辑复制的工作原理以及允许其在不触发无限复制循环的情况下运行的新参数。最后,我们研究了如何使用两个主 PostgreSQL 数据库设置双向复制。通过支持主节点之间的同步,对于任何数据库应用程序来说,提高可用性和数据持久性都应该变得轻而易举。

References 参考
C, Vigneshwaran. Bi-Directional Replication Using Origin Filtering in PostgreSQL, Fujitsu, 31 Aug. 2023, .
C、维涅什瓦兰。在 PostgreSQL 中使用源过滤的双向复制,富士通,2023 年 8 月 31 日

原文地址

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/342060.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

6.3、SDN在云计算中的应用

目录 一、SDN概念 1.1、传统网络机制 1.2、SDN网络机制 1.3、二者区别 1.4、SDN架构 二、云数据中心 2.1、公有云环境特点 2.2、两大挑战 2.3、云数据中心引入SDN技术解决两大挑战 三、SDN云计算解决方案 3.1、SDN云计算解决方案之控制平面openflow协议 3.1.…

python入门,字符串详解

目录 1.通过下标索引取值 ​编辑 2.index()方法 2.replace方法 3.split方法 4.strip方法 5.count统计某字符串出现次数 ​编辑 6.len统计字符串长度 7.字符串的遍历 ​编辑 字符串支持下标索引,从前往后从0开始,从后往前…

19. 从零用Rust编写正反向代理, 配置数据的热更新原理及实现

wmproxy wmproxy是由Rust编写,已实现http/https代理,socks5代理, 反向代理,静态文件服务器,内网穿透,配置热更新等, 后续将实现websocket代理等,同时会将实现过程分享出来&#xff…

数字图像处理练习题

数字图像处理练习题 文章目录 数字图像处理练习题第 一 章1.什么是数字图像?2.数字图像有哪些特点?3.数字图像处理的目的是什么?4.简述数字图像的历史。5.数字图像有哪些主要应用?6.列举生活中数字图像的获得途径。7.结合自己的生活实例,举出一个数字图像的应用实例8.数字图…

Unity——VContainer的依赖注入

一、IOC控制反转和DI依赖倒置 1、IOC框架核心原理是依赖倒置原则 C#设计模式的六大原则 使用这种思想方式,可以让我们无需关心对象的生成方式,只需要告诉容器我需要的对象即可,而告诉容器我需要对象的方式就叫做DI(依赖注入&…

centos8部署MySQL5.7故障集

转载说明:如果您喜欢这篇文章并打算转载它,请私信作者取得授权。感谢您喜爱本文,请文明转载,谢谢。 在centos8系统上安装MySQL,使用的是centos7上安装MySQL的脚本,出现了以下问题,以做记录&…

工程监测仪器振弦采集仪的应用及技术研究

工程监测仪器振弦采集仪的应用及技术研究 振弦采集仪是一种常用于工程监测的仪器,主要用于测量振动信号的频率、振幅及相位等参数。其应用和技术研究主要包括以下几个方面: 1. 结构监测:振弦采集仪可以用于对建筑物、桥梁、塔楼等结构物的振…

格密码:如何找最近的格点(CVP问题)

目录 一. 摘要 二. 介绍 2.1 简单的CVP问题 2.2 Gram-Schmidt向量 2.3 KZ基 三. 格密码的基本符号 四. CVP问题的发展 五. 如何解决CVP问题 5.1 随机取整算法 5.2 Babai算法随机取整 5.3 小结 六. 推荐论文 一. 摘要 本文章将解释如何利用随机取整算法&#xff08…

设计模式-数据映射模式

设计模式专栏 模式介绍模式特点应用场景技术难点代码示例Java实现数据映射模式Python实现数据映射模式 数据映射模式在spring中的应用 模式介绍 数据映射模式是一种将对象和数据存储映射起来的数据访问方式。具体来说,对一个对象的操作会映射为对数据存储的操作。这…

应急管理蓝皮书 |《应急预案数字化建设现状和发展建议》上篇

《应急预案数字化建设现状和发展建议》:297-313页 导读:《中国应急管理发展报告》系列蓝皮书由中央党校(国家行政学院)应急管理培训中心(中欧应急管理学院)联合社会科学文献出版社研创出版,本着…

2023一带一路暨金砖国家技能发展与技术创新大赛“网络安全”赛项省选拔赛样题卷②

2023金砖国家职业技能竞赛"网络安全" 赛项省赛选拔赛样题 2023金砖国家职业技能竞赛 省赛选拔赛样题第一阶段:职业素养与理论技能项目1. 职业素养项目1. 职业素养项目2. 网络安全项目3. 安全运营 第二阶段:安全运营项目1. 操作系统安全配置与加…

electron+vue网页直接播放RTSP视频流?

目前大部分摄像头都支持RTSP协议,但是在浏览器限制,最新版的浏览器都不能直接播放RTSP协议,Electron 桌面应用是基于 Chromium 内核的,所以也不能直接播放RTSP,但是我们又有这个需求怎么办呢? 市场上的方案…