内容简介:在 Docker 上搭建 pg_pool 实现 PG 主从自动切换
接上篇文章《在 Docker 上搭建PostGreSQL流复制》,我们接着对pg_pool进行容器化,实现PG的主从自动切换。
熟悉pg_pool的同学都知道,在pg_pool探测到PG主库失败,需要提升主库时,会执行一个failover_command命令,简单地做法是可以touch一个trigger file,此trigger file对应到PG从库的recovery.conf里面的trigger_file,从而实现从库在主库失败后自动被promte为主库。在不使用容器的时候,这个目的是很容易实现的,pg_pool与从库能够同时访问一个共享路径即可,但是在容器化之后,这个目的怎么实现呢?我们是通过docker的shared-storage volume来实现的。
整体架构如下:
Host1 : 192.168.17.61
Host2 : 192.168.17.62
一、编辑pg_pool2的Dockerfile
FROM ubuntu |
ENV PGP2_VER 3.6.2 |
RUN apt-get update && \ |
apt-get install -y curl build-essential libpq-dev vim postgresql-client ssh |
# |
# Build pg pool2 |
# |
RUN curl -L -o pgpool-II-${PGP2_VER}.tar.gz http://www.pgpool.net/download.php?f=pgpool-II-${PGP2_VER}.tar.gz && \ |
tar zxvf pgpool-II-${PGP2_VER}.tar.gz && \ |
cd /pgpool-II-${PGP2_VER} && \ |
./configure && \ |
make && \ |
make install && \ |
ldconfig && \ |
rm -rf /pgpool-II-${PGP2_VER} && \ |
rm /pgpool-II-${PGP2_VER}.tar.gz |
# |
# Configure pg pool2 |
# |
ENV PCP_USER docker |
ENV PCP_PASS docker |
RUN mkdir /var/log/pgpool |
RUN mkdir /var/run/pgpool && \ |
cp /usr/local/etc/pgpool.conf.sample /usr/local/etc/pgpool.conf && \ |
cp /usr/local/etc/pcp.conf.sample /usr/local/etc/pcp.conf && \ |
cp /usr/local/etc/pool_hba.conf.sample /usr/local/etc/pool_hba.conf && \ |
echo ${PCP_USER}:`pg_md5 ${PCP_PASS}` >> /usr/local/etc/pcp.conf && \ |
cd /usr/local/etc && \ |
pg_md5 -m -u $PCP_USER $PCP_PASS |
EXPOSE 9999 9898 |
CMD [ "pgpool" , "-n" , "-d" , "-D" ] |
二、创建pgpool2的docker镜像
docker build -t pgpool2 .
三、创建一个容器卷(container3)
docker create -v /dbdata --name dbstore ubuntu /bin/true
四、编辑从库的recovery.conf
standby_mode = 'on' |
primary_conninfo = 'host=192.168.17.61 port=5436 user=repuser password=repuser keepalives_idle=60' |
trigger_file = '/dbdata/primary_down' |
五、重启从库
docker run
--name pg_slv \
--volumes-from dbstore \
-v /storage/docker/postgresql:/var/lib/postgresql \
-v /backup/postgresql:/backup \
-p 5436:5432 \
-d eg_postgresql
六、动pgpool2(container4)
docker run -it --volumes-from dbstore --name pgpool2 -p 9999:9999 -d pgpool2
注:通过将dbstore这个容器的volume都mount到从库和pgpool2的容器里面,实现了在两个容器里面共享/dbdata此路径的目的。
七、进入pgpool2的容器,修改相关参数
docker exec -it pgpool2 /bin/bash
vi /usr/local/etc/pgpool.conf
shared-storage volumenum_init_children 300
master_slave_mode = on
master_slave_sub_mode = 'stream'
failover_command = 'touch /dbdata/primary_down'
enable_pool_hba = on
pool_passwd = 'pool_passwd'
sr_check_user = 'repuser'
sr_check_password = 'repuser'
listen_addresses = '*'
backend_hostname0 = 'localhost'
backend_port0 = 5432
backend_weight0 = 1
backend_data_directory0 = '/var/lib/pgsql/data'
backend_flag0 = 'ALLOW_TO_FAILOVER'
backend_hostname1 = 'host2'
backend_port1 = 5433
backend_weight1 = 1
backend_data_directory1 = '/data1'
backend_flag1 = 'ALLOW_TO_FAILOVER'
。。。。。。any parameter you want to modify。。。。。。
vi pool_hba.conf
。。。。。。
生成 pool_password :
pg_md5 --md5auth --username=postgres --prompt
mkdir /var/log/pgpool/
八、重启pgpool2
docker restart pgpool2
九、连接pgpool
psql -h 192.168.17.62 -p 9999 -U postgres
show pool_nodes;
十、 测试主从自动切换
1 ,关闭主库
docker stop pg_pri
2, 查看从库日志,已经自动被提升为主库,并且可读写
3 ,查看pgpool的视图
show pool_nodes;
提示server失败
4 ,重连
psql -h 192.168.17.62 -p 9999 -U postgres
这个时候是连接到已打开读写模式的新主库(老从库)。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网
猜你喜欢:- 搭建Redis主从+哨兵模式
- Docker搭建MySQL主从复制
- MySQL主从复制搭建及详解
- redis的主从集群环境搭建
- MySQL -- 基于Docker搭建主从集群
- MySQL 主从复制搭建,基于日志(binlog)
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。