PostgreSQL PG16 逻辑复制在STANDBY 上工作 (译)

news2024/11/15 15:31:00

220abc917de44171f19eb7fb5dccb746.png

开头还是介绍一下群,如果感兴趣polardb ,mongodb ,mysql ,postgresql ,redis 等有问题,有需求都可以加群群内有各大数据库行业大咖,CTO,可以解决你的问题。加群请联系 liuaustin3 ,在新加的朋友会分到2群(共1100人左右 1 + 2 + 3)新人会进入3群

Postgres 16刚刚发布了测试版,我对其中的新功能非常兴奋。该新功能允许从待命服务器进行逻辑复制,用户可以:

从只读的待命服务器创建逻辑解码 减轻主服务器的工作负载 采用新的方式为需要在多个系统之间进行数据同步或审核的应用程序提供高可用性 第二个相关且令人兴奋的新功能是,在给定的待命服务器上的复制槽将持久化到将该待命服务器提升为主服务器。这意味着在主服务器故障并将待命服务器提升为主服务器时,复制槽将持久存在,并且之前的待命服务器订阅者不会受到影响。

这两个功能结合在一起,极大地提高了PostgreSQL在处理大数据操作时的性能。适用于在物理位置之间移动数据的应用程序,以及进行数据仓库、分析、数据集成和业务智能的人员。我将演示一个示例模式和数据库设置,并提供一些用于从待命服务器创建逻辑复制的示例设置和代码。

Background on replication

在高层次上,PostgreSQL支持两种主要类型的复制:流式/物理复制和逻辑复制。Write-Ahead Log(WAL)可以通过连接流式传输整个物理文件集,并表示磁盘上完整的数据库。逻辑复制提供了一种更精细的方法,您可以指定要复制到远程服务器的单个数据库对象,如表甚至特定行。您可以在《Data To Go: Postgres Logical Replication》中了解更多关于逻辑复制基础知识。

PostgreSQL通过对主服务器进行基本备份并持续应用主服务器上的所有更改来创建待命服务器。热待命服务器是可以升级为主服务器的待命服务器。PostgreSQL将修改保存在Write-Ahead Log(WAL)记录中,并将其从主服务器复制到待命服务器。配置参数hot_standby_feedback可以防止主服务器过早删除目录行,以便待命服务器可以使用它们。

逻辑解码从待命服务器开始于2018年。这个过程涉及了许多复杂的细节,需要大量的努力。不容忽视的是,这个过程已经经历了5年的发展,我们非常兴奋地看到它在Postgres 16中发布。

f89589f0f9d349f03f563e86745516d8.png

举个例子,我们有三个不同的PostgreSQL服务器,管理着一家全球物流公司在全球各地分布的仓库的库存信息。在主服务器上,我们有仓库和库存信息,备用服务器是一个物理副本高可用性机器,还有一个用于报告目的的第三个服务器,它正在获取特定的更改。

db85bc10b2b9caa2a62257be322c72ee.png

在您的主实例中,您需要具有复制特权的用户。对于这个例子,我创建了一个用户将更改流向备用服务器,另一个用户将更改发布给订阅者。

CREATE ROLE repuser WITH REPLICATION LOGIN ENCRYPTED PASSWORD 'somestrongpassword';
CREATE ROLE pubuser WITH REPLICATION LOGIN ENCRYPTED PASSWORD 'differentstrongpassword';

接下来,我创建一个物理插槽来将更改从主服务器复制到备用服务器。严格来说,这并不是必需的,但在实践中真的是必要的。如果没有物理复制插槽,任一节点的重启或连接丢失都会中断复制过程:

SELECT pg_create_physical_replication_slot('hot_standby_1');

我们只关心Salt Lake City仓库的库存,其代码为SLC。在主服务器上,我们将创建一个名为inventory_requirements的发布,用于涉及库存表的表,还有一个名为inventory_slc_pub的发布:

069dcfa3e389990e37c809a8830324ca.png

CREATE PUBLICATION inventory_requirements_pub
FOR TABLE regions, countries, warehouses, products;

CREATE PUBLICATION inventory_slc_pub
FOR TABLE inventory WHERE (warehouse = 'SLC1');

GRANT SELECT ON TABLE regions, countries, warehouses, products, inventory
TO pubuser;

现在我可以创建我的备用实例。我们将使用pgBackRest(也可以使用pg_basebackup)来初始化备用实例。一旦你的备用数据目录已经恢复,你将需要编辑它的postgresql.conf并确保它有一些参数(如此文档中所述):tream standby about

