PostgreSQL的流复制配置

基础信息

PostgreSQL

版本:10.4
主库db:master 监听端口5432
备库db:slave 监听端口5432

机器信息

1
2
3
4
# cat /etc/redhat-release
CentOS Linux release 7.4.1708 (Core)
# uname -a
Linux 192-168-1-16 3.10.0-693.5.2.el7.x86_64 #1 SMP Fri Oct 20 20:32:50 UTC 2017 x86_64 x86_64 x86_64 GNU/Linux

配置主库

创建复制用户

1
CREATE USER repl REPLICATION LOGIN CONNECTION LIMIT 2 ENCRYPTED PASSWORD 'xxxxx';

创建.pgpass

1
2
3
4
su postgres
vim ~/.pgpass
slave:5432:replication:repl:xxxxx
chmod 600 ~/.pgpass

配置pg_hba.conf

增加如下信息

1
host   replication     repl          slave         trust

配置postgresql.conf

主要配置信息

1
2
3
wal_level = replica # 增加wal归档信息,包括只读服务器需要的信息
max_wal_senders = 4 # 流复制的最大连接数
wal_keep_segments = 32 # 流复制保留的最大xlog数

重启数据库

1
systemctl restart postgresql-10.service

配置备库

创建.pgpass

1
2
3
4
su postgres
vim ~/.pgpass
master:5432:replication:repl:xxxxx
chmod 600 ~/.pgpass

使用pg_backendup生成备库

-D 为备库的数据目录

1
2
su postgres
pg_basebackup -D /opt/PostgreSQL/data -Fp -Xs -v -P -h master -p 5432 -U repl

这时表空间目录和$PGDATA目录已经复制过来了

配置备库recovery.conf

首先执行如下命令生成recovery.conf文件

1
2
find  / -name "recovery.conf.sample"
cp /usr/pgsql-10/share/recovery.conf.sample $PGDATA/recovery.conf

然后在recovery.conf中添加如下内容

1
2
3
4
recovery_target_timeline = 'latest'
standby_mode = on # 指明是否开启服务器作为一个备机。在流复制里,这个参数必须要开启。
primary_conninfo = 'host=master port=5432 user=repl password=xxxx' # 指明用于备服务器连接到主服务器的连接字符串。
trigger_file = '/opt/PostgreSQL/pg.trigger' # 指定一个触发文件让备服务器感觉到它的时候就会停止流复制(即:故障转移),不要创建这个文件。当你想主从切换的时候才需要创建它。

启动备库

1
systemctl start postgresql-10.service

测试主备同步

执行如下命令查看备库进程中有”postgres: wal receiver process”,确认主库中进程有”postgres: wal sender process”

1
ps -ef | grep postgres

进入测试数据库testdb,主库上执行如下命令返回f,备库上返回t

1
2
3
4
5
6
7
8
9
10
11
12
13
select pg_is_in_recovery();
# 主库
testdb=# select pg_is_in_recovery();
pg_is_in_recovery
-------------------
f
(1 row)
# 备库
postgres=# select pg_is_in_recovery();
pg_is_in_recovery
-------------------
t
(1 行记录)

执行如下命令查看快照,它返回主库记录点、备库记录点;主库每增加一条写入,记录点的值就会加1。

1
2
3
4
5
6
7
8
9
10
11
12
13
testdb=# select txid_current_snapshot();
txid_current_snapshot
-----------------------
1820:1820:
(1 row)

testdb=# insert into ta values(now());
INSERT 0 1
testdb=# select txid_current_snapshot();
txid_current_snapshot
-----------------------
1821:1821:
(1 row)

在主库执行如下命令可以查看主备同步状态。

1
select * from pg_stat_replication;

字段state显示的同步状态有:startup(连接中)、catchup(同步中)、streaming(同步);字段sync_state显示的模式有:async(异步)、sync(同步)、potential(虽然现在是异步模式,但是有可能升级到同步模式)
主库执行创建数据库

1
2
postgres=# create database testdb;
CREATE DATABASE

备库查看数据库已经同步成功

1
2
3
4
5
6
7
8
9
10
testdb=# \l
List of databases
Name | Owner | Encoding | Collate | Ctype | Access privileges
-----------+----------+----------+------------+------------+-----------------------
postgres | postgres | UTF8 | zh_CN.UTF8 | zh_CN.UTF8 |
template0 | postgres | UTF8 | zh_CN.UTF8 | zh_CN.UTF8 | =c/postgres +
| | | | | postgres=CTc/postgres
template1 | postgres | UTF8 | zh_CN.UTF8 | zh_CN.UTF8 | =c/postgres +
| | | | | postgres=CTc/postgres
testdb | postgres | UTF8 | zh_CN.UTF8 | zh_CN.UTF8 |

参考
  1. https://www.postgresql.org/docs/10/static/warm-standby.html#STREAMING-REPLICATION
  2. https://www.mtyun.com/library/postgresql-stream-replication
  3. https://dreamer-yzy.github.io/2015/01/24/-翻译-手把手教你配置流复制/
  4. https://www.jianshu.com/p/12bc931ebba3