基于linux7的pgsql14流复制

基于linux7的pgsql14流复制

流复制其原理为:备库不断的从主库同步相应的数据,并在备库apply每个WAL record,这里的流复制每次传输单位是WAL日志的record。

PostgreSQL物理流复制按照同步方式分为两类:
异步流复制
同步流复制
物理流复制具有以下特点:
1、延迟极低,不怕大事务
2、支持断点续传
3、支持多副本
4、配置简单
5、备库与主库物理完全一致,并支持只读

二 流复制部署
相关配置文件:
PostgreSQL主备数据库的同步设置主要涉及如下文件:
1.pg_hba.conf postgresql 主库访问规则文件
2.postgresql.conf postgresql 主库配置文件
3.recovery.conf postgresql 备库访问主库配置文件
4…pgpass postgresql 备库访问主库的密码文件
正常主备流复制情况下:
主库需要pg_hba.conf、postgresql.conf
备库需要recovery.conf、.pgpass
实际操作中,建议主、备库上都配置这四个文件,因为主、备库角色是随着倒换变更的。注:recovery.conf文件在备库上是recovery.conf,在主库上配置为recovery.done。

1.环境准备(安装好主备的数据库软件)
Ip地址 主机名 数据库版本 数据文件路径
192.168.9.99 Lege Pgsql14 /data/postgresql/data/
192.168.9.100 Lege2 Pgsql14 /data/postgresql/data/

2.主库配置

1、配置postgresql.conf
listen_addresses = ‘*’
wal_level = hot_standby # minimal, replica, or logical 使得日志支持Streaming Replication
max_wal_senders = 2 # max number of walsender processes 这个设置了可以最多有几个流复制连接,几个并发的standby数据库就设置几个
#注意:postgresql 13.0中,将wal_keep_segments重命名为wal_keep_size
#wal_keep_segments = 256 设置流复制保留的最多的xlog数目,不要设置太小导致WAL日志还没有来得及传送到standby就被覆盖。一个WAL文件默认16M
hot_standby = on # “on” allows queries during recovery 设置为备库时是否支持可读
logging_collector = on
log_directory = ‘pg_log’
log_filename = ‘postgresql-%Y-%m-%d_%H%M%S.log’

2、配置pg_hba.conf

host all all 127.0.0.1/32 trust

host all all ::1/128 trust

host replication u_standby 192.168.9.0/24 trust
或者 host replication all 192.168.9.0/24 trust

其中:

1) u_standby为在主库上创建的用于备库连接主库进行流复制的用户,此用户需要用户需要有REPLICATION权限和LOGIN权限。开户如:

create user u_standby SUPERUSER LOGIN password ‘standby123’;

2) 192.168.9.0/24为备库地址段+掩码;也可配置为具体的standby数据库地址+掩码,可配置多条。用于指定哪些地址的standby数据用哪个用户名/密码到主库获取WAL日志数据。使用地址段格式,则地址段内的IP都可以无密码对此数据库进行访问,安全性可能会降低。因此,在生产环境中建议严格按照具体主机IP方式配置。

3、 (可选)配置recovery.done、.pgpass
同备库recovery.conf、.pgpass配置。recovery.conf中如下IP、端口、用户名要对应备库信息:
primary_conninfo = ‘host=192.168.9.99 port=5432 user=u_standby’ 备库连接主库地址、端口、用户名、密码

4、 配置完毕需重启数据库
systemctl restart postgresql-14 或/usr/pgsql-14/bin/pg_ctl restart -m fast -D /data/postgresql/data/

3.全量备份
1、关闭备库,并清空数据

$/usr/pgsql-14/bin/pg_ctl stop -m fast -D /data/postgresql/data/

rm -rf /data/postgresql/data/

2、进行一次主库数据基本备份到备库

方式一(在主库操作):

//开启备份功能,pg_start_backup() 函数会在主库上发起一个在线备份,命令执行后,将数据文件压缩拷贝到备份节点上:

$postgres=# select pg_start_backup(‘backup0001’)

//将data目录下的数据远程拷贝到备库的data目录下

$scp -r /data/postgresql/data/* 10.10.10.2:/data/postgresql/data/

//关闭备份功能

$postgres=# select pg_stop_backup()

方式二(9.0版本后引入了pg_basebackup工具,在备库操作,推荐使用这种办法):

pg_basebackup工具支持对主库发起一个基准备份,发起备份需要超级用户权限或REPLICATION权限,注意max_wal_senders参数配置,因为pg_basebackup工具将消耗至少一个WAL发送进程。

//如下IP为主库地址

pg_basebackup -h 192.168.9.99 -U u_standby -F p -P -R -D /pgbak -l backup20211109

4.备库配置
1、修改postgresql.conf

hot_standby = on # “on” allows queries during recovery 设置为备库时是否支持可读

2、 配置recovery.conf(12以上可以直接写入到postgresql.conf)
最近用pg12做增量备份、流复制实验室时发现配置上有些变化,
除了将recovery.conf文件里的配置合并到主配置文件postgresql.conf中以外,
还有一个很重要的参数,设置启用备库参数standby_mode,12之后废弃了这个参数,
切换到备库建立空文件standby.signal进行触发。

###standby_mode = on
14版本两个参数都写入到postgresql.conf中
  recovery_target_timeline = ‘latest’

primary_conninfo = ‘host=192.168.9.99 port=5432 user=u_standby password=standby123’ 本库为备库会,连接主库地址、端口、用户名、密码

3、设置连接主库密码.pgpass(手动创建.pgpass文件)

192.168.9.99: 5432:replication: u_standby:standby123 //备库都主库同步WAL日志使用

192.168.9.100: 5432:replication: u_standby:standby123 //倒换后,主库降备库,新备库使用

4、 配置完毕需重启数据库

/usr/pgsql-14/bin/pg_ctl start -m fast -D /data/postgresql/data/ 或 systemctl start postgresql-14

5.结果检查
结果检查:
1、 配置成功后,可以查看主、备库的walsender、walreceiver进程。
ps -ef | grep wal
主库:
postgres 6939 6935 0 23:16 ? 00:00:00 postgres: wal writer process
postgres 6983 6935 0 23:42 ? 00:00:00 postgres: wal sender process repuser 172.17.0.5(45910) streaming 0/3000140
备库:
postgres 26481 26479 0 23:42 ? 00:00:00 postgres: wal receiver process streaming 0/3000140

postgres=# select * from pg_stat_replication;
-[ RECORD 1 ]----±-----------------------------
pid | 41927
usesysid | 16387
usename | u_standby
application_name | walreceiver
client_addr | 192.168.9.100
client_hostname |
client_port | 47180
backend_start | 2021-11-09 16:29:47.816742+08
backend_xmin |
state | streaming
sent_lsn | 0/8000148
write_lsn | 0/8000148
flush_lsn | 0/8000148
replay_lsn | 0/8000148
write_lag |
flush_lag |
replay_lag |
sync_priority | 0
sync_state | async
reply_time | 2021-11-09 16:40:18.541282+08

上一篇:使用WordPress搭建一个专属自己的博客


下一篇:阿里云数据库RDS PG联合电商SaaS领导者班牛,助力1500+品牌数智化