postgresql-repmgr-pgpool
↓| pgpool-II | ← 提供统一入口↙ ↘| PostgreSQL 主库 | | PostgreSQL 备库 |↑ ↑流复制 + repmgr 管理集群状态与故障切换repmgr管理 PostgreSQL 实例之间的复制关系和 failover;pgpool-II连接到所有 PostgreSQL 实例,根据 SQL 类型路由请求;当主库宕机时,repmgr自动提拔备库为新主库,并通知pg
·
一、概述
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都有表创建。已验证成功。
更多推荐
所有评论(0)