PostgreSQL流复制热备

PostgreSQL在9.0之后引入了主从的流复制机制,从服务器通过tcp流从主服务器中同步相应的数据。流复制允许备库更新,同时也能提供只读服务,流复制默认是异步的。

实例准备
role ip port version
master 192.168.1.2 5432 10.9
slave 192.168.1.3 5432 10.9

架构图
PostgreSQL流复制

配置主库
创建复制用户

初始化数据库

1
2
3
$ rm -rf /var/lib/pgsql/10/data/*
$ /usr/pgsql-10/bin/postgresql-10-setup initdb
Initializing database ... OK

启动数据库

1
$ systemctl start postgresql-10

创建用户repuser,并赋予复制和登录的权限。

1
2
3
4
5
6
7
8
$ su - postgres
$ psql
psql (10.9)
Type "help" for help.

postgres=# CREATE USER repuser REPLICATION LOGIN CONNECTION LIMIT 2 ENCRYPTED PASSWORD 'repuser';
CREATE ROLE
postgres=# \q
更新认证方式

编辑配置文件pg_hba.conf,新增

1
2
host    all             all          	192.168.1.3/32        trust
host replication repuser 192.168.1.3/32 md5
更新PostgreSQL配置

编辑配置文件postgresql.conf

1
2
3
4
5
listen_addresses = '*'
wal_log_hints = on
archive_mode = on
archive_command = 'cp %p /var/lib/pgsql/10/pg_archive/%f'
wal_keep_segments = 64

新增归档目录 pg_archive

1
$ mkdir /var/lib/pgsql/10/pg_archive
重启主库
1
$ systemctl restart postgresql-10
配置从库
初始化数据库
1
2
3
$ rm -rf /var/lib/pgsql/10/data/*
$ /usr/pgsql-10/bin/postgresql-10-setup initdb
Initializing database ... OK
新增文件.pgpass

postgres用户根目录下创建.pgpass,并追加认证信息

1
2
3
4
$ touch .pgpass
$ chmod 0600 .pgpass
$ cat .pgpass
192.168.1.2:5432:postgres:repuser:repuser
从主节点拷贝数据到从节点
1
2
3
4
5
$ su - postgres
Last login: Mon Aug 5 17:27:20 CST 2019 on pts/0
$ pg_basebackup -h 192.168.1.2 -U repuser -D /var/lib/pgsql/10/data/ -X stream -P
Password:
24308/24308 kB (100%), 1/1 tablespace
配置recovery.conf

拷贝配置文件recovery.conf.samplerecovery.conf

1
$ cp /usr/pgsql-10/share/recovery.conf.sample /var/lib/pgsql/10/data/recovery.conf

更新配置文件recovery.conf

1
2
3
standby_mode = on
primary_conninfo = 'host=192.168.1.2 port=5432 user=repuser password=repuser'
recovery_target_timeline = 'latest'
配置postgresql.conf
1
2
3
4
listen_addresses = '*'
wal_log_hints = on
wal_keep_segments = 64
hot_standby_feedback = on
重启从库
1
$ systemctl restart postgresql-10
验证

在主节点上命令验证

1
2
3
4
5
postgres=# select application_name, client_addr, sync_state from pg_stat_replication;
application_name | client_addr | sync_state
------------------+---------------+------------
walreceiver | 192.168.1.3 | async
(1 row)

说明192.168.1.3是从服务器,在接收流,而且是异步流复制。

可以分别在主、从节点上运行 ps -ef | grep postgres来查看进程验证

主服务器有一个 wal sender 进程

1
2
$ ps -ef | grep postgres
postgres 20645 19653 0 22:14 ? 00:00:00 postgres: wal sender process repuser 192.168.1.3(59176) streaming 0/70029E0

从服务器有一个 wal receiver 进程

1
2
$ ps -ef | grep postgres
postgres 18019 18012 0 22:14 ? 00:00:00 postgres: wal receiver process streaming 0/7002A18
----------------本文结束 感谢阅读----------------