一、概述
1.架构图
+------------------+
| Application |
+------------------+
↓
+---------------+
| pgpool-II | ← 提供统一入口
+---------------+
↙ ↘
+------------------+ +------------------+
| PostgreSQL 主库 | | PostgreSQL 备库 |
| (Primary) | | (Standby) |
| running repmgrd | | running repmgrd |
+------------------+ +------------------+
↑ ↑
流复制 + repmgr 管理集群状态与故障切换
repmgr管理 PostgreSQL 实例之间的复制关系和 failover;pgpool-II连接到所有 PostgreSQL 实例,根据 SQL 类型路由请求;- 当主库宕机时,
repmgr自动提拔备库为新主库,并通知pgpool更新后端状态。
2.工作原理详解
1. 正常运行时
repmgr维护主从复制链路,监控节点状态。pgpool-II:- 将
INSERT/UPDATE/DELETE发往当前主库; - 将
SELECT分发到多个备库(实现读写分离); - 使用连接池减少数据库连接开销。
- 将
2. 主库宕机 → 故障转移发生
repmgrd检测到主库不可达;- 触发自动故障转移,选择一个延迟最小的备库提升为新主库;
- 更新集群元数据,其他备库指向新主库重做复制;
二、实施
1.创建目录
#挂载目录
mkdir -p /data/pgsql/pg{0..2}
mkdir -p /data/pgsql/pgpool/{data,logs,conf}
#授权,默认权限也是775
chmod 775 /data/pgsql/pg{0..2}
chmod 775 sudo mkdir -p /data/pgsql/pgpool/{data,logs,conf}
#项目目录
mkdir -p /root/pg_ha_cluster/pg_cluster
mkdir -p /root/pg_ha_cluster/pgpool
[root@vm-centos7-181 ~]# tree -L 3 pg_ha_cluster/
pg_ha_cluster/
├── pg_cluster
│ └── docker-compose.yaml
└── pgpool
└── docker-compose.yaml
2 directories, 2 files
[root@vm-centos7-181 pgsql]# cd /data/pgsql/ && tree -L 2
.
├── pg0
│ ├── conf
│ ├── data
│ └── lock
├── pg1
│ ├── conf
│ ├── data
│ └── lock
├── pg2
│ ├── conf
│ ├── data
│ └── lock
└── pgpool
├── conf
├── data
└── logs
16 directories, 0 files
2.部署pgcluster
vim /root/pg_ha_cluster/pg_cluster/docker-compose.yaml
# PostgreSQL 高可用性集群配置(使用 repmgr)
services:
# 主节点配置
pg-0:
image: docker.m.daocloud.io/bitnami/postgresql-repmgr:17
container_name: pg-0
ports:
- 5432:5432
volumes:
- pg_0_data:/bitnami/postgresql
environment:
# PostgreSQL 配置
- POSTGRESQL_POSTGRES_PASSWORD=admin
- POSTGRESQL_USERNAME=postgres
- POSTGRESQL_PASSWORD=postgres
- POSTGRESQL_DATABASE=postgres
# repmgr 必要认证配置(新增)
- REPMGR_USERNAME=repmgr
- REPMGR_PASSWORD=repmgr
- REPMGR_DATABASE=repmgr
# repmgr 集群配置
#- REPMGR_NODE_ID=1
- REPMGR_NODE_NAME=pg-0
- REPMGR_NODE_NETWORK_NAME=pg-0
- REPMGR_PRIMARY_HOST=pg-0
- REPMGR_PRIMARY_PORT=5432
- REPMGR_PARTNER_NODES=pg-0,pg-1,pg-2:5432
- REPMGR_PORT_NUMBER=5432
# 备用节点 1 配置
pg-1:
image: docker.m.daocloud.io/bitnami/postgresql-repmgr:17
container_name: pg-1
ports:
- 5433:5432
volumes:
- pg_1_data:/bitnami/postgresql
environment:
# PostgreSQL 配置
- POSTGRESQL_POSTGRES_PASSWORD=admin
- POSTGRESQL_USERNAME=postgres
- POSTGRESQL_PASSWORD=postgres
- POSTGRESQL_DATABASE=postgres
# repmgr 必要认证配置(新增)
- REPMGR_USERNAME=repmgr
- REPMGR_PASSWORD=repmgr
- REPMGR_DATABASE=repmgr
# repmgr 集群配置
#- REPMGR_NODE_ID=2
- REPMGR_NODE_NAME=pg-1
- REPMGR_NODE_NETWORK_NAME=pg-1
- REPMGR_PRIMARY_HOST=pg-0 # 指向主节点
- REPMGR_PRIMARY_PORT=5432
- REPMGR_PARTNER_NODES=pg-0,pg-1,pg-2:5432
- REPMGR_PORT_NUMBER=5432
# 备用节点 2 配置
pg-2:
image: docker.m.daocloud.io/bitnami/postgresql-repmgr:17
container_name: pg-2
ports:
- 5434:5432
volumes:
- pg_2_data:/bitnami/postgresql
environment:
# PostgreSQL 配置
- POSTGRESQL_POSTGRES_PASSWORD=admin
- POSTGRESQL_USERNAME=postgres
- POSTGRESQL_PASSWORD=postgres
- POSTGRESQL_DATABASE=postgres
# repmgr 必要认证配置(新增)
- REPMGR_USERNAME=repmgr
- REPMGR_PASSWORD=repmgr
- REPMGR_DATABASE=repmgr
# repmgr 集群配置
#- REPMGR_NODE_ID=3
- REPMGR_NODE_NAME=pg-2
- REPMGR_NODE_NETWORK_NAME=pg-2
- REPMGR_PRIMARY_HOST=pg-0 # 指向主节点
- REPMGR_PRIMARY_PORT=5432
- REPMGR_PARTNER_NODES=pg-0,pg-1,pg-2:5432
- REPMGR_PORT_NUMBER=5432
# 定义持久化卷
volumes:
pg_0_data:
driver: local
driver_opts:
type: none
o: bind
device: /data/pgsql/pg0
pg_1_data:
driver: local
driver_opts:
type: none
o: bind
device: /data/pgsql/pg1
pg_2_data:
driver: local
driver_opts:
type: none
o: bind
device: /data/pgsql/pg2
2.1.注释
以pg-0为例:
environment:
# PostgreSQL 配置
- POSTGRESQL_POSTGRES_PASSWORD=admin # PostgreSQL 超级用户(postgres)的密码
- POSTGRESQL_USERNAME=postgres # 创建的应用数据库用户名
- POSTGRESQL_PASSWORD=postgres # 应用数据库用户的密码
- POSTGRESQL_DATABASE=postgres # 创建的默认数据库名称
# repmgr 必要认证配置
- REPMGR_USERNAME=repmgr # repmgr 元数据管理用户名
- REPMGR_PASSWORD=repmgr # repmgr 用户的密码
- REPMGR_DATABASE=repmgr # 存储复制元数据的数据库名
# repmgr 集群配置
#- REPMGR_NODE_ID=1 # 节点唯一ID(主节点=1,备用节点=2,3)
- REPMGR_NODE_NAME=pg-0 # 当前节点在集群中的逻辑名称
- REPMGR_NODE_NETWORK_NAME=pg-0 # 节点在网络中的可解析名称
- REPMGR_PRIMARY_HOST=pg-0 # 主节点地址(备用节点应指向pg-0)
- REPMGR_PRIMARY_PORT=5432 # 主节点的PostgreSQL端口
- REPMGR_PARTNER_NODES=pg-0,pg-1,pg-2:5432 # 集群节点列表
- REPMGR_PORT_NUMBER=5432 # repmgr守护进程监听端口
启动
cd /root/pg_ha_cluster/pg_cluster && docker-compose up -d
3.部署pgpool
vim /root/pg_ha_cluster/pgpool/docker-compose.yaml
services:
pgpool:
image: swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/bitnami/pgpool:4.6.2-debian-12-r1
container_name: pgpool
restart: always
ports:
- "9996:5432"
volumes:
# 使用命名卷挂载数据目录
- pgpool_data:/opt/bitnami/pgpool
# 挂载自定义配置文件
- pgpool_conf:/opt/bitnami/pgpool/conf/
# 挂载日志目录
- pgpool_logs:/opt/bitnami/pgpool/logs
environment:
- PGPOOL_BACKEND_NODES=0:pg-0:5432,1:pg-1:5433,2:pg-2:5434
- PGPOOL_SR_CHECK_USER=postgres
- PGPOOL_SR_CHECK_PASSWORD=postgres
- PGPOOL_ENABLE_LDAP=no
- PGPOOL_POSTGRES_USERNAME=postgres
- PGPOOL_POSTGRES_PASSWORD=postgres
- PGPOOL_ADMIN_USERNAME=postgres
- PGPOOL_ADMIN_PASSWORD=postgres
extra_hosts:
- "pg-0:192.168.0.181"
- "pg-1:192.168.0.181"
- "pg-2:192.168.0.181"
# 定义数据卷
volumes:
pgpool_data:
driver: local
driver_opts:
type: none
o: bind
device: /data/pgsql/pgpool/data
pgpool_conf:
driver: local
driver_opts:
type: none
o: bind
device: /data/pgsql/pgpool/conf
pgpool_logs:
driver: local
driver_opts:
type: none
o: bind
device: /data/pgsql/pgpool/logs
3.2.注释
environment:
- PGPOOL_BACKEND_NODES=0:pg-0:5432,1:pg-1:5433,2:pg-2:5434 # 定义后端PostgreSQL节点列表(格式:ID:主机名:端口)
- PGPOOL_SR_CHECK_USER=postgres # 流复制检查用户名(用于监控复制状态)
- PGPOOL_SR_CHECK_PASSWORD=postgres # 流复制检查用户的密码
- PGPOOL_ENABLE_LDAP=no # 禁用LDAP认证(使用数据库认证)
- PGPOOL_POSTGRES_USERNAME=postgres # Pgpool连接PostgreSQL的用户名
- PGPOOL_POSTGRES_PASSWORD=postgres # Pgpool连接PostgreSQL的密码
- PGPOOL_ADMIN_USERNAME=postgres # Pgpool管理界面用户名
- PGPOOL_ADMIN_PASSWORD=postgres # Pgpool管理界面密码
启动
cd /root/pg_ha_cluster/pgpool && docker-compose up -d
查看集群状态
[root@vm-centos7-181 ~]# docker ps --format "table {{.Names}}\t{{.Status}}\t{{.Ports}}" | grep pg
pgpool Up 25 minutes 0.0.0.0:9996->5432/tcp, :::9996->5432/tcp
pg-2 Up About an hour 0.0.0.0:5434->5432/tcp, :::5434->5432/tcp
pg-1 Up About an hour 0.0.0.0:5433->5432/tcp, :::5433->5432/tcp
pg-0 Up About an hour 0.0.0.0:5432->5432/tcp, :::5432->5432/tcp
4.主从复制验证
在pgpool中创建表,最后所有pg包括pgpool都有表创建。已验证成功。