流复制

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软件,并初始化

镜像流量口需要配ip吗_postgresql

二、主节点配置

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