在 Docker 上搭建 pg_pool 实现 PG 主从自动切换

栏目: 编程工具 · 发布时间: 7年前

内容简介:在 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

在 Docker 上搭建 pg_pool 实现 PG 主从自动切换

一、编辑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

这个时候是连接到已打开读写模式的新主库(老从库)。


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

暗趋势

暗趋势

王煜全 / 中信出版集团 / 2019-1 / 59元

《暗趋势》由得到“全球创新260讲”专栏主讲人王煜全,为你揭示藏在科技浪潮中的商业机会,教你获得把握趋势的能力,发现小趋势,抓住大机遇。 《暗趋势》聚焦于改变你生活和未来的产业,深度解读人工智能、混合现实、区块链、生物医疗等你必须关注的科技行业,并分析新科技给企业和个人带来的发展机遇,前瞻性提出企业和个人的思维与行动应对策略。 王煜全作为全球科技前哨侦察兵,以其每年5亿元的科技投资及2......一起来看看 《暗趋势》 这本书的介绍吧!

HTML 压缩/解压工具
HTML 压缩/解压工具

在线压缩/解压 HTML 代码

JSON 在线解析
JSON 在线解析

在线 JSON 格式化工具

MD5 加密
MD5 加密

MD5 加密工具