Postgresql实战:使用pg_basebackup或pg_start_backup方式搭建Postgresql主从流复制

官方文档https://www.postgresql.org/docs/current/high-availability.html
主从原理或逻辑理解:
将一个基于文件日志传送slave服务器转变成流复制slave服务器的步骤是把该slave服务器recovery.conf文件中的primary_conninfo设置指向master服务器。这样slave服务器可以连接到master服务器上的伪数据库replication。当slave服务器被启动并且primary_conninfo被正确设置,slave服务器将在重放完归档中所有可用的WAL文件之后连接到master服务器。如果连接被成功建立,你将在slave服务器中看到一个walreceiver进程,并且在master服务器中有一个相应的walsender进程。

流复制允许一台后备服务器比使用基于文件的日志传送(日志传送是异步的,即 WAL 记录是在事务提交后才被传送。)更能保持为最新的状态。后备服务器连接到主服务器,主服务器则在 WAL 记录产生时即将它们以流式传送给后备服务器而不必等到 WAL 文件被填充。 默认情况下流复制是异步的,在这种情况下主服务器上提交一个事务与该变化在后备服务器上变得可见之间存在短暂的延迟。不过这种延迟比基于文件的日志传送方式中要小得多,在后备服务器的能力足以跟得上负载的前提下延迟通常低于一秒。如果你使用的流复制没有基于文件的连续归档,该服务器可能在后备机收到 WAL 段之 前回收这些旧的 WAL 段。如果发生这种情况,后备机将需要重新从一个新的基础备 份初始化。通过设置wal_keep_segments为一个足够高的值来确保旧 的 WAL 段不会被太早重用或者为后备机配置一个复制槽,可以避免发生这种情况。如果设置了一个后备机可以访问的 WAL 归档,就不需要这些解决方案,因为该归档可以 为后备机保留足够的段,后备机总是可以使用该归档来追赶主控机。 一旦流复制已经被配置,配置同步复制就只需要一个额外的配置步骤:synchronous_standby_names必须被设置为一个非空值。synchronous_commit也必须被设置为on,但由于这是默认值,通常不需要改变。这样的配置将导致每一次提交都等待确认消息,以保证后备服务器已经将提交记录写入到持久化存储中。将synchronous_commit设置为remote_write将导致每次提交都等待后备服务器已经接收提交记录并将它写出到其自身所在的操作系统的确认,但并非等待数据都被刷出到后备服务器上的磁盘。这种设置提供了比on要弱一点的持久性保障:在一次操作系统崩溃事件中后备服务器可能丢失数据,尽管它不是一次PostgreSQL崩溃。不过,在实际中它是一种有用的设置,因为它可以减少事务的响应时间。只有当主服务器和后备服务器都崩溃并且主服务器的数据库同时被损坏的情况下,数据丢失才会发生。

主节点:172.22.136.146
从节点:172.22.136.147

pg_basebackup的过程中,主库可读可写
pg_start_backup+copy+pg_stop_backup,copy的过程,主库可读可写

pg_basebackup的方式

1、master节点172.22.136.146创建用于同步的账号repdev3,修改postgresql.conf文件和pg_hba.conf文件

create user repdev3 SUPERUSER LOGIN password '123456'; 

pg_hba.conf文件新增如下

host  replication  repdev3  172.22.136.147  md5

postgresql.conf修改如下

wal_level=replica
max_wal_senders = 2
wal_keep_segments = 256

2、重启master节点

3、在slave节点172.22.136.147执行psql看是否可以连接master节点

psql -h172.22.136.146 -p 5432 -U repdev3 -d postgres -W

4、在slave节点172.22.136.147,删除$PGDATA目录下所有文件,否则pg_basebackup过程会报错pg_basebackup: directory “/XX” exists but is not empty

5、在slave节点172.22.136.147执行pg_basebackup把master的文件拷贝到slave

pg_basebackup -D$PGDATA -F p -X stream -v -P -h 172.22.136.146 -p 5432 -U repdev3 -W

