Redhat LINUX 9.3 + PG 16.1 搭建主备流复制

一直想搭建一个PG流复制,最近正好有一个新环境,操作系统是最新的,rhel 9.3,数据库是最新的 pg 16.1,借鉴了网上的步骤,尤其是小工到专家的内容,在此谢过。

1.安装环境

1)IP:
主:192.168.133.151 server1
备:192.168.133.152 server2


2)操作系统版本:
[postgres@server2 data]$ cat /etc/redhat-release 
Red Hat Enterprise Linux release 9.3 (Plow)

3)数据库版本:

postgres@[local]:5432/postgres-11653#=select version();
                                                    version                                                     
----------------------------------------------------------------------------------------------------------------
 PostgreSQL 16.1 on x86_64-pc-linux-gnu, compiled by gcc (GCC) 11.4.1 20230605 (Red Hat 11.4.1-2.1.0.1), 64-bit
(1 row)

2.创建主备流复制

2.1 修改 /etc/hosts 文件(主备)

vim /etc/hosts

192.168.133.151 server1
192.168.133.152 server2

2.2 主库设置


1)建立同步用户

postgres=# create role rep1 login replication encrypted password 'rep1';

2) 配置复制认证配置

vim $PGDATA/pg_hba.conf

host    replication     rep1            server2                 md5


3) 修改$PGDATA/postgres.conf

listen_addresses = '*'
port=5432
wal_level = replica
max_wal_senders=10
archive_mode = on
archive_timeout=1800

archive_command = 'cp %p /home/postgres/arch/%f'
restore_command = 'cp /home/postgres/arch/%f %p'
recovery_target_timeline = 'latest'
full_page_writes = on
wal_log_hints = on

logging_collector = on
log_directory = 'pg_log'
log_filename = 'postgresql-%Y-%m-%d.log'

--下面参数设置大一些,否则,后面主备切换,可能出现找不到日志文件的问题
min_wal_size = 800MB
wal_keep_size = 1024

4).重启主库,让参数生效

pg_ctl restart

2.3 备库设置

1)初始化,直接从主库备份就行

pg_basebackup -h server1 -p 5432 -U repl -X stream -R -Fp -P -D /pgdata/data

-h:指定要连接的服务器的主机名或IP地址。
-U:指定连接使用的用户名。
-Fp:指定备份的格式。在这种情况下,备份以纯文本格式存储。
-P:指定在备份过程中显示进度信息。
-X stream:指定备份的流式传输方法。
-R:指定包括所有必需的WAL文件以进行一致性备份。
-D:指定备份存储的目录。

2) 修改参数,加上下面参数

hot_standby = on #在备份的同时允许查询,默认值
max_standby_streaming_delay = 30s #可选,流复制最大延迟
wal_receiver_status_interval = 10s #可选,从向主报告状态的最大间隔时间
hot_standby_feedback = on #可选,查询冲突时向主反馈


3)配置$PGDATA/data/pg_hba.conf
host    replication     rep1            server1                 md5 #这里修改主机名为主机的

4) 重启让配置生效
pg_ctl start


3.验证

3.1 查看主备进程

1)主库端

[postgres@server1 data]$ ps -ef|grep wal
postgres    3003    2998  0 21:57 ?        00:00:00 postgres: walwriter 
postgres    3063    2998  0 22:08 ?        00:00:00 postgres: walsender rep1 192.168.133.152(49190) streaming 0/260021C8
postgres    3080    1518  0 22:13 pts/0    00:00:00 grep --color=auto wal
[postgres@server1 data]$ 

2)备库端

[postgres@server2 data]$ ps -ef|grep wal
postgres   11355   11345  0 22:08 ?        00:00:00 postgres: walreceiver streaming 0/260021C8
postgres   11373    9351  0 22:14 pts/0    00:00:00 grep --color=auto wal
[postgres@server2 data]$ 

3.2 主库切换日志

postgres@[local]:5432/postgres-3100#=select pg_switch_wal();
 pg_switch_wal 
---------------
 0/260021E0
