PostgreSQL 10 主从同步配置

主服务器:192.168.1.99

从服务器:192.168.1.150

配置主服务器

在主服务器创建repl用户

1
CREATE ROLE repl login replication password 'd71ea3'; 

配置repl用户访问权限

1
vim /etc/postgresql/10/main/pg_hba.conf
1
host    replication     repl            192.168.1.150/32               md5

配置主服务器

1
vim /etc/postgresql/10/main/postgresql.conf
1
2
3
4
5
6
7
8
9
wal_level = replica

archive_mode = on # enables archiving; off, on, or always
# (change requires restart)
archive_command = 'rsync -zaq %p postgres@192.168.1.150:/var/lib/postgresql/wal_restore/%f && test ! -f /var/lib/postgresql/archivedir/%f && cp %p /var/lib/postgresql/archivedir/%f'

max_wal_senders = 10
wal_keep_segments = 64
wal_sender_timeout = 60s

归档命令不加入rsync也可以,只需要在建立主从同步时手动把完整备份之后的归档复制到从库,后面配置从库时候会提到。

我实际使用的归档命令还加入了自动删除旧数据

1
archive_command = 'DIR=/var/lib/postgresql/archivedir; test ! -f $DIR/%f && cp --preserve=timestamps %p $DIR/%f; find $DIR -type f -mtime +31|xargs rm -f'

重启服务

1
service postgresql restart

配置从服务器

停止服务

1
service postgresql stop

删除所有数据

1
2
3
cd /var/lib/postgresql/10/main

rm -rf *

配置从服务器

1
vim /etc/postgresql/10/main/postgresql.conf
1
hot_standby = on

切换到postgres用户

1
sudo su - postgres

从服务器上从主服务器创建初始备份,上面切换用户是为了不用调整文件权限

1
pg_basebackup -h 192.168.1.99 -U repl -D /var/lib/postgresql/10/main -F p -X stream -P -R -p 5432

Password: d71ea3

会自动生成 recovery.conf 启动之后会读取里面的配置进行主从同步

编辑recovery.conf 在结尾追加

1
2
restore_command = 'cp /var/lib/postgresql/wal_restore/%f %p'
archive_cleanup_command = 'pg_archivecleanup /var/lib/postgresql/wal_restore/ %r'

切回root

1
sudo su -

回到主服务器,如果前面主服务器归档命令没有加入rsync,那么我们现在在主服务器上 复制最近一天内修改过的归档文件到从服务器

1
2
cd /var/lib/postgresql/archivedir
find -mtime -1|xargs -n 1 -I{} scp /var/lib/postgresql/archivedir/{} postgres@192.168.1.150:/var/lib/postgresql/wal_restore/

相当于整体上从库建立起同步需要的数据 = 完整备份 + 归档文件 + WAL缓存

从服务器启动服务

1
service postgresql start

从主服务器查看从服务器同步状态

1
select application_name, sync_state from pg_stat_replication;