学习 PostgreSQL 流复制

PostgreSQL 流复制

PostgreSQL数据库异常中止后,数据库刚重启时,会重放停机前最后一个checkpoint点之后的 WAL日志,在把数据库恢复到停机的状态后,自动进入正常的状态,可以接收其他用户的查询和修改。

想象另一个场景:如果A机器上的数据库停止后,把A机器上的数据库整个拷贝到另一台机器B上,在机器B上启动这个数据库时,机器B上的数据库也将做与A机器上数据库重启时相同的事,即重放停止之前最后一个checkpoint点之后的 WAL日志,把数据库推导到停机时的状态。通常数据库完成恢复后会自动进入正常状态,如果有办法让这个数据库不自动进入正常状态,而是让其一直等待新的 WAL日志,如果有新的 WAL日志来则自动进行重放,直到主库失败后,再让B机器上的数据库进入正常状态,这样B机器上的数据库就成了-个 Standby 数据库,实现了当A机器上的数据库出故障时,B机器上的数据库能接管的功能。

PostgreSQL的流复制是异步的,异步的缺点是Standby上的数据落后于主库上的数据如果使用做读写分离,就会存在数据一致性的问题,这对于一些一致性较高的应用来说是不可接受的。所以 PostgreSQL从9.1版本之后提供了同步流复制的架构。同步复制要求在数据写入 Standby数据库后,事务的commit才返回,所以 Standby库出现问题时,会导致主库被hang住。解决这个问题的方法是启动两个 Standby数据库,这两个 Standby 数据库只要有一个是正常的,就不会让主库hang住。所以在实际应用中,同步流复制,总是有1个主库和2个以上的 Standby 库。

1、一主一备

主库配置

# postgresql.conf
wal_level='replica'
archive_mode='on'
archive_command='test ! -f /home/postgres/archive/%f && cp %p /home/postgres/archive/%f'
max_wal_senders=10      #可以有多少个流复制链接
wal_keep_size=128MB
wal_sender_timeout=60s  #流复制发送主机的超时时间。# pg_hba.conf 
host    replication   repuser   0.0.0.0/0   password

完成以上准备工作后,就可以使用pg_basebackup命令行工具在备机机器上生成基础备份了,命令如下:

pg_basebackup -h 192.168.2.204 -p 1622 -U repuser -W -X stream -F p -P -R -D /home/postgres/pgdata -l backup20250207

完成启动备库,此时就建立好主备了。

默认是异步模式 async

图片
注意:只要主库中synchronous_standby_names参数中没有的名字,均为异步

下面我们给他调整成同步模式 sync

主库 添加参数 vim postgresql.conf

#synchronization level
synchronous_commit = on            #同步提交
synchronous_standby_names='node2'  #同步提交名字


备库 修改参数 vim postgresql.auto.conf,添加到配置文件的最后

application_name=node2

主、备 重启服务

psql -c "select application_name,client_addr,sync_state from pg_stat_replication;"

调整成sync同步模式

pg_stat_replication 试图中 sync_state 的三个值及其含义1. async(异步)从节点以异步模式运行。这意味着主节点不会等待从节点确认事务已经应用,而是直接提交事务。
2. potential(潜在同步)从节点当前处于潜在同步状态。这意味着如果当前的同步从节点失效,这个从节点将被提升为同步从节点。
3. sync(同步)从节点以同步模式运行。这意味着主节点会等待从节点确认事务已经应用后才提交事务。这确保了更高的数据一致性和高可用性。

pg_stat_replication视图主要参数

psql -xc "select * from pg_stat_replication;"
startup连接中,catchup同步中 streaming 同步
sent_lsn    主库传送wal的位置
write_lsn   从库接收wal的位置
flush_lsn   从库同步到磁盘的wal位置
replay_lsn  从库同步到数据库的wal位置
write_lag   延迟
sync_priority 异步,1~x同步越小,同步级别越高
sync_state async 异步,sync同步,potential现在是异步,但可能升级为同步