-D参数表示指定备节点用来接收主库数据的目标路径
-F参数表示指定pg_basebackup命令生成的备份数据格式,P表示生成的备份数据和主库上的数据文件布局一样,类似于操作系统命令将数据库 P G D A T A 系统数据文件、表空间文件完全拷贝到备节点。当集簇没有额外表空间时,整个数据库将被放在目标目录中。如果集簇包含额外的表空间,主数据目录将被放置在目标目录中,但是所有其他表空间将被放在它们位于服务器上的相同的绝对路径中。如果主库存在额外的表空间且这个表空间目录和主库 PGDATA系统数据文件、表空间文件完全拷贝到备节点。当集簇没有额外表空间时,整个数据库将被放在目标目录中。如果集簇包含额外的表空间,主数据目录将被放置在目标目录中,但是所有其他表空间将被放在它们位于服务器上的相同的绝对路径中。如果主库存在额外的表空间且这个表空间目录和主库 PGDATA系统数据文件、表空间文件完全拷贝到备节点。当集簇没有额外表空间时,整个数据库将被放在目标目录中。如果集簇包含额外的表空间,主数据目录将被放置在目标目录中,但是所有其他表空间将被放在它们位于服务器上的相同的绝对路径中。如果主库存在额外的表空间且这个表空间目录和主库PGDATA目录不一样,从库没有这样的目录,pg_basebackup过程会自动在从库上建立表空间对应的目录,但是如果从库没有权限操作对应的目录则pg_basebackup过程会报错pg_basebackup: could not create directory “/Pgtablespace”: Permission denied。
-X参数表示指定在备份过程中产生的WAL日志包含在备份中的方式,fetch表示基准备份完成后再把备份过程中产生的wal日志拷贝到从库,如果备份过程很长,wal在主库已经被覆盖了,那么这个备份就不成功了。stream表示主库上除了启动一个基准备份进程外还会额外启动一个进程发送主库主库产生的wal增量日志(这两个进程都属于max_wal_senders参数指定的wal发送进程数),这样的话就避免了fetch方式过程中主库的wal被覆盖的情况,生产环境推荐使用stream
-v参数表示命令执行过程中打印各个阶段的日志
-P参数表示显示数据文件、表空间文件的传输百分比

pg_basebackup执行过程的输出内容

pg_basebackup: initiating base backup, waiting for checkpoint to complete
pg_basebackup: checkpoint completed
pg_basebackup: write-ahead log start point: 0/3E000028 on timeline 1
pg_basebackup: starting background WAL receiver
pg_basebackup: created temporary replication slot "pg_basebackup_25932"
33059/33059 kB (100%), 1/1 tablespace
pg_basebackup: write-ahead log end point: 0/3E0000F8
pg_basebackup: waiting for background process to finish streaming ...
pg_basebackup: base backup completed

拷贝过程中和拷贝后,主库可以正常读写。拷贝完后,发现在从库比主库少了postmaster.opts和postmaster.pid这两个文件,但是比主库多了一个文件backup_label,backup_label内容如下

START WAL LOCATION: 0/3E000028 (file 00000001000000000000001F)
CHECKPOINT LOCATION: 0/3E000060
BACKUP METHOD: streamed
BACKUP FROM: master
START TIME: 2022-03-21 05:58:25 PDT
LABEL: pg_basebackup base backup
START TIMELINE: 1

6、拷贝完成后,在slave节点172.22.136.147修改postgresql.conf文件新增recovery.conf文件,recovery.conf文件内容如下

recovery_target_timeline = 'latest'
standby_mode = 'on'
primary_conninfo = 'host=172.22.136.146 port=5432 user=repdev3 password=123456'

备注:standby_mode参数为on通俗理解就是说自己是备库并且会不停地从主库上获取WAL日志流直到获取主库上最新的wAL日志流

postgresql.conf文件修改内容如下

hot_standby = on

