物理流复制
- 流复制只能对PostgreSQL实例级进行复制
- 物理复制的核心原理是主库将WAL日志流发送给备库,备库接收到WAL日志流后进行重做
- 流复制能对DDL操作进行复制
- 流复制主库可读写,但从库只能读
- 流复制要求PostgreSQL大版本必须一致
一、流复制配置
ps:流复制不一定需要归档
主库
1. 主库创建replication专有用户
create user repuser replication encrypted password 'repuser';
2. 配置主库参数
wal_level = replica
max_wal_senders = 10
wal_keep_segments = 512
hot_standby = on ##该项为off,则备库不能读。
synchronous_commit = local ##主库commit完,则立马返回'success'
可选设置`
synchronous_commit = remote_write/remote_apply
synchronous_standby_names = 'node2' ## 将备用服务器选为同步备用服务
3. 配置主库pg_hba.conf
host replication repuser 192.168.152.1/32 md5
host replication repuser 192.168.152.2/32 md5
备库
1. 备库使用pg_basebackup备份数据
pg_basebackup -h192.162.152.1 -Urepuser -p5432 -D $PGDATA -Fp -Xs -v -P
2. 配置recovery.conf
recovery_target_timeline= 'latest'
standby_mode = 'on'
primary_conninfo ='host=192.168.152.1 port=5432 user=repuser password=repuser'
3. 配置备库pg_hba.conf
host replication repuser 192.168.152.1/32 md5
host replication repuser 192.168.152.2/32 md5
二、switchover主备切换
1. 确认主备库
select pg_is_in_recovery();
2. 关闭主库
pg_ctl stop
3. 备库升级为主库
pg_ctl promote
4. 老主库改为备库
$PGDATA下创建recovery.conf
recovery_target_timeline= 'latest'
standby_mode = 'on'
primary_conninfo ='host=192.168.152.2 port=5432 user=repuser password=repuser'
pg_ctl start
5. 启动新备库,观察同步状况
select usename,application_name,client_addr,sync_state from pg_stat_replication;
三、主备监控
查看复制状态
主库上查看
select usename,application_name,client_addr,sync_state from pg_stat_replication;
– async :表示备库为异步同步方式
– potential :表示备库当前为异步同步方式,如果当前的同步备库宕机后,异步备库可升级成为同步备库
– sync :当前备库为同步方式
– quorum :表示备库为 quorum standbys的候选
判断主备
1. db函数
select pg_is_in_recovery(); --f为主,t为备
2. 操作系统通过进程查看
ps -ef | grep wal | grep -v grep
3. 数据库控制文件信息
pg_controldata | grep cluster
Database cluster state: in production
--主
Database cluster state: in archive recovery
--备
4. 检查是否存在recovery.conf
ll $PGDATA/recovery.conf
相关说明
1.参数
synchronous_commit
synchronous_standby_names
synchronous_commit
commit 返回 'success',wal日志的处理方式
单实例
- on: commit时,本地wal写入磁盘即可
- off: commit时,wal写入wal_buffer即可
- local: 类似于on
流复制
- local:commit时,本地wal写入磁盘即可
- on :主库事务提交,必须等待wal日志写入备库磁盘
- remote_write:commit时,本地wal已落盘,备库wal落入缓存
- remote_apply:commit时,本地wal落盘,备库必须成功应用(对主库影响最大)
synchronous_standby_names
同步复制优选提交
synchronous_standby_names 参数的配置方式
** standby_name [,]
** [FIRST] num_sync ( standby_name [, ...])
** ANY num_sync ( standby_name [, ...])
样例解析:一主四备(slave1/ slave2/ slave3/ slave4)
-
synchronous_standby_names ='slave1,slave2'
slave1 为同步备库 ,slave2 为潜在同步备库 当1不可用时,2升级为同步备库,3和4为异步 -
synchronous_standby_names ='first 2 (slave1,slave2,slave3)'
1和2为同步备库,3为潜在同步备库,4为异步 -
synchronous_standby_names ='any 2 (slave1,slave2,slave3)
1/2/3中任意两个同步提交成功就可返回主库成功, 4 为异步
主库上查看
select usename,application_name,client_addr,sync_state from pg_stat_replication;
async :表示备库为异步同步方式
potential :表示备库当前为异步同步方式,如果当前的同步备库宕机后,异步备库可升级成为同步备库
sync :当前备库为同步方式
quorum :表示备库为仲裁备用服务器的候选人(对应any)
2.延迟复制
预防误操作
一般设置,一主两备,一备同步复制,一备延迟6/12小时
注意:延迟库要配置为异步复制,否则主库将等待
recovery_min_apply_delay = n ##延迟n毫秒复制