当前位置: 首页 > news >正文

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

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 | async23251 | inventory_requirements_sub | streaming | async
(2 rows)
SELECT * FROM inventory ORDER BY product_id;warehouse | product_id | quantity
-----------+------------+----------SLC1      |         11 |        7SLC1      |         13 |       13SLC1      |         15 |       18SLC1      |         22 |       15SLC1      |         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 |        2SLC1      |         13 |       13SLC1      |         15 |       18SLC1      |         22 |       15
SLC1      |         24 |       20

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

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

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

456ac7ddc74c6ad8e7cf8cbf93d4adcb.png

相关文章:

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

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

《零基础入门学习Python》第058讲:论一只爬虫的自我修养6:正则表达式2

上一节课我们通过一个例子(匹配 ip 地址)让大家初步了解到正则表达式的魔力,也让大家充分了解到学习正则表达式是一个相对比较困难的事情。所以这一节课我们将继续学习 正则表达式的语法。 我们依稀还记得在Python中,正则表达式是…...

第一堂棒球课:MLB棒球大联盟的主要战术·棒球1号位

MLB棒球大联盟的主要战术 攻击战术run-and-foul(跑垒战术):以速度为优势,在适当的时机发动进攻,争取在一回合内完成得分。 grounder(阻截战术):队员在垒包之间阻止对手的跑垒和传球。…...

【论文阅读】利用道路目标特征的多期车载激光点云配准

目录 引 言1 道路场景点云特征2 配准方法2.1 配准基元获取2.2 特征点提取2.3 两期道路场景车载点云的配准 2.3.1 基于特征点的4PCS 粗配准 3 实验与分析4 结论5 参考文献 摘 要 针对车载移动测量系统获取的城市道路点云场景巨大、目标复杂多样,多期道路场景重访车载…...

L---泰拉瑞亚---2023河南萌新联赛第(三)场:郑州大学

链接:登录—专业IT笔试面试备考平台_牛客网 来源:牛客网 示例1 输入 1 10 3 5 输出 3 说明 只有一把回旋镖,你可以先打两次伤害为3的,再打一次倾尽全力的,造成的伤害为5。总伤害为33511,即可获得胜…...

windows无盘启动技术开发之使用本地镜像文件启动电脑

by fanxiushu 2023-07-26 转载或引用请注明原始作者。 其实使用本地镜像文件启动电脑,这个windows操作系统本身就是自带的功能。 win7以上的系统,制作 vhd或vhdx格式的镜像文件, 然后在镜像文件中安装windows操作系统,然后放到真实…...

PoseiSwap 即将开启质押,利好刺激下 POSE通证短时涨超 30%

随着 Nautilus Chain 主网的上线,预示着 Web3 世界迎来全新的模块化、Layer3 时代,为 Web3 世界与 Web2 世界的深入融合构建基础。而 PoseiSwap 作为 Nautilus Chain 上的首个 DEX,也成为了加密行业首个以模块化为基础构建的 DEX。 基于 Naut…...

Linux文本编辑器-vim

目录 前言 Vim三种模式 打开方式 命令模式 插入模式 可视模式 保存和退出 前言 Vim是一个功能丰富且强大的文本编辑器,被广泛用于Linux系统。它是Vi的增强版本,提供了更多的功能和改进,同时可以通过插件扩展其功能; Vim三…...

vscode使用g++编译.c文件或.cpp文件

vscode是一个跨平台、轻量级、插件非常丰厚的IDE,这里介绍在vscode里使用g来编译.cpp文件。g也叫GCC, 在Window中,是使用MinGW方式实现g的,它分为32位和64位2个版本,其中,MinGW-64是64位的,MinGW-32是32位的…...

云计算的服务模式包括哪些|PetaExpress云服务商

云计算(cloud computing)它是一种分布式计算,是指通过网络“云”将巨大的数据计算处理程序分解成无数的小程序,然后通过由多个服务器组成的系统进行处理和分析,得到结果并返回给用户。云计算作为一种基于互联网的新型超…...

iOS--通知、代理、单例模式总结

通知 概要 观察者和被观察者都无需知晓对方,只需要通过标记在NSNotificationCenter中找到监听该通知所对应的类,从而调用该类的方法。并且在NSNotificationCenter中,观察者可以只订阅某一特定的通知,并对齐做出相应操作&#xf…...

选择最佳安全文件传输方法的重要性

在数字化时代,文件的传输是商务、教育、科研、医学等领域不可或缺的工作流程。为了保障数据安全,选择最佳安全文件传输方法非常关键。在本文中,我们将探讨选择最佳安全文件传输方法的重要性。 第一、最佳安全文件传输方法可以保证文件内容不被…...

IBM LSF 集群虚拟化和工作负载管理解决方案

IBM LSF 集群虚拟化和工作负载管理解决方案 全面综合的工作负载管理解决方案,不仅能够简化 HPC,还能大幅改善用户和管理员体验、可靠性和性能 用途 IBM Spectrum LSF Suites 组合通过为任务关键型 HPC 环境提供集成解决方案,重新定义集群虚…...

C++(14):重载运算与类型转换

当运算符被用于类类型的对象时,允许我们为其指定新的含义;同时,也能自定义类类型之间的转换规则。和内置类型的转换一样,类类型转换隐式地将一种类型的对象转换成另一种我们所需类型的对象。 当运算符作用于类类型的运算对象时&a…...