2、一主两备

优点:前面说到,同步复制要求在数据写入 Standby数据库后,事务的commit才返回,所以 Standby库出现问题时,会导致主库被hang住。启动两个 Standby数据库,这两个 Standby 数据库只要有一个是正常的,就不会让主库hang住。

pg_basebackup -h 192.168.2.204 -p 1622 -U repuser -W -X stream -F p -P -R -D /home/postgres/pgdata -l backup20250207


修改参数 vim postgresql.auto.conf,添加到配置文件的最后

并不需要重启主库,只需要重新装载配置即可

pg_ctl reload
psql -c "select application_name,client_addr,sync_state from pg_stat_replication;"
  1. 两个备库一个同步以一个异步,我们来shutdown node2.测试能否提交数据

主节点可以正常提交

2) 我们把两个节点都升级为同步模式,修改配置

#synchronization level
synchronous_commit = on                  #同步提交
synchronous_standby_names='node2,node3'  #同步提交名字

可以看到node3 备设置为potential(潜在同步)

此时我们关闭node2,可以看到 node3 由 potential 升级为 sync

数据可以正常写入

b.此时我们关闭node2,node3,主库会等待,只要一个备库正常,即可提交成功


可以看到node2的优先级是1,node3的优先级是2这个优先级是由synchronous_standby_names 参数配置的顺序决定的。目前主数据库与db02处于同步“sync”,而 node3 的状态为potential”,表示它是一个潜在的同步 Standby,当node2损坏时,node3 会切换到同步状态。

psql -c "select application_name,client_addr,sync_priority,sync_state from pg_stat_replication;"


在PG10及以后版本中,引入了 synchronous_standby_names 这种基于** Quorum**的同步复制优选提交的机制。

同步复制支持一个或者更多个同步后备服务器,事务将会等待,直到所有同步后备服务器都确认收到了它们的数据为止。事务必须等待其回复的同步后备的数量由synchronous_standby_names 指定。这个参数还指定一个后备服务器名称及方法(FIRST和ANY)的列表来从列出的后备中选取同步后备。

方法FIRST 指定一种基于优先的同步复制并且让事务提交等待,直到它们的WAL记录被复制到基于优先级选中的所要求数量的同步后备上为止。在列表中出现较早的后备被给予较高的优先级,并且将被考虑为同步后备。其他在这个列表中位置靠后的后备服务器表示可能的同步后备。如果任何当前的同步后备由于任何原因断开连接,它将立刻被下一个最高优先级的后备所替代。

配置1:如果有多台备node1、node2、node3、node4正在运行,事务提交将会等待来其中中至少任意一台备机器的回复,才能提交成功。node4 是一台异步后备,因为它的名字不在该列表中。

synchronous_standby_names='ANY 1 (node1,node2,node3)'

配置2:如果有多台备node1、node2、node3、node4正在运行,事务提交将会等待来其中中至少任意两台备机器的回复,才能提交成功。node4 是一台异步后备,因为它的名字不在该列表中

synchronous_standby_names='ANY 2 (node1,node2,node3)'

配置3:node1,node2 将被选中为同步备库,主库提交事务时,node1,node2 都写入wal才能提交成功。如果 node1,node2 任意一个失效,node3,node4 可以升级为同步备库。

synchronous_standby_names = 'FIRST 2 (node1,node2,node3,node4)'

注意:
如果在提交正在等待确认时主服务器重启,那些正在等待的事务将在主数据库恢复时被标记为完全提交。没有办法确认所有后备服务器已经收到了在主服务器崩溃时所有还未处理的 WAL 数据。某些事务可能不会在后备服务器上显示为已提交,即使它们在主服务器上显示为已提交。我们提供的保证是:在 WAL 数据已经被所有后备服务器安全地收到之前,应用将不会收到一个事务成功提交的显式确认。