(1 row)

postgres@[local]:5432/postgres-3100#=\! ls -ltr /pgdata/data/pg_wal
总用量 458768
-rw------- 1 postgres postgres       41 12月 15 23:16 00000002.history
-rw------- 1 postgres postgres 16777216 12月 17 20:09 00000002000000000000000D
-rw------- 1 postgres postgres 16777216 12月 17 20:22 00000002000000000000000E
-rw------- 1 postgres postgres 16777216 12月 17 20:22 00000002000000000000000F
-rw------- 1 postgres postgres 16777216 12月 17 20:25 000000020000000000000010
-rw------- 1 postgres postgres 16777216 12月 17 20:28 000000020000000000000011
-rw------- 1 postgres postgres 16777216 12月 17 20:28 000000020000000000000012.partial
-rw------- 1 postgres postgres       84 12月 17 20:29 00000003.history
-rw------- 1 postgres postgres 16777216 12月 17 20:34 000000030000000000000012
-rw------- 1 postgres postgres 16777216 12月 17 21:04 000000030000000000000013
-rw------- 1 postgres postgres 16777216 12月 17 21:26 000000030000000000000014
-rw------- 1 postgres postgres 16777216 12月 17 21:29 000000030000000000000015
-rw------- 1 postgres postgres 16777216 12月 17 21:29 000000030000000000000016
-rw------- 1 postgres postgres 16777216 12月 17 21:30 000000030000000000000017
-rw------- 1 postgres postgres 16777216 12月 17 21:30 000000030000000000000018
-rw------- 1 postgres postgres 16777216 12月 17 21:31 000000030000000000000019
-rw------- 1 postgres postgres 16777216 12月 17 21:31 00000003000000000000001A
-rw------- 1 postgres postgres 16777216 12月 17 21:33 00000003000000000000001B
-rw------- 1 postgres postgres 16777216 12月 17 21:33 00000003000000000000001C
-rw------- 1 postgres postgres 16777216 12月 17 21:47 00000003000000000000001D
-rw------- 1 postgres postgres 16777216 12月 17 21:47 00000003000000000000001E
-rw------- 1 postgres postgres 16777216 12月 17 21:50 00000003000000000000001F
-rw------- 1 postgres postgres 16777216 12月 17 21:50 000000030000000000000020
-rw------- 1 postgres postgres 16777216 12月 17 21:53 000000030000000000000021
-rw------- 1 postgres postgres 16777216 12月 17 21:53 000000030000000000000022
-rw------- 1 postgres postgres 16777216 12月 17 21:57 000000030000000000000023
-rw------- 1 postgres postgres 16777216 12月 17 21:58 000000030000000000000024
-rw------- 1 postgres postgres 16777216 12月 17 21:58 000000030000000000000025
-rw------- 1 postgres postgres      341 12月 17 21:58 000000030000000000000025.00000028.backup
-rw------- 1 postgres postgres 16777216 12月 17 22:17 000000030000000000000026
drwx------ 2 postgres postgres     4096 12月 17 22:17 archive_status
-rw------- 1 postgres postgres 16777216 12月 17 22:17 000000030000000000000027
postgres@[local]:5432/postgres-3100#=

--备库

[postgres@server2 data]$ ls -ltr /pgdata/data/pg_wal
总用量 49156
-rw------- 1 postgres postgres       84 12月 17 21:58 00000003.history
-rw------- 1 postgres postgres 16777216 12月 17 21:58 000000030000000000000025
drwx------ 2 postgres postgres       72 12月 17 22:17 archive_status
-rw------- 1 postgres postgres 16777216 12月 17 22:17 000000030000000000000026
-rw------- 1 postgres postgres 16777216 12月 17 22:17 000000030000000000000027

3.3 查看当前备库状态

[postgres@server2 data]$ psql
psql (16.1)
Type "help" for help.

postgres@server2:5432/postgres-11485#=select pg_is_in_recovery();
 pg_is_in_recovery 
-------------------
 t
(1 row)


