首页 > Postgresql > PostgrelSql 9.6 hot standby 一主二从配置

PostgrelSql 9.6 hot standby 一主二从配置

2017年11月21日 发表评论 阅读评论

今年双十一,我知与行了一次,买了几台阿里云ECS服务器,有了独立的外网IP,开启了我的折腾生活
1 前言
postgres在9.0之后引入了主从的流复制机制,这点功能很像oracle的adg。在做本项实践之前,研究了好些pg的集群方案,这包括pgbouncer,bucardo,pl/proxy,pgpool,postgres-xl,总有这样那样不如意的地方,我个人更喜欢pg原生的方案。

2 我的环境
三台服务器

10.10.20.1  pgaa1 #主
10.10.20.2  pgaa2 #从一
10.10.20.3  pgaa3 #从二

3 安装
三台服务器均安全postgresql环境,方法参照:http://www.yangbaoqiu.cn/?p=475

4 主服务器配置
1)创建一个新目录,用于存放归档:

[postgres@pgaa1 pgaa]$mkdir /pgdata/pgaa/pg_archive

2)创建一个数据库用户进行主从同步。
创建用户replica,并赋予登录和复制的权限。

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

3)修改pg_hba.conf,允许replica用户来同步。
在pg_hba.conf里增加如下几行:

#yangbaoqiu add
host    replication      replica          10.10.20.0/24            md5     #允许20.x使用replica用户来复制
host    all              all              10.10.20.0/24            md5

这样,就设置了replica这个用户可以从10.10.20.x进行流复制请求,第二行的作用是接收20.x网段来的口令认证的连接。
第一行的第二个字段必须要填replication
4)修改postgresql.conf
我修改了如下选项:

listen_addresses = '*'
max_connections = 500  #从结点本项一般比主结点大
shared_buffers = 256MB
work_mem = 64MB
maintenance_work_mem = 64MB
wal_level = hot_standby
archive_mode = on
archive_command = 'cp %p /pgdata/pgaa/pg_archive/%f'
max_wal_senders = 32
wal_keep_segments = 256
wal_sender_timeout = 60s
max_standby_streaming_delay = 30s
wal_receiver_status_interval = 10s
hot_standby_feedback = on

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

[postgres@pgaa1]pg_ctl stop
[postgres@pgaa1]pg_ctl start

6)测试从的两台能否连接到主数据库。在20.2/3上运行如下命令:

[postgres@pgaa2]psql -h 10.10.20.1 -U replica postgres

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

5 从服务器配置
20.2/3执行如下相同的操作
1)从主节点拷贝数据到从节点
su – postgres
rm -rf /pgdata/pgaa/* #先将data目录下的数据都清空
pg_basebackup -h 10.10.20.1 -U replica -D /pgdata/pgaa/data -X stream -P # 从1拷贝数据到2/3(基础备份)
mkdir /pgdata/pgaa/pg_archive
2)配置recovery.conf

cp /usr/local/pgsql9.6.6/share/recovery.conf.sample /pgdata/pgaa/data/recovery.conf

3)修改recovery.conf

recovery_target_timeline = 'latest'
standby_mode = on
primary_conninfo = 'host=10.10.20.1 port=5432 user=replica password=replica'

我调整了上面的几项
4)配置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

我调整了如上几项,配置完后重启从服务器

pg_ctl stop
pg_ctl start

6 验证是否部署成功

主:

postgres=# select client_addr,sync_state from pg_stat_replication;
 client_addr | sync_state 
-------------+------------
 10.10.20.2  | async
 10.10.20.3  | async
(2 rows)

说明2/3是从服务器,异步流复制。

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

主:

$ ps aux | grep postgres|grep "wal sender"
postgres  8049  0.0  0.0 451844  2104 ?        Ss   Nov20   0:00 postgres: wal sender process replica 10.10.20.3(39812) streaming 0/900BF08
postgres 10255  0.0  0.0 451996  2232 ?        Ss   09:41   0:00 postgres: wal sender process replica 10.10.20.2(35048) streaming 0/900BF08

可以看到两个sender进程
从:

[postgres@pgaa2 pgaa]$ ps aux | grep postgres|grep "wal receiver"
postgres 24247  0.0  0.0 480156  1680 ?        Ss   09:41   0:03 postgres: wal receiver process   streaming 0/900BF08

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

至此,PostgreSQL主从流复制安装部署完成。
在主上修改数据,在从上能看到相应的变化,从是只读的。

  1. 本文目前尚无任何评论.
  1. 本文目前尚无任何 trackbacks 和 pingbacks.