Postgresql通过docker进行高可用部署 pgpool
Postgresql通过docker进行高可用部署 pgpool
在postgresql官网看了pgpool-II的文档,发现部署比较麻烦
pgpool-II官方文档:Documentation - pgpool Wiki
为了方便快捷还是使用docker部署,然后在dockerhub上找到了相关的镜像:
bitnami/postgresql-repmgr
和bitnami/pgpool
从如下截图中可以看到下载量还是很高的:
简单介绍就是:
bitnami/postgresql-repmgr
是PostgreSQL HA
对应的docker镜像,PostgreSQL HA
是 PostgreSQL 集群解决方案,其中包括 PostgreSQL 复制管理器,这是一个用于管理 PostgreSQL 集群上的复制和故障转移的开源工具。
bitnami/pgpool
是Pgpool-II
对应的docker镜像,是 PostgreSQL 代理。它位于 PostgreSQL 服务器和它们的客户端之间,提供连接池、负载平衡、自动故障转移和复制。
试验环境
两台机器:server-0:192.168.30.141、server-1:192.168.30.134
pg-0、pg-1代表postgresql-repmgr容器
pg-0做主库,pg-1做从库
系统:ubuntu20.04
docker版本20.10.12
docker-compose版本1.25.0
需要准备的镜像
bitnami/postgresql-repmgr:14
对应着postgresql14
bitnami/pgpool:4
修改hosts文件
分别修改server-0、server-1上的hosts文件
sudo vim /etc/hosts
添加下面的内容
text
192.168.30.141 pg-0 192.168.30.134 pg-1
部署数据库服务器
在server-0的创建文件:touch ~/pgdb/docker-compose.yml
yaml
version: '2'services:pg-0:image: bitnami/postgresql-repmgr:14network_mode: "host"container_name: "pgrepmgr0"ports:- 5432volumes:- ./data:/bitnami/postgresqlenvironment:- POSTGRESQL_POSTGRES_PASSWORD=adminpassword- POSTGRESQL_USERNAME=customuser- POSTGRESQL_PASSWORD=custompassword- POSTGRESQL_DATABASE=customdatabase- POSTGRESQL_NUM_SYNCHRONOUS_REPLICAS=1- REPMGR_USERNAME=repmgr- REPMGR_PASSWORD=repmgrpassword- REPMGR_PRIMARY_HOST=pg-0- REPMGR_PRIMARY_PORT=5432- REPMGR_PARTNER_NODES=pg-0,pg-1:5432- REPMGR_NODE_NAME=pg-0- REPMGR_NODE_NETWORK_NAME=pg-0- REPMGR_PORT_NUMBER=5432restart: always
在server-1的创建文件:touch ~/pgdb/docker-compose.yml
yaml
version: '2'services:pg-1:image: bitnami/postgresql-repmgr:14network_mode: "host"container_name: "pgrepmgr1"volumes:- ./data:/bitnami/postgresqlenvironment:- POSTGRESQL_POSTGRES_PASSWORD=adminpassword- POSTGRESQL_USERNAME=customuser- POSTGRESQL_PASSWORD=custompassword- POSTGRESQL_DATABASE=customdatabase- POSTGRESQL_NUM_SYNCHRONOUS_REPLICAS=1- REPMGR_USERNAME=repmgr- REPMGR_PASSWORD=repmgrpassword- REPMGR_PRIMARY_HOST=pg-0- REPMGR_PRIMARY_PORT=5432- REPMGR_PARTNER_NODES=pg-0,pg-1:5432- REPMGR_NODE_NAME=pg-1- REPMGR_NODE_NETWORK_NAME=pg-1- REPMGR_PORT_NUMBER=5432restart: always
为了数据持久化,我们把/bitnami/postgresql目录挂载到当前的data目录中
docker-compose up
的时候应该会出现权限问题,这个时候我们给新建的data目录相应权限就行了,执行如下命令:
sudo chgrp -R root data
sudo chmod -R g+rwX data
再次docker-compose up -d
应该就好了
部署pgpool
server-0中
为了后续方便修改配置文件,我们把配置文件挂载出来
首先在创建配置文件./conf/myconf.conf
然后在创建文件touch ~/pgpool/docker-compose.yml
:
yaml
version: '2.1' services:pgpool:image: bitnami/pgpool:4container_name: "pgpool"network_mode: "bridge"ports:- 9999:5432volumes:- ./conf/myconf.conf:/config/myconf.confenvironment:- PGPOOL_USER_CONF_FILE=/config/myconf.conf- PGPOOL_BACKEND_NODES=0:pg-0:5432,1:pg-1:5432- PGPOOL_SR_CHECK_USER=repmgr- PGPOOL_SR_CHECK_PASSWORD=repmgrpassword- PGPOOL_ENABLE_LDAP=no- PGPOOL_POSTGRES_USERNAME=postgres- PGPOOL_POSTGRES_PASSWORD=adminpassword- PGPOOL_ADMIN_USERNAME=admin- PGPOOL_ADMIN_PASSWORD=adminpassword- PGPOOL_ENABLE_LOAD_BALANCING=yes- PGPOOL_POSTGRES_CUSTOM_USERS=customuser- PGPOOL_POSTGRES_CUSTOM_PASSWORDS=custompasswordrestart: alwaysextra_hosts:- "pg-0:192.168.30.141"- "pg-1:192.168.30.134"healthcheck:test: ["CMD", "/opt/bitnami/scripts/pgpool/healthcheck.sh"]interval: 10stimeout: 5sretries: 5
docker-compose up后看没有报错就好了,通过pgpool可以实现数据库的负载均衡和读写分离
测试
测试数据能否共享
用navicat连接pgpoll
创建一个表插入数据后看pg-0和pg-1是否一致
创建users表然后插入两条数据:
而且pg-1从库只能读不能写,在pg-1中直接修改数据会报如下错误:
测试能否故障转移
我们停掉主库pg-0后查看pgpool服务日志
从日志中可以看到当pg-0挂掉后会再重试5次,如果还访问不了会执行find_primary_node方法查找可以作为主节点的节点,然后把找到节点设置为新的主节点,所以现在pg-1是主节点,这个时候我们访问pgpoll还是能访问的,现在在users表里面再添加一行数据:
然后去pg-1中查看一下,数据是同步的
我们在把pg-0启动起来。然后看pgpool日志如下,pg-1是可以成功链接到pgpool的
看pg-1的日志如下:
会发现就算pg-0重新启动器来了,但是pg-1还是主节点不变,pg-0又会成为副节点。
去pg-0中查看,刚刚新插入的数据也能同步的。
- 卷积神经网络使用到的公式
- VirtualBox中Windows 7虚拟机无法全屏显示怎么办?
- 服务器iis短文件名漏洞,IIS短文件名漏洞分析及一个实例
- LRUCache算法
- 通过软件架构来达到易用性
- 程序与软件的易用性
- Lion蠕虫
- 强力删除文件或文件夹
- skipped: maximum number of running instances reached (1)
- 九、路由原理与路由协议
- 前途迷茫不知.NET与JAVA那个好
- VC知识库的一篇文章
- 二叉树的五种遍历方式
- (亲测可用)html5 file调用手机摄像头
- SSL单向、双向认证
- Python爬虫爬取动态网页
- 基于直方图的图像增强算法(HE、CLAHE)之(二)