PostgreSQL数据库异步的流复制

一、虚拟主机安装

1.使用VMware虚拟机安装CentOS操作系统
操作系统环境
CentOS Linux release 7.2.1511 (Core)

  • 软件选择 选择安装GNOME桌面
  • 安装位置 选择自动分区

2.通过克隆的方式,生成主备两台主机。
192.168.238.132_master
192.168.238.133_slave

3.使用NAT网络方式

注意事项:
1) 开启服务,否则配置网络时,总是显示网线被拔出
PostgreSQL数据库异步的流复制

2) DHCP方式自动获取IP
测试连接,存在失败的情况,注意是否已经关闭了防火墙

psql -h192.168.238.133 -dtest -Upostgres
psql: could not connect to server: 拒绝连接
    Is the server running on host "192.168.238.133" and accepting
    TCP/IP connections on port 5432?

3) 修改网卡自启动
vi /etc/sysconfig/network-scripts/ifcfg-ens33

ONBOOT=yes

二、数据库安装配置步骤

先在192.168.238.132_master和192.168.238.133_slave均安装PostgreSQL。
安装步骤见【PostgreSQL 10.0 源码安装

主服务器
主服务器地址:192.168.238.132

先创建一个新目录:

mkdir /usr/local/pgsql/pg_archive/

1.首先需要创建一个数据库用户进行主从同步。创建用户replica,并赋予登录和复制的权限

postgres# CREATE ROLE replica login replication encrypted password 'replica'

2.修改pg_hba.conf,允许replica用户来同步
在pg_hba.conf里增加两行:

host     all             all          192.168.238.133/32          trust   #允许133连接到主服务器
host   replication      replica       192.168.238.133/32          md5   #允许133使用replica用户来复制

这样,就设置了replica这个用户可以从192.168.238.133进行流复制请求。
注:
第二个字段必须要填replication

3.修改postgresql.conf

listen_addresses = '*'   # 监听所有IP
archive_mode = on  # 允许归档
archive_command = 'cp %p /opt/pgsql/pg_archive/%f'  # 用该命令来归档logfile segment
wal_level = hot_standby 
max_wal_senders = 32 # 这个设置了可以最多有几个流复制连接,差不多有几个从,就设置几个
wal_keep_segments = 256 #设置流复制保留的最多的xlog数目
wal_sender_timeout = 60s #设置流复制主机发送数据的超时时间
max_connections = 100 # 这个设置要注意下,从库的max_connections必须要大于主库的

配置完两个文件后重启服务器。

pg_ctl restart

4.测试slave能否连接到master数据库。在slave上运行如下命令:

psql -h 192.168.238.133 -U postgres

如提示无法连接,请检查是否关闭了防火墙。
关闭防火墙

启动: systemctl start firewalld
关闭: systemctl stop firewalld
查看状态: systemctl status firewalld 
开机禁用  : systemctl disable firewalld
开机启用  : systemctl enable firewalld

看看是否能进入数据库。若可以,则正常

2.2 从服务器

1.从主节点拷贝数据到从节点

su - postgres
rm -rf /usr/local/pgsql/data/*   #先将data目录下的数据都清空
pg_basebackup -h 192.168.238.132 -U replica -D /usr/local/pgsql/data -X stream -P  # 从master拷贝数据到slave(基础备份)
mkdir /usr/local/pgsql/pg_archive

2.配置recovery.conf
复制/usr/local/pgsql/share/recovery.conf.sample 到 /usr/local/pgsql/data/recovery.conf

cp /usr/local/pgsql/share/recovery.conf.sample  /usr/local/pgsql/data/recovery.conf

修改recovery.conf

standby_mode = on    # 说明该节点是从服务器
primary_conninfo = 'host=192.168.238.132 port=5432 user=replica password=replica'  # 主服务器的信息以及连接的用户
recovery_target_timeline = 'latest'

3.配置postgresql.conf

wal_level = hot_standby
max_connections = 1000 #一般查多于写的应用从库的最大连接数要比较大
hot_standby = on #说明这台机器不仅仅是用于数据归档,也用于数据查询
max_standby_streaming_delay = 30s # 数据流备份的最大延迟时间
wal_receiver_status_interval = 10s # 多久向主报告一次从的状态,当然从每次数据复制都会向主报告状态,这里只是设置最长的间隔时间
hot_standby_feedback = on # 如果有错误的数据复制,是否向主进行反馈

2.3 验证是否部署成功
在主节点上执行:

select client_addr,sync_state from pg_stat_replication;

结果如下:

[postgres@localhost data]$ psql
psql (10.7)
Type "help" for help.

postgres=# select client_addr,sync_state from pg_stat_replication;
   client_addr   | sync_state 
-----------------+------------
 192.168.238.133 | async
(1 row)

postgres=#

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

此外,还可以分别在主、从节点上运行 ps aux | grep postgres 来查看进程:
主服务器上:

postgres 27480  2536  0 10:40 ?        00:00:00 postgres: wal sender process replica 192.168.238.133(55304) streaming 0/8000140

可以看到有一个 wal sender 进程。

从服务器上:

postgres 24721 24716  0 10:40 ?        00:00:00 postgres: wal receiver process   streaming 0/8000140

可以看到有一个 wal receiver 进程。

至此,PostgreSQL主从流复制安装部署完成。

在主服务器上插入数据或删除数据,在从服务器上能看到相应的变化。从服务器上只能查询,不能插入或删除。

参考文章:
https://www.jianshu.com/p/2d07339774c0

上一篇:PostgreSQL 锁


下一篇:PostgreSQL如何实现跨数据库访问?