PostgrelSql 9.6 hot standby 一主二从配置
今年双十一,我知与行了一次,买了几台阿里云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主从流复制安装部署完成。
在主上修改数据,在从上能看到相应的变化,从是只读的。
近期评论