可选参数max_standby_streaming_delay(流复制最大延迟)、wal_receiver_status_interval(从向主报告状态的最大间隔时间)
备注:hot_standby参数指定从库在恢复期间,你是否能够连接并运行查询,默认为ON,设置为off的话,则psql无法连接从库会报错:the database system is starting up

7、启动slave节点172.22.136.147

pg_ctl start

从库的backup_label变成了backup_label.old,并且backup_label.old里面的内容和重启前backup_label里面的内容一致

8、验证
8.1、在master或slave执行ps -ef|grep wal,发现master节点出现walsender进程,slave节点出现walreceiver进程
8.2、在master执行select client_addr,sync_state from pg_stat_replication;可以看到从库信息
8.3、在slave从库执行dml和ddl都会报错,类似如下
ERROR: cannot execute CREATE TABLE AS in a read-only transaction
ERROR: cannot execute DELETE in a read-only transaction
8.4、如果主库新建表空间且这个表空间目录和主库$PGDATA目录不一样,从库没有这样的目录,从库流复制会报错并且从库的postgresql会down掉

2023-03-21 00:12:12.776 PDT [397] FATAL:  directory "/Pgtablespace/dw2" does not exist
2023-03-21 00:12:12.776 PDT [397] HINT:  Create this directory for the tablespace before restarting the server.
2023-03-21 00:12:12.776 PDT [397] CONTEXT:  WAL redo at 2/C4000740 for Tablespace/CREATE: 24670 "/Pgtablespace/dw2"
2023-03-21 00:12:12.779 PDT [395] LOG:  startup process (PID 397) exited with exit code 1
2023-03-21 00:12:12.779 PDT [395] LOG:  terminating any other active server processes
2023-03-21 00:12:12.780 PDT [484] WARNING:  terminating connection because of crash of another server process
2023-03-21 00:12:12.780 PDT [484] DETAIL:  The postmaster has commanded this server process to roll back the current transaction and exit, because another server process exited abnormally and possibly corrupted shared memory.
2023-03-21 00:12:12.780 PDT [484] HINT:  In a moment you should be able to reconnect to the database and repeat your command.
2023-03-21 00:12:12.789 PDT [395] LOG:  database system is shut down

pg_start_backup+copy_pg_stop_backup的方式
如果是使用pg_start_backup+copy_pg_stop_backup替代pg_basebackup的话,其他步骤和pb_basebackup一样不用改,只需要把上面第五步改成如下
5.1、master节点执行select pg_start_backup (‘/pgdata’)设置master节点为备份状态
此时master节点的/pgdata目录下会出现一个文件backup_label,内容格式大概如下

START WAL LOCATION: 0/19000028 (file 000000010000000000000019)
CHECKPOINT LOCATION: 0/19000060
BACKUP METHOD: pg_start_backup
BACKUP FROM: master
START TIME: 2022-03-20 07:53:54 PDT
LABEL: /pgdata
START TIMELINE: 1

5.2、拷贝master节点的数据文件到slave节点

5.3、拷贝完成后,master执行select pg_stop_backup()取消备份状态
此时master节点的/pgdata目录下的文件backup_label消失了
如果不执行此步,直接执行后面的步骤,则从库无法启动,会报错类似如下错误,此时只要关闭从库,再在主库上执行select pg_stop_backup(),再次启动从库,从库就可以正常启动了

2022-03-20 08:35:33.450 PDT [17049] LOG:  database system was interrupted while in recovery at log time 2022-03-20 08:13:37 PDT
2022-03-20 08:35:33.450 PDT [17049] HINT:  If this has occurred more than once some data might be corrupted and you might need to choose an earlier recovery target.
2022-03-20 08:35:33.483 PDT [17049] LOG:  entering standby mode
2022-03-20 08:35:33.485 PDT [17049] LOG:  redo starts at 0/1B000060
2022-03-20 08:35:33.485 PDT [17049] LOG:  invalid record length at 0/1B000140: wanted 24, got 0

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【数据分析之道-基础知识(三)】元组

