学习 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.mzph.cn/pingmian/69333.shtml

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

相关文章

LabVIEW位移测量系统

本文介绍了一种基于LabVIEW的位移测量系统,结合先进的硬件设备与LabVIEW平台的强大功能,能够实现对位移的精确测量和高效数据处理。该系统具备高精度、实时性和良好的可扩展性,适用于工程与科学实验中对位移测量的多种需求。 项目背景 位移…

杂乱果园环境中自主农业车辆地头转弯的高效安全轨迹规划

Efficient and Safe Trajectory Planning for Autonomous Agricultural Vehicle Headland Turning in Cluttered Orchard Environments 一、问题定位 1. 通用问题:AAV关键任务之一,垄间调头,岬角空间有限、界限不规则、运动动力学约束和静态…

Qt+海康虚拟相机的调试

做机器视觉项目的时候,在没有相机或需要把现场采集的图片在本地跑一下做测试时,可以使用海康的虚拟相机调试。以下是设置步骤: 1.安装好海康MVS软件,在菜单栏->工具选择虚拟相机工具,如下图: 2.打开虚拟…

数据结构【链式队列】

基于链式存储结构的队列实现与分析 一、引言 队列作为一种重要的数据结构,在计算机科学的众多领域有着广泛应用,如操作系统中的任务调度、网络通信中的数据缓冲等。本文通过C 代码实现了一个基于链式存储结构的队列,并对其进行详细解析。 …

路由器如何进行数据包转发?

路由器进行数据包转发的过程是网络通信的核心之一,主要涉及以下几个步骤: 接收数据包:当一个数据包到达路由器的一个接口时,它首先被暂时存储在该接口的缓冲区中。 解析目标地址:路由器会检查数据包中的目标IP地址。…

大数据sql查询速度慢有哪些原因

1.索引问题 可能缺少索引,也有可能是索引不生效 2.连接数配置:连接数过少/连接池比较小 连接数过 3.sql本身有问题,响应比较慢,比如多表 4.数据量比较大 -这种最好采用分表设计 或分批查询 5.缓存池大小 可能是缓存问题&#xff…

Excel 融合 deepseek

效果展示 代码实现 Function QhBaiDuYunAIReq(question, _Optional Authorization "Bearer ", _Optional Qhurl "https://qianfan.baidubce.com/v2/chat/completions")Dim XMLHTTP As ObjectDim url As Stringurl Qhurl 这里替换为你实际的URLDim postD…

『VUE』vue-quill-editor富文本编辑器添加按钮houver提示(详细图文注释)

目录 预览效果新建一个config.js存放标题编写添加提示的方法调用添加标题方法的生命周期总结 欢迎关注 『VUE』 专栏,持续更新中 欢迎关注 『VUE』 专栏,持续更新中 预览效果 新建一个config.js存放标题 export const titleConfig [{ Choice: .ql-bold…

STM32的HAL库开发-通用定时器输入捕获实验

一、通用定时器输入捕获部分框图介绍 1、捕获/比较通道的输入部分(通道1) 首先设置 TIM_CCMR1的CC1S[1:0]位,设置成01,那么IC1来自于TI1,也就是说连接到TI1FP1上边。设置成10,那个IC1来自于TI2,连接到TI2FP1上。设置成…

python编程-内置函数 bytes() , bytearray()详解

bytes()函数用于创建一个新的不可变的字节序列对象,它是bytearray()的不可变版本。这个函数非常有用,尤其是在处理二进制数据、进行网络编程或者文件操作时。 bytes() 和 bytearray() 都用于处理二进制数据的两个内置函数。它们的主要区别在于 bytes 是不…

深度整理总结MySQL——索引正确使用姿势

索引正确使用姿势 前言MySQL索引优缺点分析✅ 索引的优势⚠️ 索引的代价 如何合理建立索引?——关键原则总结重要的优化机制索引覆盖——通俗的方式讲解索引下推索引跳跃式扫描 前言 这篇文章是补充一些基本概念和实战的一些使用建议. MySQL索引优缺点分析 ✅ 索引的优势 …

SpringBoot中的多环境配置管理

SpringBoot中的多环境配置管理 文章目录 SpringBoot中的多环境配置管理SpringBoot中的多环境配置管理 多环境配置的概述1. 为什么需要多环境配置?2. Spring Boot 中如何实现多环境配置?3. 多环境配置的应用场景4. 如何实现配置隔离? Spring B…

Oracle 变更redo log文件位置

更改Oracle数据库的Redo log文件位置,可以按照以下步骤操作。 1.查询当前Redo log文件信息 select * from v$log; select * from v$logfile;通过查询结果可知Redo log文件放在/oradata/redofile 目录下。 2.拷贝redo log文件到新的位置/Data/redolog $cd /orada…

git代理设置

在 Git 中,可以通过以下命令查看当前设置的代理配置: 查看 HTTP 代理 git config --get http.proxy查看 HTTPS 代理 git config --get https.proxy查看全局代理设置 如果你设置了全局代理,可以通过以下命令查看: git config …

全网多平台媒体内容解析工具使用指南

一、工具特性概述 近期体验了一款基于Web端的多媒体解析服务,该平台通过技术创新实现跨平台内容解析功能,主要特点如下: 1.1 跨平台支持 兼容主流社交媒体:Bilibili、YouTube、Twitter、Instagram等 支持短视频平台&#xff1a…

C# winforms 使用菜单和右键菜单

初级代码游戏的专栏介绍与文章目录-CSDN博客 我的github:codetoys,所有代码都将会位于ctfc库中。已经放入库中我会指出在库中的位置。 这些代码大部分以Linux为目标但部分代码是纯C的,可以在任何平台上使用。 源码指引:github源…

网工_以太网MAC层

2025.02.05:网工老姜学习笔记 第12节 以太网MAC层 2.1 MAC层的硬件地址2.2 MAC地址特殊位含义2.3 终端适配器(网卡)具有过滤功能2.4 MAC帧的格式2.4.1 DIX Ethernet V2标准(先私有,后开放,用得比较多&#…

一文吃透!DataStage 全面概述与核心知识要点大公开

目录 第一章 DataStage 基础知识 1.1 DataStage 定义及特点 1.2 DataStage 功能模块 1.3 DataStage 应用场景 第二章 DataStage 核心技术 2.1 数据抽取技术 2.2 数据转换技术 2.3 数据加载技术 第三章 DataStage 操作实践 3.1 环境搭建与配置 安装 DataStage 软件 配…

鼠标滚轮冒泡事件@wheel.stop

我有一个页面,是在画布上的组件,但是组件中有一个table,table中数据多了,就会出现滚动条,正常情况下,滚动条用鼠标滚轮就可以滑动,但是这个table是在画布上,滚动滚轮会让画布缩放 在table外层的div上加上 wheel.stop,就生效了 wheel.stop 用途:这个修饰符用于处理鼠…

探索从传统检索增强生成(RAG)到缓存增强生成(CAG)的转变

在人工智能快速发展的当下,大型语言模型(LLMs)已成为众多应用的核心技术。检索增强生成(RAG)(RAG 系统从 POC 到生产应用:全面解析与实践指南)和缓存增强生成(CAG&#x…