postgres@server1:5432/postgres-3210#=select pg_is_in_recovery();
 pg_is_in_recovery 
-------------------
 f
(1 row)


t :true,意味着处于 recovery 状态
f :false,意味着处于正常服务状态


3.4 主库查询

postgres@server1:5432/postgres-3210#=select pid, usename,client_addr,state,sync_state,reply_time from pg_stat_replication;
 pid  | usename |   client_addr   |   state   | sync_state |          reply_time           
------+---------+-----------------+-----------+------------+-------------------------------
 3188 | rep1    | 192.168.133.152 | streaming | async      | 2023-12-17 22:31:28.775596+08
(1 row)

postgres@server1:5432/postgres-3210#=select pid, usename,client_addr,state,sync_state,reply_time from pg_stat_replication;
-[ RECORD 1 ]------------------------------
pid         | 3188
usename     | rep1
client_addr | 192.168.133.152
state       | streaming
sync_state  | async
reply_time  | 2023-12-17 22:31:38.761116+08

sync_state表示同步模式
sent_lsn表示发送日志的起点
reply_time表示应用日志的起点

postgres@server1:5432/postgres-3210#=select * from pg_stat_replication;
-[ RECORD 1 ]----+------------------------------
pid              | 3188
usesysid         | 16409
usename          | rep1
application_name | walreceiver
client_addr      | 192.168.133.152
client_hostname  | server2
client_port      | 59278
backend_start    | 2023-12-17 22:25:07.174465+08
backend_xmin     | 
state            | streaming
sent_lsn         | 0/28000C88
write_lsn        | 0/28000C88
flush_lsn        | 0/28000C88
replay_lsn       | 0/28000C88
write_lag        | 
flush_lag        | 
replay_lag       | 
sync_priority    | 0
sync_state       | async
reply_time       | 2023-12-17 22:33:18.809739+08


3.5 备库查询

postgres@server2:5432/postgres-11485#=select * from pg_stat_wal_receiver;-[ RECORD 1 ]---------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
pid                   | 11386
status                | streaming
receive_start_lsn     | 0/28000000
receive_start_tli     | 3
written_lsn           | 0/28000C88
flushed_lsn           | 0/28000C88
received_tli          | 3
last_msg_send_time    | 2023-12-17 22:35:08.850593+08
last_msg_receipt_time | 2023-12-17 22:35:08.85238+08
latest_end_lsn        | 0/28000C88
latest_end_time       | 2023-12-17 22:30:08.735565+08
slot_name             | 
sender_host           | server1
sender_port           | 5432
conninfo              | user=rep1 password=******** channel_binding=disable dbname=replication host=server1 port=5432 client_encoding=GBK fallback_application_name=walreceiver sslmode=disable sslcompression=0 sslcertmode=disable sslsni=1 ssl_min_protocol_version=TLSv1.2 gssencmode=disable krbsrvname=postgres gssdelegation=0 target_session_attrs=any load_balance_hosts=disable

--备库日志

023-12-17 22:25:07.215 CST [11386] LOG:  started streaming WAL from primary at 0/28000000 on timeline 3
2023-12-17 22:25:08.324 CST [11347] LOG:  restartpoint starting: time
2023-12-17 22:25:08.331 CST [11347] LOG:  restartpoint complete: wrote 0 buffers (0.0%); 0 WAL file(s) added, 0 removed, 0 recycled; write=0.001 s, sync=0.001 s, total=0.007 s; sync files=0, longest=0.000 s, average=0.000 s; distance=16383 kB, estimate=16389 kB; lsn=0/28000028, redo lsn=0/28000028
2023-12-17 22:25:08.331 CST [11347] LOG:  recovery restart point at 0/28000028
2023-12-17 22:30:08.225 CST [11347] LOG:  restartpoint starting: time
2023-12-17 22:30:08.332 CST [11347] LOG:  restartpoint complete: wrote 2 buffers (0.0%); 0 WAL file(s) added, 0 removed, 0 recycled; write=0.103 s, sync=0.001 s, total=0.107 s; sync files=2, longest=0.001 s, average=0.001 s; distance=2 kB, estimate=14751 kB; lsn=0/28000BD8, redo lsn=0/28000BA0
2023-12-17 22:30:08.332 CST [11347] LOG:  recovery restart point at 0/28000BA0
2023-12-17 22:30:08.332 CST [11347] DETAIL:  Last completed transaction was at log time 2023-12-17 22:27:29.986132+08.