判断是否为备库

postgres=# select pg_is_in_recovery();pg_is_in_recovery
-------------------f
f:主库,t:备库

======================================================
文章参考:唐成老师PostgreSQL修炼之道从小工到专家

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

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

相关文章

Python基础-元组tuple的学习

在 Python 中,元组(tuple)是一种不可变的序列类型,允许存储不同类型的元素。元组非常类似于列表(list),但与列表不同的是,元组一旦创建,就不能修改其内容。 1 元组的创建…

Photoshop自定义键盘快捷键

编辑 - 键盘快捷键 CtrlShiftAltK 把画笔工具改成Q , 橡皮擦改成W , 涂抹工具改成E , 增加和减小画笔大小A和S 偏好设置 - 透明度和色域 设置一样颜色 套索工具 可以自定义套选一片区域 Shiftf5 填充 CtrlU 可以改颜色/色相/饱和度 CtrlE 合并图层 CtrlShiftS 另存…

如何在Android Studio中开发一个简单的Android应用?

Android Studio是开发Android应用的官方集成开发环境(IDE),它提供了许多强大的功能,使得开发者能够高效地创建Android应用。如果你是Android开发的初学者,本文将引导你如何在Android Studio中开发一个简单的Android应用…

【Qt 常用控件】输入类控件1(QLineEdit和QTextEdit 输入框)

目录 1.QLineEdit 单行输入框 例:输入个人信息,通过按钮提交 例:为输入框设置验证器,检查输入的电话 例:验证两次输入的密码是否一致 例:是否显示密码按钮,toggled信号。 2.QTextEdit多行输入框 、QPl…

Bash (Bourne-Again Shell)、Zsh (Z Shell)

文章目录 1. 历史背景2. 主要区别3. 功能对比自动补全插件和主题路径扩展提示符定制 4. 性能5. 使用场景6. 如何切换 Shell7. 总结 以下是 Bash 和 Zsh 之间的主要区别,列成表格方便对比: 特性BashZsh默认Shell大多数Linux发行版默认ShellmacOS默认She…

Jetbrains IDE http客户端使用教程

简介 JetBrains IDE(如IntelliJ IDEA, WebStorm, PhpStorm和PyCharm)自带一个内置的HTTP客户端,允许直接从IDE发送HTTP请求,而无需使用第三方工具,如Postman或cURL。 JetBrains IDE 中的 HTTP…

android手机安装deepseek-r1:1.5b

序 本文主要展示一下如何在android手机上安装deepseek-r1:1.5b 步骤 安装termux 到https://termux.dev/cn/index.html去下载 然后执行termux-setup-storage以获取手机存储权限 安装构建依赖 pkg install git cmake golang下载ollama git clone --depth 1 https://gitee.…

U3D支持webgpu阅读

https://docs.unity3d.com/6000.1/Documentation/Manual/WebGPU-features.html 这里看到已经该有的差不多都有了 WOW VFX更是好东西 https://unity.com/cn/features/visual-effect-graph 这玩意儿化简了纯手搓一个特效的流程 如果按原理说就是compute shader刷position&#…

PWM波形输出

一、想要达到的效果 二、实现代码 因为是在1khz的频率下,所以用重新配置定时器0,定时长度为100微妙 void Timer0Init(void) //100微秒12.000MHz {AUXR | 0x80; //定时器时钟1T模式TMOD & 0xF0; //设置定时器模式TL0 0x50; //设置定时初值TH0 …

Spring Boot整合MQTT

MQTT是基于代理的轻量级的消息发布订阅传输协议。 1、下载安装代理 进入mosquitto下载地址:Download | Eclipse Mosquitto,进行下载,以win版本为例 下载完成后,在本地文件夹找到下载的代理安装文件 使用管理员身份打开安装 安装…

前端 CSS 动态设置样式::class、:style 等技巧详解

