程序员求职经验分享与学习资料整理平台

网站首页 > 文章精选 正文

基于PG12.2实现主从异步流复制及主从切换教程(下)

balukai 2025-02-06 13:59:08 文章精选 6 ℃

概述

今天主要介绍如何搭建PG主从流复制及主从切换,仅供参考。

PS:上篇的地址在文末链接.




PostgreSQL数据库主从异步流复制搭建

环境说明:



1、安装PG数据库(主从库进行)

用脚本进行,略。


2、主库配置

2.1、添加流复制用户

--修改/data/pgdata/postgresql.conf以下参数
wal_level = hot_standby    # 这个是设置主为wal的主机, minimal,replica or logical使得日志支持流复制
max_wal_senders = 4        # 这个设置了可以最多有几个流复制连接,差不多有几个从,就设置几个
wal_keep_segments = 256    # 设置流复制保留的最多的xlog数目,不要设置太小导致WAL日志还没有来得及传送到standby就被覆盖,一个WAL文件默认16M
hot_standby = on           # "on" allows queries during recovery  设置为备库时是否支持可读
wal_sender_timeout = 120s  # 设置流复制主机发送数据的超时时间

--检查配置
cat postgresql.conf |grep -E 'wal_level|max_wal_senders|wal_keep_segments|hot_standby|wal_sender_timeout' | grep -v '^#'


2.2、修改配置文件postgresql.conf

--修改/data/pgdata/postgresql.conf以下参数
wal_level = hot_standby    # 这个是设置主为wal的主机, minimal,replica or logical使得日志支持流复制
max_wal_senders = 4        # 这个设置了可以最多有几个流复制连接,差不多有几个从,就设置几个
wal_keep_segments = 256    # 设置流复制保留的最多的xlog数目,不要设置太小导致WAL日志还没有来得及传送到standby就被覆盖,一个WAL文件默认16M
hot_standby = on           # "on" allows queries during recovery  设置为备库时是否支持可读
wal_sender_timeout = 120s  # 设置流复制主机发送数据的超时时间

--检查配置
cat postgresql.conf |grep -E 'wal_level|max_wal_senders|wal_keep_segments|hot_standby|wal_sender_timeout' | grep -v '^#'


2.3、修改配置文件pg_hba.conf

增加如下参数

?systemctl restart postgresql


2.4、重启主库

?systemctl restart postgresql

3、从库配置

PG 12把recovery.conf废掉了,与PG 11略有不同,但大同小异。

3.1、通过pg_basebackup命令行在从库上生成基础备份

这里以/data/pgdata做数据目录,迁移之前需保证/data/pgdata目录为空

systemctl stop postgresql
rm -rf /data/pgdata/*
#-Fp表示以plain格式数据,-Xs表示以stream方式包含所需的WAL文件,-P表示显示进度,-R表示为replication写配置信息。
#备份完成,使用-R选项,在data目录下自动生成standby.signal“信号”文件(可手工使用touch命令生成)以及更新了postgresql.auto.conf文件
#postgresql.auto.conf中写入了主库的连接信息(可手工添加primary_conninfo信息)。
pg_basebackup --progress -D /data/pgdata -h xx.142 -p 55432 -U replica --password  -Fp -Xs -P -R

3.2、修改配置文件standby.singal

cat > standby.signal <


3.3、启动从库

#Permissions should be u=rwx (0700) or u=rwx,g=rx (0750)
chmod -R 750 /data/pgdata/
chown -R postgres:postgres /data/pgdata/
systemctl restart postgresql

4、主从流复制检查

4.1、检查进程

查看进程,主库所在的机器中会看到sender进程



从库所在的机器中会看到receiver进程



4.2、检查异步流复制的情况

1)主库查看复制状态

?select pid,usename,client_addr,state,sent_lsn,write_lsn,flush_lsn,replay_lsn,sync_priority,sync_state from pg_stat_replication;


参数说明:

  • pid # sender的进程
  • usename # 复制的用户用户名
  • client_addr # 复制的客户端地址
  • client_port # 复制的客户端端口
  • backend_start # 主从搭建的时间
  • state # 同步状态 startup: 连接中、catchup: 同步中、streaming: 同步
  • sent_location # Master传送WAL的位置
  • write_location # Slave接收WAL的位置
  • flush_location # Slave同步到磁盘的WAL位置
  • replay_location # Slave同步到数据库的WAL位置
  • sync_priority #同步Replication的优先度, 0: 异步、1~?: 同步(数字越小优先度越高)
  • sync_state # 有三个值,async: 异步、sync: 同步、potential: 虽然现在是异步模式,但是有可能升级到同步模式


2)查看从服务(WAL接收器进程)状态

?psql -c "\x" -c "SELECT * FROM pg_stat_wal_receiver;"


4.3、数据测试

1)主库写入数据

?create table tb1 (i int,t text);brinsert into tb1 values (1,'hwb');


2)备库查询并写入数据

?select * from tb1 ;brinsert into tb1 values (2,'hwb2');



PostgreSQL主从数据库切换

当主库出现故障时,我们需要将备库提升为主库进行读写操作。激活备库有3种方式:

1)pg_ctl 方式: 在备库主机执行 pg_ctl promote shell 脚本

2)触发器文件方式: 备库配置 recovery.conf 文件的 trigger_file 参数,之后在备库主机上创建触发器文件

3)pg_promote()函数方式,可以通过SQL命令激活备库(pg12之后)


1、识别当前库主从角色

1)查看pg_is_in_recovery()视图

?psql -c "\x" -c "SELECT * FROM pg_stat_wal_receiver;"

2)pg_controldata识别

pg_controldata 结果为cluster state是in production则为主库;结果为cluster state是in archive recovery则为备库。

?./pg_controldata -D /data/pgdata/ | grep cluster



3)查看pg_stat_replication

--查询到结果为主库,查询不到结果为备库
select pid, application_name, client_addr, client_port, state, sync_state from pg_stat_replication;  



2、基于pg_promote函数主从切换

2.1、关闭主库,模拟故障

?systemctl stop postgresql

2.2、激活备库

pg_promote语法:

?pg_promote(wait boolean DEFAULT true, wait_seconds integer DEFAULT 60)

两个参数:

wait: 表示是否等待备库的 promotion 完成或者 wait_seconds 秒之后返回成功,默认值为 true。

wait_seconds: 等待时间,单位秒,默认 60

?psql -c "\x" -c "select pg_promote(true,60);"


2.3、验证

cd /usr/local/postgres/bin
date && ./pg_controldata -D /data/pgdata/ | grep cluster


至此便完成备库的激活,当原主库修复完后,我们可重复之前步骤将原主库作为新的备库使用。


2.4、原主库切换为新备库(在原主库进行)

cat > standby.signal < postgresql.auto.conf <



后面会分享更多devops和DBA方面内容,感兴趣的朋友可以关注下~

最近发表
标签列表