3.6 测试数据同步

1)主库创建表:

postgres@server1:5432/postgres-3210#=create table emp(emp int);
CREATE TABLE
postgres@server1:5432/postgres-3210#=insert into emp values(100);
INSERT 0 1
postgres@server1:5432/postgres-3210#=select * from emp;
 emp 
-----
 100
(1 row)

2) 备库验证

[postgres@server2 pg_log]$ psql -h server2
Password for user postgres: 
psql (16.1)
Type "help" for help.

postgres@server2:5432/postgres-11497#=\d
             List of relations
 Schema |      Name      | Type  |  Owner   
--------+----------------+-------+----------
 public | emp            | table | postgres
 public | pg_buffercache | view  | postgres
(2 rows)

postgres@server2:5432/postgres-11497#=select * from emp;
 emp 
-----
 100
(1 row)

通过以上可以看出,主库新增数据已经同步到备库

4.主备切换

这里模拟主库出现问题

4.1 停止主库

[postgres@server1 data]$ pg_ctl stop
waiting for server to shut down.... done
server stopped
[postgres@server1 data]$ 
[postgres@server1 data]$ 
[postgres@server1 data]$ pg_ctl status
pg_ctl: no server running

4.2 提升备库为主

pg_ctl promote

postgres@server2 pg_log]$ pg_ctl promote
waiting for server to promote.... done
server promoted
[postgres@server2 pg_log]$ pg_ctl status
pg_ctl: server is running (PID: 11345)
/u01/app/postgres/bin/postgres
[postgres@server2 pg_log]$ pg_controldata |grep stat
Database cluster state:               in production
[postgres@server2 pg_log]$ 

[postgres@server2 data]$ ls -ltr standby*
ls: 无法访问 'stand*': 没有那个文件或目录
[postgres@server2 data]$ 

[postgres@server2 data]$ ps -ef|grep wal
postgres   11569   11345  0 22:44 ?        00:00:00 postgres: walwriter 
postgres   11592    9351  0 22:46 pts/0    00:00:00 grep --color=auto wal
[postgres@server2 data]$ 

4.3 创建standby.signal文件

在新备库上(原主库) 完成

只需要创建文件即可,不需要添加内容

[postgres@server1 data]$ touch standby.signal
[postgres@server1 data]$ 
[postgres@server1 data]$ ls -ltr standby.signal
-rw-r--r-- 1 postgres postgres 0 12月 17 22:49 standby.signal


4.4 调整新备库 postgresql.auto.conf内容

在新备库的 postgresql.auto.conf 文件中添加如下内容

primary_conninfo = 'user=rep1 password=rep1 passfile=''/home/postgres/.pgpass'' channel_binding=disable host=server2 port=5432 client_encoding=GBK sslmode=disable sslcompression=0 sslcertmode=disable sslsni=1 ssl_min_protocol_version=TLSv1.2 gssencmode=disable krbsrvname=postgres gssdelegation=0 target_session_attrs=any load_balance_hosts=disable'

4.5 启动新备库


[postgres@server1 data]$ pg_ctl restart
waiting for server to shut down.... done
server stopped
waiting for server to start....2023-12-17 22:53:08.352 CST [3340] LOG:  redirecting log output to logging collector process
2023-12-17 22:53:08.352 CST [3340] HINT:  Future log output will appear in directory "pg_log".
 done
server started

4.6 验证


新备库
[postgres@server1 data]$ pg_controldata |grep state
Database cluster state:               in archive recovery

新主库
[postgres@server2 data]$ pg_controldata |grep stat
Database cluster state:               in production


[postgres@server2 data]$ psql
psql (16.1)
Type "help" for help.

