流复制
1、物理复制,基于WAL日志的实例级复制
2、其核心原理是主库将WAL日志流发送给备库,备库接收到WAL日志后进行重做
3、只能复制整个PostgreSQL实例,能对DDL操作进行复制
4、主库可读可写,备库只允许查询
5、大版本必须一致
6、根据同步方式分为异步流复制和同步流复制
相关配置
wal_level = replica
-
wal_level 控制wal日志的输出级别,有minial、replica、logical三种
-
minial 记录的wal日志最少,除了记录异常关闭需要恢复时的wal信息外,其它操作都不记录
-
replica 会记录支持wal归档、复制和备库中启用只读查询等操作所需要的wal信息
-
logical 记录的wal日志最多,包含了逻辑复制所需的wal信息
-
开启流复制至少需要replica,replica也是默认模式
-
重启生效
archive_mode = on
-
off 表示不开启归档
-
on 表示启用归档并需要配置archive_command参数,将wal日志归
-
always 正常情况下和on一样,在存档恢复或待机模式下也被启用
-
重启生效
archive_command 设置归档命令
-
本机归档 archive_command = 'cp %p /data/pgsql/13/archive_wals/%f'
-
远程归档 archive_command = 'scp %p postgres@192.168.1.100:/walbackup/%f'
-
%p 包含完整路径信息的wal日志文件名
-
%f 不包含完整路径信息的wal日志文件名
-
无需重启,reload即可
max_worker_processes = 8
-
the maximum number of background processes ,默认值8
max_wal_senders 主库上最大wal sender进程数
-
默认值10,不能超过max_connection
-
pg_basebackup备份时会消耗此进程
-
通常一个流复制备库消耗主库一个wal sender进程
host_standby = on
-
开启后备库支持只读SQL
-
12之后此值默认为on
wal_keep_segments = 512
-
主库保留wal数量,异步同步
-
13中无此配置项
synchronous_commit
-
on:表示本地 wal fsync,同步standby wal fsync,即两份持久化的wal日志
-
remote_apply:表示本地wal fsync,同步standby wal fsync并且应用完成,延迟最高
-
remote_write:表示本地WAL fsync,同步standby WAL 异步write完成。一份持久化,备库的WAL可能还在OS CACHE中
-
local:表示本地WAL fsync
-
off:表示本地WAL写到walbuffer中即返回客户端事务提交成功的ACK,为异步提交
异步流复制
指主库上提交事务时不需要等待备库接收WAL日志并写入到备库WAL日志文件时返回成功,
对于12及以上,recovery.conf己经取消,此文件中的参数合并到 postgresql.conf,
若 recovery.conf 存在,数据库无法启动
新增 recovery.signal 标识文件,表示数据库处于 recovery 模式
新增加 standby.signal 标识文件,表示数据库处于 standby 模式
一、基础环境,两台机器安装postgresql13-server软件,并初始化
二、主节点配置
1、postgresql.conf
wal_level = replica
archive_mode = on
archive_command = 'cp %p /data/pgsql/13/archive_wals/%f'
max_worker_processes = 16
max_wal_senders = 10
host_standby = on
synchronous_commit = on
2、创建同步用户
create user repuser with login replication password 'repuser';
3、pg_hba.conf 添加
host replication repuser 192.168.17.130/32 md5
三、备节点配置
1、创建~/.pgpass
192.168.17.120:5432:replication:repuser:repuser
chmod 0600 ~/.pgpass
2、拷贝数据文件,使用pg_basebackup命令
/usr/pgsql-13/bin/pg_basebackup -R -D /var/lib/pgsql/13/data -Fp -Xs -v -P -h 192.168.17.120 -p 5432 -U repuser
-
-D, --pgdata=DIRECTORY 指定备份写到那个目录
-
-F, --format=p|t 指定输出的格式p 为plain ,t tar压缩文件
-
-r, --max-rate=RATE maximum transfer rate to transfer data directory(in kB/s, or use suffix "k" or "M")
-
-R, --write-recovery-conf 在备份时生成 standby.signal 文件, postgresql.auto.conf 文件中添加 primary_conninfo 参数信息
-
-S, --slot=SLOTNAME replication slot to use
-
-T, --tablespace-mapping=OLDDIR=NEWDIR relocate tablespace in OLDDIR to NEWDIR
-
-x, --xlog 包含恢复是需要的WAL
-
-X, --xlog-method=fetch|stream include required WAL files with specified method
-
--xlogdir=XLOGDIR location for the transaction log directory
-
-z, --gzip 与tar输出模式配合使用,表明输出的tar备份经过gzip压缩
-
-Z, --compress=0-9 压缩级别,数字越大越耗cpu
3、启动备节点
systemctl start postgresql13-server
四、查询状态
1、查询状态(主库)
select state,sync_state from pg_stat_replication;
streaming async
-
async代表异步复制
-
sync 代表同步复制
2、主备库查询
select * from pg_is_in_recovery();
t是备库,f是主库
同步流复制
在异步复制基础上操作
一、配置主节点
1、postgresql.conf
synchronous_standby_names = 'pgslave001'
2、重新加载配置文件
pg_ctl reload
二、配置备节点
1、postgresql.conf
primary_conninfo = 'host=192.168.17.120 port=5432 user=repuser application_name=pgslave001'
2、重启库
systemctl restart postgresql13-server