一、:class 动态绑定类名 v-bind:class&#xff08;缩写为 :class&#xff09;可以动态地绑定一个或多个 CSS 类名。 1. 对象语法 通过对象语法&#xff0c;可以根据条件动态切换类名。 <template><div :class"{ greenText: isActive, red-text: hasError }&…

TCP三次握手全方面详解

文章目录 (1) 三次握手各状态CLOSE状态SYN_SENT状态SYN_RECV状态ESTABLISHED状态 (2) 为什么握手时的seqnum是随机值&#xff0c;以及acknum的功能(3) 三次握手中的半连接队列&#xff08;SYN队列&#xff09;和全连接队列&#xff08;ACCEPT队列&#xff09;半连接队列全连接队…

基于Java的远程视频会议系统(源码+系统+论文)

第一章 概述 1.1 本课题的研究背景 随着人们对视频和音频信息的需求愈来愈强烈&#xff0c;追求远距离的视音频的同步交互成为新的时尚。近些年来&#xff0c;依托计算机技术、通信技术和网络条件的发展&#xff0c;集音频、视频、图像、文字、数据为一体的多媒体信息&#xff…

Docker Desktop安装到其他盘

Docker Desktop 默认安装到c盘&#xff0c;占用空间太大了&#xff0c;想给安装到其他盘&#xff0c;网上找了半天的都不对 正确安装命令&#xff1a; start /w "" "Docker Desktop Installer.exe" install --installation-dirF:\docker命令执行成功&am…

手动配置IP

手动配置IP&#xff0c;需要考虑四个配置项&#xff1a; 四个配置项 IP地址、子网掩码、默认网关、DNS服务器 IP地址&#xff1a;格式表现为点分十进制&#xff0c;如192.168.254.1 子网掩码&#xff1a;用于区分网络位和主机位 【子网掩码的二进制表达式一定是连续的&#…

Qt:常用控件

目录 控件概述 控件体系的发展 按钮类控件 QPushButton QRadioButton QCheckBox QToolButton 显示类控件 QLabel QLCDNumber QProgressBar QCalendarWidget 输入类控件 QLineEdit QTextEdit QComboBox QSpinBox QDateEdit & QTimeEdit QDial QSlider …

【漫话机器学习系列】087.常见的神经网络最优化算法(Common Optimizers Of Neural Nets)

常见的神经网络优化算法 1. 引言 在深度学习中&#xff0c;优化算法&#xff08;Optimizers&#xff09;用于更新神经网络的权重&#xff0c;以最小化损失函数&#xff08;Loss Function&#xff09;。一个高效的优化算法可以加速训练过程&#xff0c;并提高模型的性能和稳定…

4G核心网的演变与创新:从传统到虚拟化的跨越

4G核心网 随着移动通信技术的不断发展&#xff0c;4G核心网已经经历了从传统的硬件密集型架构到现代化、虚拟化网络架构的重大转型。这一演变不仅提升了网络的灵活性和可扩展性&#xff0c;也为未来的5G、物联网&#xff08;LOT&#xff09;和边缘计算等技术的发展奠定了基础。…

拉格朗日插值法的matlab实现

一、基本原理 比如有如下这些点 x1x2x3x4y1y2y3y4 那么在拉个朗日原理中可以把过这些点的曲线表示为&#xff1a; 其g(x)y叫做一个插值基函数&#xff08;开关&#xff09;&#xff0c;当xx1时&#xff0c;g1(x)1&#xff0c;而当xx2,x3,x4时&#xff0c;g1(x)都为0&#xf…

使用WebStorm开发Vue3项目

记录一下使用WebStorm开发Vu3项目时的配置 现在WebStorm可以个人免费使用啦&#xff01;?? 基本配置 打包工具&#xff1a;Vite 前端框架&#xff1a;ElementPlus 开发语言&#xff1a;Vue3、TypeScript、Sass 代码检查&#xff1a;ESLint、Prettier IDE&#xff1a;WebSt…