postgres@[local]:5432/postgres-11653#=\x
Expanded display is on.
postgres@[local]:5432/postgres-11653#=select pid, usename,client_addr,state,sync_state,reply_time from pg_stat_replication;
-[ RECORD 1 ]------------------------------
pid         | 11644
usename     | rep1
client_addr | 192.168.133.151
state       | streaming
sync_state  | async
reply_time  | 2023-12-17 22:55:48.476883+08

postgres@[local]:5432/postgres-11653#=select * from pg_stat_replication;
-[ RECORD 1 ]----+------------------------------
pid              | 11644
usesysid         | 16409
usename          | rep1
application_name | walreceiver
client_addr      | 192.168.133.151
client_hostname  | server1
client_port      | 47196
backend_start    | 2023-12-17 22:53:08.395347+08
backend_xmin     | 
state            | streaming
sent_lsn         | 0/290001B8
write_lsn        | 0/290001B8
flush_lsn        | 0/290001B8
replay_lsn       | 0/290001B8
write_lag        | 
flush_lag        | 
replay_lag       | 
sync_priority    | 0
sync_state       | async
reply_time       | 2023-12-17 22:56:18.489045+08


到此,切换完成。

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

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

相关文章

Python PIP安装pycorrector、kemln报错

本来想装个pycorrector用一下,结果在安装其依赖包kemln的时候疯狂报错,报错关键词包括但不限于Bash、Cmake,C啥的,搜了很多文章,终于摸索到了安装的办法。 1、安装bash 去官网https://gitforwindows.org/下载bash&am…

消费者痛点怎么分析,不同行业如何营销

消费者的痛点是品牌营销中的关键因素,因为准确把握消费者的痛点,可以为品牌带来更大的市场机会。今天和大家探讨下消费者痛点怎么分析,不同行业如何营销? 今天我们会从分类、洞察、场景分析、分级与评判以及不同行业细分的角度来进…

neuq-acm预备队训练week 9 P8604 [蓝桥杯 2013 国 C] 危险系数

题目背景 抗日战争时期,冀中平原的地道战曾发挥重要作用。 题目限制 题目描述 地道的多个站点间有通道连接,形成了庞大的网络。但也有隐患,当敌人发现了某个站点后,其它站点间可能因此会失去联系。 我们来定义一个危险系数 DF…

Android动画(四)——属性动画ValueAnimator的妙用

目录 介绍 效果图 代码实现 xml文件 介绍 ValueAnimator是ObjectAnimator的父类,它继承自Animator。ValueAnimaotor同样提供了ofInt、ofFloat、ofObject等静态方法,传入的参数是动画过程的开始值、中间值、结束值来构造动画对象。可以将ValueAnimator看…

环境搭建及源码运行_java环境搭建_maven

书到用时方恨少、觉知此时要躬行;拥有技术,成就未来,抖音视频教学地址:​​​​​​​ ​​​​​​​ 1、介绍 1)管理项目依赖和版本 统一的项目依赖和版本管理 ​​​​​​​​​​​ 2)Maven支持多模块…

YoloV7改进策略:双动态令牌混合器(D-Mixer)的TransXNet,实现YoloV7的有效涨点

摘要 双动态令牌混合器(D-Mixer),一种输入依赖的方式聚合全局信息和局部细节。D-Mixer通过分别在均匀分割的特征片段上应用有效的全局注意力模块和输入依赖的深度卷积,使网络具有强大的归纳偏差和扩大的有效感受野。使用D-Mixer作为基本构建块设计了TransXNet,这是一种新…

From Human Attention to Computational Attention (1)

”is the taking possession by the mind, in clear and vivid form, of one out of what seem several simultaneously possible objects or trains of thought. It implies withdrawal from some things in order to deal effectively with others“,William Jame…

6.任务分配与执行总体设计实现

1.设计 执行任务找一个落地场景:连接设备采集参数。设备有不同的协议,如:modbus rtu、modbus tcp、opc ua、simens s7等。协议多种多样,需要的参数也不同,连接及任务执行参数存放在t_job表的link_spec中,任…