# queries currently executing on this standby
hot_standby_feedback = on

# Use the physical replication slot we created previously
primary_slot_name = 'hot_standby_1'

hot_standby = on
archive_mode = on

# If level is changed to below logical, slots will be dropped
wal_level = logical

# standby streams changes from the primary
primary_conn_info = 'host=127.0.0.1 port=5432 user=repuser password=somestrongpassword'

max_wal_senders = 10  # max number of walsender processes
max_replication_slots = 10  # max number of replication slots

# If an upstream standby server is promoted to become the new
# primary, downstream servers will continue to stream from
# the new primary
recovery_target_timeline = 'latest'

连接到该备用实例将确认它处于只读模式:

SELECT pg_is_in_recovery();
 pg_is_in_recovery
-------------------
 t

此时,我们已经具有一个通过物理插槽从主实例复制到一个设置了hot_standby_feedback = on的工作备用实例。命名为inventory_requirements_pub和inventory_slc_pub的发布。

从standby 中进行逻辑复制

现在,我们可以转到我们的报告 PostgreSQL 实例并从备用实例订阅更改。在 PostgreSQL 16 之前,此操作将失败。

逻辑复制的一个主要优点是您可以从不同版本的 PostgreSQL 服务器订阅更改!这在处理使用不同版本的 PostgreSQL 的应用程序时为您提供了很大的灵活性。

CREATE SUBSCRIPTION inventory_requirements_sub
CONNECTION 'dbname=inventory host=127.0.0.1 port=5434 user=pubuser password=differentstrongpassword'
PUBLICATION inventory_requirements_pub;

CREATE SUBSCRIPTION inventory_slc_sub
CONNECTION 'dbname=inventory host=127.0.0.1 port=5434 user=pubuser password=differentstrongpassword'
PUBLICATION inventory_slc_pub;

如果您的主服务器处于空闲状态,此操作将挂起。这是因为备用实例正在等待来自主实例的信息。您可以通过在主实例上调用新函数pg_log_standby_snapshot()来加快创建此信息的速度。在此示例中,我们会调用两次,因为我们要创建两个订阅。

这将允许副本继续,并生成如下的消息,告诉我们在备用实例上创建了一个复制槽。在 PostgreSQL 16 中进行了改进!

我们可以在备用实例上通过访问pg_stat_replication系统视图来验证这一点。

一旦更改被复制到备用实例,它们将被下游复制到报告服务器,并且我们将在那里看到这些更改。请注意,只有SLC1的记录会被复制。

SELECT pg_log_standby_snapshot();
pg_log_standby_snapshot
-------------------------

0/23000180

NOTICE:  created replication slot "inventory_requirements_sub" on publisher
CREATE SUBSCRIPTION
SELECT pid, application_name, state, sync_state FROM pg_stat_replication;

  pid  |      application_name      |   state   | sync_state
-------+----------------------------+-----------+------------
 23265 | inventory_slc_sub          | streaming | async
 23251 | inventory_requirements_sub | streaming | async
(2 rows)
SELECT * FROM inventory ORDER BY product_id;
 warehouse | product_id | quantity
-----------+------------+----------
 SLC1      |         11 |        7
 SLC1      |         13 |       13
 SLC1      |         15 |       18
 SLC1      |         22 |       15
 SLC1      |         24 |       20

从这里,如果需要的话,我可以创建多个逻辑复制副本,用于不同的位置和仓库。

正如我们之前所看到的,当我们创建订阅连接到备用服务器时,它会在不可写的备用服务器上创建复制槽。如果我们的主服务器发生灾难性故障,备用服务器被提升为主服务器,那么会发生什么情况呢?不同的仓库会停止接收更改,因为无法再从原本的备用服务器上获取更改,它无法与新的主服务器进行通信。

97db17927ab49df11ddcd6e66a313576.png

在Postgres 16中,复制槽在故障切换后是持久化的,这非常令人兴奋!我们之前的备用服务器被提升为主服务器,复制槽的故障切换被保留下来,我们的订阅者继续接收更改,就好像什么都没有发生过一样!

在我们的数据仓库报表PostgreSQL服务器上,订阅了我们现在的主服务器,对库存表的更改出现了,而不需要采取任何其他操作(确保您要逻辑复制的表设置了REPLICA IDENTITY):

SELECT pg_promote();
 pg_promote
------------
 t
(1 row)

SELECT pg_is_in_recovery();
 pg_is_in_recovery
-------------------
 f
(1 row)

