postgresql-repmgr-pgpool

一、概述

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. 主库宕机 → 故障转移发生

  1. repmgrd 检测到主库不可达;
  2. 触发自动故障转移,选择一个延迟最小的备库提升为新主库;
  3. 更新集群元数据,其他备库指向新主库重做复制;

二、实施

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都有表创建。已验证成功。

相关推荐
加号33 小时前
windows系统下mysql多源数据库同步部署
数据库·windows·mysql
シ風箏3 小时前
MySQL【部署 04】Docker部署 MySQL8.0.32 版本(网盘镜像及启动命令分享)
数据库·mysql·docker
李慕婉学姐3 小时前
Springboot智慧社区系统设计与开发6n99s526(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。
数据库·spring boot·后端
百锦再4 小时前
Django实现接口token检测的实现方案
数据库·python·django·sqlite·flask·fastapi·pip
tryCbest4 小时前
数据库SQL学习
数据库·sql
jnrjian4 小时前
ORA-01017 查找机器名 用户名 以及library cache lock 参数含义
数据库·oracle
十月南城4 小时前
数据湖技术对比——Iceberg、Hudi、Delta的表格格式与维护策略
大数据·数据库·数据仓库·hive·hadoop·spark
Henry Zhu1235 小时前
数据库:并发控制基本概念
服务器·数据库
银发控、5 小时前
数据库隔离级别与三个问题(脏读、不可重复读、幻读)
数据库·面试
爱可生开源社区5 小时前
MySQL 性能优化:真正重要的变量
数据库·mysql