Jenkins配置代理节点时遇到的坑和解决办法

需求:服务器太满了,需要找个比较空闲的机器分担一下,看上了同网络的某开会用的笔记本,把这个本本利用起来能跑一个算一个。 但配置起来并不容易,遇到的问题有些网上也几乎找不到答案。这里记录一下能救一个是一个&…

python处理数据内存不够,python处理数据安全吗

大家好,小编为大家解答python处理数据索引的常见方法的问题。很多人还不知道python处理数据内存不够,现在让我们一起来看看吧! 学 目录 1.数据表的基本信息查看 2.查看数据表的大小 3.数据格式的查看 4、查看具体的数据分布 二、缺失值处理 …

sap table 获取 valuation class MBEW 查表获取

参考 https://www.tcodesearch.com/sap-tables/search?qvaluationclass

FastAPI访问/docs接口文档显示空白、js/css无法加载

如图: 原因是FastAPI的接口文档默认使用https://cdn.jsdelivr.net/npm/swagger-ui-dist5.9.0/swagger-ui.css 和https://cdn.jsdelivr.net/npm/swagger-ui-dist5.9.0/swagger-ui-bundle.js 来渲染页面,而这两个URL是外网的CDN,在国内响应超…

Text2SQL学习整理(二) WikiSQL数据集介绍

导语 上篇博客中,我们已经了解到Text2SQL任务的基本定义,本篇博客将对近年来该领域第一个大型数据集WikiSQL做简要介绍。 WikiSQL数据集概述 基本统计特性 WikiSQL数据集是一个多数据库、单表、单轮查询的Text-to-SQL数据集。它是Salesforce在2017年…

目标检测YOLO系列从入门到精通技术详解100篇-【目标检测】机器视觉(基础篇)(十四)

目录 前言 知识储备 常用的视觉软件 远心镜头 工业镜头倍率及视场范围的计算方法

金仓数据库kca、kcp模拟题(五)

部分金仓数据库题型 答案在后面。 -------------KCP试题------- 1、sys_ct1是一个KingbaseESV8实用控制工具,以下哪些是sys_ct1的功能? 2、下面语法中可以成功执行连接KingbaseESv8数据库“SAMPLES”的语句是? 3、ksq1是KingbaseES自带的交互式客户端。如果未设置环境变量KI…

python之双链表

双链表简单讲解 双向链表(doubly linked list)是一种链式数据结构,它的每个节点包含两个指针,一个指向前一个节点,一个指向后一个节点。与单向链表相比,双向链表可以在任何位置进行插入和删除操作&#xf…

PDF转为图片

PDF转为图片 背景pdf展示目标效果 发展过程最终解决方案:python PDF转图片pdf2image注意:poppler 安装 背景 最近接了一项目,主要的需求就是本地的文联单位,需要做一个电子刊物阅览的网站,将民族的刊物发布到网站上供…

字节开源的netPoll多路复用器源码解析

字节开源的netPoll多路复用器源码解析 引言NetPollepoll API原生网络库实现netpoll 设计思路netpoll 对比 go net数据结构 源码解析多路复用池初始化Epoll相关API可读事件处理server启动accept 事件客户端连接初始化客户端连接建立 可读事件等待读取数据 可写事件处理客户端启动…

word增加引用-endnote使用

使用软件: web of science https://webofscience.clarivate.cn/wos/alldb/basic-search; Pub Med等数据库endnote20 链接: https://pan.baidu.com/s/1VQMEsgFY3kcpCNfIyqEjtQ?pwdy1mz 提取码: y1mz 复制这段内容后打开百度网盘手机App,操作更方便哦 --…

信号与线性系统翻转课堂笔记4——连续LTI系统的微分方程模型与求解

信号与线性系统翻转课堂笔记4——连续LTI系统的微分方程模型与求解 The Flipped Classroom4 of Signals and Linear Systems 对应教材:《信号与线性系统分析(第五版)》高等教育出版社,吴大正著 一、要点 (1&#x…