文章目录专栏导读1、元组简介2、元组创建3、元组查找操作4、元组删除操作5、元组修改操作6、元组增加操作7、元组内置函数专栏导读 ✍ 作者简介:i阿极,CSDN Python领域新星创作者,专注于分享python领域知识。 ✍ 本文录入于《数据分析之道》&…

自动驾驶控制概况

文章目录1. 第一章行为决策在自动驾驶系统架构中的位置2. 路径跟踪控制的种类2.1 基于自行车模型的路径跟踪控制算法2.1.1 纯跟踪控制(Pure Pursuit)算法2.1.2 后轮反馈控制算法(Rear wheel feedback)2.1.3前轮反馈控制算法&#…

防火墙 NAT地址转换

网络地址转换(NAT)是一种用于访问Internet访问模式广域网(WAN)的技术,用于将私有(保留)地址转换为合法IP地址。NAT不仅能够有效地额抵抗外部网络攻击,还能够在IP地址分配不理想&…

Windows权限提升—令牌窃取、UAC提权、进程注入等提权

Windows权限提升—令牌窃取、UNC提权、进程注入等提权1. 前言2. at本地命令提权2.1. 适用范围2.2. 命令使用2.3. 操作步骤2.3.1. 模拟提权2.3.2. at配合msf提权2.3.2.1. 生成木马文件2.3.2.2. 设置监听2.3.2.3. 设置反弹2.3.2.4. 查看反弹效果3. sc本地命令提权3.1. 适用范围3.…

瑟瑟发抖吧——用了这款软件,我的开发效率提升了50%

一、前言 开发中,一直听到有人讨论是否需要重复造轮子,我觉得有能力的人,轮子得造。但是往往开发周期短,用轮子所节省的时间去更好的理解业务,应用到业务中,也能清晰发现轮子的利弊,一定意义上…

Warshall算法

🚀write in front🚀 📜所属专栏:> 算法 🛰️博客主页:睿睿的博客主页 🛰️代码仓库:🎉VS2022_C语言仓库 🎡您的点赞、关注、收藏、评论,是对我…

树莓派Linux源码配置,树莓派Linux内核编译,树莓派Linux内核更换