UPDATE inventory SET quantity = 2
WHERE warehouse = 'SLC1' and product_id = 11;
UPDATE 1
SELECT * FROM inventory WHERE warehouse = 'SLC1' order by product_id;

 warehouse | product_id | quantity
-----------+------------+----------
 SLC1      |         11 |        2
 SLC1      |         13 |       13
 SLC1      |         15 |       18
 SLC1      |         22 |       15
SLC1      |         24 |       20

随着越来越多的人选择使用Postgres作为数据库,支持更丰富的数据流选项在Postgres中继续出现是有道理的。从几年前开始,逻辑复制从备库中继续建立,经过多次增强。由于PostgreSQL社区的出色工作,在PG 16中,备服用户将能够:

创建逻辑复制槽 启动逻辑解码 订阅备库的更改 故障切换后持久化逻辑复制槽 备库将能够作为逻辑复制订阅者的源进行服务,只需进行很少的更改:

开启hot_standby_feedback = on 使用物理复制槽从上游复制到备库 如果订阅者在向备库创建订阅时等待更改而发生停顿,则在主服务器上运行pg_log_standby_snapshot()。这个新功能的文档仍在编写和改进中,我将利用自己的所学来提交改进。

456ac7ddc74c6ad8e7cf8cbf93d4adcb.png

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Ubuntu18.04免密码登录SSH】

Ubuntu18.04免密码登录SSH 1 查看Ubuntu18.04系统中是否存在SSH服务2 配置SSH2.1 先删除一下ssh的目录,重新配置2.2 生存公钥和私钥2.3 将公钥上传到需要登录的服务器2.4 测试登录 1 查看Ubuntu18.04系统中是否存在SSH服务 sudo ps -e |grep ssh没有的话&#xff0…

【Vue3+Ts+Vite】配置滚动条样式

一、先看效果 二、直接上代码 <template><div class"main-container"><h1 v-for"index in 50" :key"index">这是home页面</h1></div> </template> <style lang"scss" scoped> .main-conta…

Stephen Wolfram:类似人类任务的模型

Models for Human-Like Tasks 类似人类任务的模型 The example we gave above involves making a model for numerical data that essentially comes from simple physics—where we’ve known for several centuries that “simple mathematics applies”. But for ChatGPT w…

SSTI学习的笔记(橙子)

放心&#xff0c;我会一直陪着你 一.在终端的一些指令1.虚拟环境2.docker容器 二.SSTI相关知识介绍1.魔术方法2.python如何执行cmd命令3.SSTI常用注入模块(1)文件读取(2)内建函数eval执行命令(3)os模块执行命令(4)importlib类执行命令(5)linecache函数执行命令(6)subprocess.Po…

暖手宝UL认证 亚马逊UL测试报告 UL499测试项目

UL499测试内容&#xff1a;1、 漏电流测试 2、 输入测试 3、 潮态下漏电流测试4、正常温升测试 5、 耐高压测试 6、 稳定性测试7、异常测试&#xff08;DRY&#xff09;8、 异常测试  9、 静压及强度测试10、 烧熔断器测试、 电源线拉力测试11、 电源线推力测试12、 塑件变…

二、前端高德地图、渲染标记(Marker)引入自定义icon,手动设置zoom

要实现这个效果&#xff0c;我们先看一下目前的页面展示&#xff1a; 左边有一个图例&#xff0c;我们可以方法缩小地图&#xff0c;右边是动态的marker标记&#xff0c;到时候肯定时候是后端将对应的颜色标识、文字展示、坐标点给咱们返回、我们肯定可以拿到一个list&#xf…

怎么清空电脑回收站?教您这三招(附上清空的回收站数据怎么恢复教程)

电脑回收站是一个临时存放被删除文件的地方&#xff0c;如果不清空回收站&#xff0c;这些文件仍然占用磁盘空间。清空回收站可以释放这些空间&#xff0c;提高磁盘的可用空间。那么&#xff0c;怎么清空电脑回收站的东西呢&#xff1f;清空的回收站数据怎么恢复呢&#xff1f;…

ICMP隐蔽隧道攻击分析与检测

• ICMP隧道攻击工具特征分析 一、原理 由于ICMP报文自身可以携带数据&#xff0c;而且ICMP报文是由系统内核处理的&#xff0c;不占用任何端口&#xff0c;因此具有很高的隐蔽性。 通过改变操作系统默认填充的Data&#xff0c;替换成自己构造的数据&#xff0c;这就是ICMP隐…

测试开发第一章、软件测试介绍