【深度学习】基于图形的机器学习:概述

一、说明 图神经网络(GNN)在数据科学和机器学习中越来越受到关注,但在专家圈之外仍然知之甚少。为了掌握这种令人兴奋的方法,我们必须从更广泛的图形机器学习(GML)领域开始。许多在线资源谈论GNN和GML&…...

内存泄漏是什么?有什么危害

内存泄漏是什么?有什么危害 1. 前言1.内存泄漏是什么?2. 为什么会发生内存泄漏3. 内存泄漏的危害4. 总结 1. 前言 在各种项目开发中,内存泄漏是一个很严重的问题。对资源管理、性能优越、系统稳定性,以及是否安全产生极大印象。本…...

【项目设计】基于负载均衡的在线oj平台

目录 一、项目介绍 二、开发环境以及技术 三、概要设计 四、关键算法 五、项目演示 六、代码实现 一、项目介绍 该项目是基于负载均衡的在线oj,模拟平时刷题网站(leetcode和牛客)写的一个在线判题系统 项目主要分为五个模块&#xff…...

生产环境Session解决方案、Session服务器之Redis

目录 一、服务器配置 二、安装nginx 三、安装配置Tomcat: 四、配置session Session服务器之Redis Redis与Memcached的区别 安装部署redis 一、服务器配置 IP地址 主机名 软件包列表 192.168.100.131 huyang1 nginx 192.168.100.133 huyang3 JDK Tomca…...

SPECjvm2008_1_01 openjdk8 x86_64 ARM64 运行时长、成绩 Run is valid, but not compliant

i5-9600k 架构: x86_64CPU 运行模式: 32-bit, 64-bitAddress sizes: 39 bits physical, 48 bits virtual字节序: Little Endian CPU: 6在线 CPU 列表: …...

安卓:百度地图开发(超详细)

一、百度地图介绍 百度地图SDK是一套供开发者使用的软件开发工具包(SDK),用于在Android应用程序中集成和使用百度地图功能。通过使用百度地图SDK,开发者可以实现在自己的应用中显示地图、获取定位信息、进行搜索、导航等功能。 百…...

DDSv1.4规范(中文版)

实时数据分发 (DDS) V1.4 (2015-04-10正式发布) https://www.omg.org/spec/DDS/1.4/PDF http://www.omg.org/spec/DDS/20140501/dds_dcps.idl...

oracle,获取每日24*60,所有分钟数

前言: 为规范用户的时间录入,因此我们采用下拉的方式,让用户选择需要的时间,因此我们需要将一天24小时的时间拆分为类似00:00,00:01...23:00,23:01,23:59。因此我们需要生成24*601440行的下拉复选值。具体效果如下图所示。 思路 1…...

vue elementui table去掉滚动条与实现表格自动滚动且无滚动条

当table内容列过多时,可通过height属性设置table高度以固定table高度、固定表头,使table内容可以滚动。 现在需求是右侧滚动条不好看,需要去除滚动条,并隐藏滚动条所占列的位置。让他可以滚动但是不出现滚动条,不然即时隐藏了滚动…...

SDK命令行工具配置

SDK命令行工具配置 最早的Android SDK工具包,包含一些GUI的工具。 而在一些场景(如打包)只需要命令行工具时,下载 command-line tools 即可。 到 Android Studio下载页 ,找到 Command line tools only 下载。 命令…...

【数字IC基础】竞争与冒险

竞争-冒险 1. 基本概念2. 冒险的分类3. 静态冒险产生的判断4. 毛刺的消除使用同步电路使用格雷码增加滤波电容增加冗余项,消除逻辑冒险引入选通脉冲 1. 基本概念 示例一: 如上图所示的这个电路,使用了两个逻辑门,一个非门和一个与…...

速成版-带您一天学完python自动化测试(selenium)

Selenium是一套web网站的程序自动化操作解决方案。我们通过编写自动化程序,使得自动完成浏览器界面的相关操作,除了能够自动化的完成相关操作,还能从web页面获取相关信息,然后通过程序进行分析处理,本质上就是提升从网…...

windows 删除无法删除的文件

有两种原因: 文件被占用文件无权限 解决方案 通用解决方案是进入安全模式进行删除 安全模式: 不会启动非必要的进程有最高的系统权限 进入系统配置 安全引导,重启 删除文件 修改系统配置为正常启动 重启...

FFmpeg[7] - FFmpeg之预设编码参数preset

目录 前言 正文 一、定义与作用 二、取值范围 三、枚举值 四、使用实例...

CVPR2023新作:3D视频物体检测

Title: 3D Video Object Detection With Learnable Object-Centric Global Optimization Affiliation: 中国科学院自动化研究所 (Institute of Automation, Chinese Academy of Sciences),中国科学院大学人工智能学院 (School of Artificial Intelligence, Univers…...

Keepalived热备、Keepalived+LVS、HAProxy监控及后端服务器健康检查、负载均衡调度器对比

day02 day02KeepAlived高可用集群配置高可用的web集群监控本机80端口,实现主备切换实现原理实施配置高可用、负载均衡的web集群配置高可用、负载均衡HAProxy配置haproxy负载均衡调度器比较LVS(Linux Virtual Server)NginxHAProxy KeepAlive…...