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

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

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

相关文章

Mybatis-plus从入门到精通

1、什么是MyBatis-Plus MyBatis-Plus(简称MP)是一个基于MyBatis的增强工具,在MyBatis的基础上对其进行扩展,用于简化MyBatis操作,提高开发效率。它继承了MyBatis原生的所有特性,并且添加了一些额外的功能&…

前端随笔:HTML/CSS/JavaScript和Vue

前端随笔 1:HTML、JavaScript和Vue 最近因为工作需要,需要接触一些前端的东西。之前虽然大体上了解过HTML、CSS和JavaScript,也知道HTML定义了内容、CSS定义了样式、JavaScript定义了行为,但是却没有详细的学习过前端三件套的细节…

微服务入门---SpringCloud(一)

微服务入门---SpringCloud(一) 1.认识微服务1.0.学习目标1.1.单体架构1.2.分布式架构1.3.微服务1.4.SpringCloud1.5.总结 2.服务拆分和远程调用2.1.服务拆分原则2.2.服务拆分示例2.2.1.导入Sql语句2.2.2.导入demo工程 2.3.实现远程调用案例2.3.1.案例需求…

CoTracker跟踪器 - CoTracker: It is Better to Track Together

论文地址:https://arxiv.org/pdf/2307.07635v1.pdf 官方地址:https://co-tracker.github.io/ github地址:https://github.com/facebookresearch/co-tracker/tree/main 引言 在计算机视觉领域,光流估计是历史最久远的问题之一&a…

利用VBA制作一个转盘游戏之五:最终的游戏过程

【分享成果,随喜正能量】真正厉害的人,从来不说难听的话,因为人心不需要听真话,只需要听好听的话,所以学着做一个有温度且睿智的人。不相为谋,但我照样能心平气和,冷眼相待,我依旧可…

BGP的介绍

目录 BGP基础 BGP的发展历史 BGP在企业中的应用 距离矢量型协议和路径矢量型协议的区别 BGP的特征 1.可控性 2.可靠性 3.AS-BY-AS BGP的对等关系 BGP的数据包 1.open报文 2.Keepalive报文 3.Update报文 4.Notification 报文 5.Route-refresh报文 BGP的状态机 …

【暑期每日一练】 day7

目录 选择题 (1) 解析: (2) 解析: (3) 解析: (4) 解析: (5) 解析: 编程题 题一…

【深度学习中常见的优化器总结】SGD+Adagrad+RMSprop+Adam优化算法总结及代码实现

文章目录 一、SGD,随机梯度下降1.1、算法详解1)MBSGD(Mini-batch Stochastic Gradient Descent)2)动量法:momentum3)NAG(Nesterov accelerated gradient)4)权重衰减项(we…

使用 ChatGPT 进行研究的先进技术

在这篇文章中,您将探索改进您研究的先进技术。尤其, 分析和解释研究数据进行文献综述并找出研究差距废话不多说直接开始吧!!! 分析和解释研究数据 一家小企业主希望分析客户满意度数据以改善客户服务。他们使用包含 10…

【Lua学习笔记】Lua入门

文章目录 Lua变量数据类型变量声明其他表示 Lua语法判断逻辑判断(Lua很特殊,这个比较重要)短路判断 ifif else 循环whileforrepeat 迭代器泛型for迭代器无状态迭代器多状态的迭代器 Lua函数select方法 数组字符索引_G (不是教程&a…

opencv对相机进行畸变矫正,及矫正前后的坐标对应

文章目录 1.背景2.需求分析3.解决方案3.1.镜头畸变矫正3.2.知道矫正后的画面坐标(x, y),求其在原画面的坐标(x, y)3.2.知道原画面坐标(x1, y1),求其在矫正后的画面坐标(x2, y2) 4.效果5.代码 1.背景 目前有个项目,需要用到热成像相机。但是这…

k8s deployment(k8s经典版)|PetaExpress

Deployment是什么? Deployment是指在软件开发中将应用程序或系统部署到目标环境中的过程。它包括将代码编译、配置、打包并安装到目标服务器或设备上的步骤。k8s deployment是(k8s经典版)中用来管理发布的控制器,在开发的过程中使…

selenium等待的三种方式(详细)

1.强制等待 time.sleep(3) 这种方式会是操作强行等待3s才会进行下一步操作,但是这种放法,可能会延长测试的时间,如果元素在1s中出现,就会浪费2s的时间,并且这种放法单次有效,每次需要等待元素的操作都需要…

Python Geoplotlib 可视化地理数据的综合指南

Geoplotlib: Exploring the World with Python Python Geoplotlib 可视化地理数据的综合指南 Geoplotlib是一个强大的Python库,用于可视化地理数据。它提供了一种简单直观的方法来创建地图并在其上绘制地理数据。 Geoplotlib 建立在 matplotlib 和 numpy…

BUG分析以及BUG定位

一般来说bug大多数存在于3个模块: 1、前台界面,包括界面的显示,兼容性,数据提交的判断,页面的跳转等等,这些bug基本都是一眼可见的,不太需要定位,当然也不排除一些特殊情况&#xf…

【Koa】[NoSQL] Koa中相关介绍和使用Redis MongoDB增删改查

目录 NoSQL非关系型数据库关系型数据库(RMDB)介绍非关系型数据库(NoSQL)介绍Redis & MongoDB 在 Koa 中使用 Redis (了解)Redis 的安装和使用在 Koa 中连接 和 调用 Redis 在 Koa 中使用 MongoDBMongoDB 的安装MongoShell 操作…

C++模拟实现stack

1.前言 stack 遵循的原则是先进后出,那到底是用list 还是 vector呢?其实都可以,但是队列queue就不一样了,他甚至不可以支付vector,因为效率太低了。 但是库里面用了一种新的类型,deque,它的实现…

Qt - macOS 安装配置

文章目录 一、关于 QT1.2 Qt的发展史1.3支持的平台1.4 Qt版本1.5 Qt 的优点1.6 成功案例 二、软件安装1、保证已 Xcode 和 Command Line Tools2、下载 QT3、下载 [qtcreator](http://download.qt.io/official_releases/qtcreator/)查看qt版本 三、创建工程Qt 常见用法 四、基础…

消息服务概述

消息服务的作用: 在多数应用尤其是分布式系统中,消息服务是不可或缺的重要部分,它使用起来比较简单,同时解决了不少难题,例如异步处理、应用解耦、流量削锋、分布式事务管理等,使用消息服务可以实现一个高…

利用vscode--sftp,将本地项目/文件上传到远程服务器中详细教程

1、首先在 vscode 中下载 sftp: 2、然后在 vscode 中打开本地将要上传的项目或文件: 3、安装完后,使用快捷键 ctrlshiftP 打开指令窗口,输入 sftp:config ,回车,在当前目录中会自动生成 .vscode 文件夹及 s…