流复制
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