目录 一 树莓派Linux的源码配置 ① 内核源码下载说明 ② 三种方法配置源码 二 树莓派Linux内核编译 ① 内核编译 ② 编译时报错及解决方案(亲测) 三 更换树莓派Linux内核 操作步骤说明 ● dmesg报错及解决方案(亲测&#xff0…

算法刷题笔记

特定方法 KMP算法:字符串匹配 逆波兰表达式:计算值 斐波那契数:动态规划 强制类型转换:整型->字符串:to_string,字符串->整型:stoi 一、数组 数组:下标从0开始,内存…

蓝桥杯嵌入式--LCD屏幕使用提升

前言之前在专栏里已经介绍过LCD相关库文件的移植,今天来介绍一下对于LCD屏幕的使用技巧。屏幕基本配置与函数一、屏幕初始化使用lcd前的必要步骤就是对LCD屏幕进行初始化操作,这也是一个容易忘记的操作。LCD_Init();\\使用lcd前的必要步骤就是对LCD屏幕进…

蓝桥杯倒计时 | 倒计时17天

作者🕵️‍♂️:让机器理解语言か 专栏🎇:蓝桥杯倒计时冲刺 描述🎨:蓝桥杯冲刺阶段,一定要沉住气,一步一个脚印,胜利就在前方! 寄语💓&#xff1a…

将一段数字转为字符串

将一段数字转为字符串 string turn(long long x){string str;while(x){int tx%10;// 数字0的ascii码为48&#xff01;char ct48;strc;// string类拼接方式x/10;}reverse(str.begin(),str.end()); // 不要忘了反转字符串return str; }例: #include<iostream> #include&l…

使用VS Code 配置Ubuntu远程C++开发环境

使用VS Code 配置Ubuntu远程C开发环境 环境准备 VS CodeWSL Ubuntu 虚拟机 配置步骤 在Ubuntu 中配置ssh远程登录 Ubuntu 配置远程登录 VsCode 安装 Remote-ssh 插件 打开vscode ssh configure ,填入相关信息 ​ Host : 主机名称&#xff0c;在左侧列表中显示的名称 ​ …

【Linux】[万字] Linux下的文件操作 及 Linux文件描述符fd 详解

在Linux操作系统中, 文件描述符是一个至关重要的概念. 理解了文件描述符, 其实就可以相当于理解了Linux系统的关于内存文件系统的整个大致框架和逻辑 但是在介绍文件描述符之前, Linux关于文件还存在许多 概念和文件操作 的知识需要介绍一下, 就当作是为解释文件描述符所做的…

IDEA连接Linux服务器进行文件操作

IDEA连接Linux服务器进行文件操作 文章目录IDEA连接Linux服务器进行文件操作连接的作用和意义安装openssh开启openssh服务验证是否开启服务安装网络工具包查看虚拟机IP地址Idea连接Linux虚拟机打开配置页面配置SFTP配置SSH完成后出现的配置文件安装big data tools插件连接的作用…

【RV1126】调试GT911,1024x600 7寸 MIPI 电容触摸屏

文章目录一、驱动注册失败二、触摸屏可以触摸&#xff0c;但是x轴数据反了三、可以触摸了&#xff0c;但是Y轴数据跳变&#xff0c;几乎只有一半的屏幕是可以正常滑动的三、汇顶触摸屏配置文件解析四、使用新的配置文件4.1 新配置解决问题4.2 测试触摸的方法在kernel增加frame …

【学习经验分享NO.21】学习资料分享(持续更新)

本博客将收集整理人工智能深度学习相关资料&#xff0c;进行整理&#xff0c;供大家学习使用。如果有需要帮忙整理的请留言。将不断更新&#xff0c;请持续关注。 一、深度学习论文资料 链接&#xff1a;https://pan.baidu.com/s/18LO5df0dp9-IE8Z3aFyrPg 提取码&#xff1a;c…

记录springboot+vue+fastdfs实现简易的文件(上传、下载、删除、预览)操作

前言说明&#xff1a;springboot vue FastDFS实现文件上传&#xff08;支持预览&#xff09;升级版 FASTDFS部分 FASTDFS安装过程&#xff1a;基于centos 7安装FastDFS文件服务器 SpringBoot部分 springboot源码实现 package com.core.doc.controller;import com.baomid…

【多线程】CAS

✨个人主页&#xff1a;bit me&#x1f447; ✨当前专栏&#xff1a;Java EE初阶&#x1f447; 目 录&#x1f40d;一. 什么是 CAS&#x1f98e;二. CAS 是怎么实现的&#x1f996;三. CAS 典型应用场景&#x1f436;1. 实现原子类&#x1f431;2. 实现自旋锁&#x1f995;四. …

进程间通信----信号量

文章目录信号量1. 问题2. 什么是信号量3. 信号量的使用4. 信号量的控制6. 实例信号量 1. 问题 程序中&#xff0c;有时存在一种特殊代码&#xff0c;最多只允许一个进程执行该部分代码。这部分区域&#xff0c;称为“临界区” 然而在多进程并发执行时&#xff0c;当一个进程进…

Pseudo-completeness(前中序遍历确定后序遍历)

题目链接&#xff1a;题目详情 - 7-16 Pseudo-completeness (pintia.cn) 样例1输入&#xff1a; 7 4 2 5 1 6 3 7 1 2 4 5 3 6 7样例1输出&#xff1a; 1 4 5 2 6 7 3 1样例2输入&#xff1a; 10 8 4 9 2 10 5 1 6 3 7 1 2 4 8 9 5 10 3 6 7样例2输出&#xff1a; 2 8 9 4…