一、什么是软件测试 最常见的理解是:软件测试就是找BUG,发现缺陷。 软件测试就是验证软件产品特性是否满足用户的需求。 从这话我们可以看出以下两点: 测试试图验证软件是“工作的”,也就是验证软件功能执行的正确性测试的活动是以测试人员“预期的结果”为依据,这里的…

centos7 部署 k8s 1m2n

1 系统环境准备 1.1 安装所需工具 yum -y install vim yum -y install wget# 设置yum源 mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup wget -O /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo1.2 修改…

【性能优化篇】.ttf字体包过大引起的网页加载过慢 font-spider 压缩字体包 适用于任何前端项目

背景 项目使用的是阿里巴巴普惠2.0字体&#xff0c;型号分别是 35-thin 和 45-light 这两个字体包 都是 8mb 左右 本地加载的时候可能速度不会收影响&#xff0c;发到生产和测试环境下&#xff0c;速度会很慢&#xff0c;尤其是测试环境&#xff0c;字体包加载了一分钟&#…

详细分析Python中运算符“==“和“is“的区别

目录 Python中运算符"" Python中运算符"is" ""和"is"的区别 总结 Python中运算符"" 在Python中&#xff0c;双等号运算符"" 用于比较两个值是否相等。它返回一个布尔值&#xff0c;即True或False&#xff0c;…

自动完成网页局部区域截图的方法

一般网页包含标题、导航、正文、图片、广告、外链等内容&#xff0c;但只有正文内容对我们才有价值&#xff0c;或者我们只关心其中的数据分析图表。希望把网页有价值的区域截图下来&#xff0c;在手工截图时&#xff0c;可以利用截图工具选择截图区域&#xff0c;那么能自动截…

如何评估自动化测试脚本的编写时间和维护工作量?

一、如何评估自动化测试脚本的编写时间和维护工作量&#xff1f; 评估自动化测试脚本的编写时间和维护工作量是一个复杂的过程&#xff0c;需要综合考虑以下因素&#xff1a; 脚本复杂性&#xff1a;评估脚本的复杂性&#xff0c;包括测试需求的复杂程度、涉及的功能和模块的复…

简单认识Redis 数据库的高可用

文章目录 一、Redis 高可用&#xff1a;1.简介&#xff1a;2、在Redis中实现高可用的技术 二、Redis持久化&#xff1a;1.持久化的功能&#xff1a;2.Redis 提供两种方式进行持久化&#xff1a; 三、RDB 持久化&#xff1a;1.简介&#xff1a;2.触发条件&#xff1a;4.启动时加…

LeetCode 2050. 并行课程 III:DFS

【LetMeFly】2050.并行课程 III&#xff1a;DFS 力扣题目链接&#xff1a;https://leetcode.cn/problems/parallel-courses-iii/ 给你一个整数 n &#xff0c;表示有 n 节课&#xff0c;课程编号从 1 到 n 。同时给你一个二维整数数组 relations &#xff0c;其中 relations[…

jpa生成实体类,jpa根据数据库表生成实体类

jpa生成实体类&#xff0c;jpa根据数据库表生成实体类jpa根据数据库表结构生成实体idea下SpringbootJPA从数据库自动生成实体类JPA用数据库表直接生成实体类Spring boot整合jpa(一),根据表生成实体IDEA下SpringData-JPA根据数据库表生成实体类idea怎么根据数据库表自动生成JPA实…

为什么你在用 ChatGPT 的提示词 Prompt 似乎效果不如人意?

“ 在使用ChatGPT的神奇提示词Prompt时&#xff0c;或许你会发现它的效果并不总是如人所愿。让我们看看其中的原因&#xff0c;以及如何避免这类问题。” 01 — 最近继续在研究以大模型人工智能LLM为大脑的专属知识库的开发技术。偶然看到这么一个智力游戏题目&#xff0c;让大…

HummerRisk V1.3.0 发布

HummerRisk V1.3.0发布&#xff1a; 大家好&#xff0c;HummerRisk 1.3.0和大家见面了&#xff0c;在这个版本中我们继续在多云接入管理、多云检测方式、云资源态势方面提供新的能力&#xff0c;并增加了新的镜像仓库支持类型&#xff0c;并优化了云的区域选择、优化规则组内容…

如何提高单测覆盖率

相关工具推荐&#xff1a; TestMe:用于快速生成测试类 一、抽象一个公共类&#xff0c;将TestMe的配置内容该类MockTest import lombok.extern.slf4j.Slf4j; import org.junit.Before; import org.junit.runner.RunWith; import org.mockito.junit.MockitoJUnitRunner;impor…