postgresql + pgpool 构建容灾高可用集群(数据同步流复制/主备自动切换),在postgresql官网看了pgpool-II的文档,发现部署比较麻烦,为了方便快捷还是使用docker部署。

一、简介

bitnami/postgresql-repmgrPostgreSQL HA对应的docker镜像,PostgreSQL HA 是 PostgreSQL 集群解决方案,其中包括 PostgreSQL 复制管理器,这是一个用于管理 PostgreSQL 集群上的复制和故障转移的开源工具。

bitnami/pgpoolPgpool-II 对应的docker镜像,是 PostgreSQL 代理。它位于 PostgreSQL 服务器和它们的客户端之间,提供连接池、负载平衡、自动故障转移和复制。

二、部署环境

  • 系统:CentOS Linux release 7.9.2009 (Core)
  • postgresql Version:postgresql-repmgr:14
  • pgpool Version:latest
  • Docker Version:20.10.21

1. 拉取docker镜像

稳妥起见,这里选用了postgresql 14版本,其次如果遭遇docker镜像拉取网络问题,可以参考我的这篇博文打造属于自己的Docker Hub镜像代理网站,或者在镜像前加入私有镜像站。

docker pull bitnami/postgresql-repmgr:14
docker pull bitnami/pgpool:latest

#私有镜像站eg
docker pull hub-mirror.c.163.com/bitnami/postgresql-repmgr:14
docker pull hub-mirror.c.163.com/bitnami/pgpool:latest

2. 启动pgsql数据库

  1. 创建文件夹并授权
cd /
mkdir data
cd data
mkdir repmgr1
mkdir repmgr2
chmod 777 /data/repmgr1
chmod 777 /data/repmgr2
  1. 创建docker网络
docker network create pg-network
  1. 启动数据库
    为了数据持久化,我们把/bitnami/postgresql目录挂载到/data/repmgr1目录下。以下两条命令可以自行做成bash脚本启动。
#pg-0数据库启动
docker run -v /data/repmgr1:/bitnami/postgresql --detach --restart always --name pg-0 -p 30350:5432 --network pg-network --env REPMGR_PARTNER_NODES=pg-0,pg-1 --env REPMGR_NODE_NAME=pg-0 --env REPMGR_NODE_NETWORK_NAME=pg-0 --env REPMGR_PRIMARY_HOST=pg-0 --env REPMGR_PASSWORD=123456 --env POSTGRESQL_PASSWORD=123456 bitnami/postgresql-repmgr:14
#pg-1数据库启动
docker run -v /data/repmgr2:/bitnami/postgresql --detach --restart always --name pg-1 -p 30351:5432 --network pg-network --env REPMGR_PARTNER_NODES=pg-0,pg-1 --env REPMGR_NODE_NAME=pg-1 --env REPMGR_NODE_NETWORK_NAME=pg-1 --env REPMGR_PRIMARY_HOST=pg-0 --env REPMGR_PASSWORD=123456 --env POSTGRESQL_PASSWORD=123456 bitnami/postgresql-repmgr:14
  1. 查看启动状态
docker ps

3. 启动Pgpool

注意,这里的--add-host参数对应的IP是你本地的宿主机IP,请自行修改。

docker run --detach --restart always --name pgpool -p 9999:5432 \
  --env PGPOOL_BACKEND_NODES=0:pg-0:30350,1:pg-1:30351 \
  --env PGPOOL_SR_CHECK_USER=postgres \
  --env PGPOOL_SR_CHECK_PASSWORD=123456 \
  --env PGPOOL_ENABLE_LDAP=no \
  --env PGPOOL_POSTGRES_USERNAME=postgres \
  --env PGPOOL_POSTGRES_PASSWORD=123456 \
  --env PGPOOL_ADMIN_USERNAME=postgres \
  --env PGPOOL_ADMIN_PASSWORD=123456 \
  --add-host=pg-0:192.168.1.204 \
  --add-host=pg-1:192.168.1.204 \
  bitnami/pgpool:latest

启动成功后,查看pgpool日志,通过pgpool可以实现数据库的负载均衡和读写分离。

4. 测试验证

  1. navicat连接pgpool,创建user表并插入数据,看看pg-0pg-1是否同步插入。


pgpool创建user表,插入数据

  1. 验证:pg-0pg-1同步插入

以上方法非常简单,最后程序直接访问9999端口即可实现读写分离。

缺点:
只能再一个宿主机上执行,不能跨主机。Pgpool和Pgsql有更多的高可用方法,后续还可以深入,多服务器部署及新增组件等。

参考地址:
官网WIKI
postgresql + pgpool 构建容灾高可用集群(数据同步流复制/主备自动切换)
pgpool-II 4.3 中文手册
Postgresql通过docker进行高可用部署

使用docker部署pg集群(postgresql+postgis+pgrouting+pgpool)