说明
这里只记录搭建和简单测试过程
不保证
ctrl+c
和ctrl+v
能完整跑起来操作系统使用的
CentOS-7.6.1810 x86_64
PostgreSQL版本号
10.8
虚拟机配置
1CPU 2G内存 20G系统盘
这里没有使用数据盘,有需要的可以自行调整!
postgres
用户默认情况下PGDATA变量是/var/lib/pgsql/10/data
环境准备
主机清单
主机名 | IP地址 | 角色 | 监听端口 |
---|---|---|---|
pg1 | 172.16.80.201 | master | 5432 |
pg2 | 172.16.80.202 | slave | 5432 |
配置/etc/hosts
1 | cat > /etc/hosts <<EOF |
安装PostgreSQL
参照此链接在两个节点上面安装好PostgreSQL,但是先不初始化数据库!!!!
基于stream主从复制配置
master节点
创建数据库
如果是有业务在跑,已经有数据了就不要做这一步操作!直接从创建复制用户那一步开始
1 | /usr/pgsql-10/bin/postgresql-10-setup initdb |
启动数据库
1 | systemctl enable --now postgres-10.service |
登录数据库
1 | psql -U postgres |
创建复制用户
1 | CREATE USER repluser REPLICATION LOGIN CONNECTION LIMIT 2 ENCRYPTED PASSWORD 'repluser_password'; |
创建.pgpass文件
1 | su - postgres |
编辑pg_hba.conf
增加配置如下
1 | host replication repluser 172.16.80.0/24 md5 |
编辑postgres.conf
增加配置参数如下
1 | wal_level = replica |
重启数据库
1 | su - postgresql |
slave节点
创建.pgpass文件
1 | su - postgres |
pg_basebackup生成备库文件
把master节点的数据以物理备份的方式,保存到slave节点。
备份过程不影响其他客户端访问。
备份出来的内容是整个数据库的所有数据,包括配置文件!
-D
指定PostgreSQL数据目录-Fp
指定输出格式为plain,这里是缩写,相当于--format=plain
-Xs
指定传输WAL日志的方法为stream
,这里是缩写,相当于--wal-method=stream
-h
指定PostgreSQL master节点-p
指定端口-U
指定用户
1 | su - postgres |
配置recovery.conf
从master节点拷贝过来的数据文件是没有
recovery.conf
的需要手动创建
好在PostgreSQL安装的时候是有这个配置文件的模板
里面都是注释
1 | su - postgres |
修改之后,内容如下
1 | 指定timeline为latest,保证主从数据差异尽可能小 |
启动备库
1 | systemctl enable --now postgresql-10.service |
验证
master节点
查看进程
1 | ps -ef | grep postgres |
查看是否有
postgres: wal sender process
查看recovery状态
登录数据库
1 | psql -U postgres -h pg1 |
输入sql语句,主库返回
f
1 | postgres=# select pg_is_in_recovery(); |
查看主备同步状态
登录数据库
1 | psql -U postgres -h pg1 |
修改一下输出格式,将每列数据以键值对的方式显示,类似于MySQL的
\G
这里是输入一次,当前会话有效,想取消就再输入一次
1 | \x |
查看同步状态
这里可以看到
sync_state
为async
,即异步流复制
1 | postgres=# select * from pg_stat_replication ; |
slave节点
查看进程
1 | ps -ef | grep postgres |
查看是否有
postgres: wal receiver process
查看recovery状态
登录数据库
1 | psql -U postgres -h pg2 |
输入sql语句,从库返回
t
1 | postgres=# select pg_is_in_recovery(); |