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

相关推荐
難釋懷1 小时前
Redis分布式锁误删情况说明
数据库·redis·分布式
dblens 数据库管理和开发工具1 小时前
开源向量数据库比较:Chroma, Milvus, Faiss,Weaviate
数据库·开源·milvus·faiss·chroma·weaviate
草莓熊Lotso4 小时前
Linux 基础 IO 初步解析:从 C 库函数到系统调用,理解文件操作本质
linux·运维·服务器·c语言·数据库·c++·人工智能
Cx330❀4 小时前
从零实现Shell命令行解释器:原理与实战(附源码)
大数据·linux·数据库·人工智能·科技·elasticsearch·搜索引擎
岁岁种桃花儿10 小时前
MySQL从入门到精通系列:InnoDB记录存储结构
数据库·mysql
jiunian_cn11 小时前
【Redis】hash数据类型相关指令
数据库·redis·哈希算法
冉冰学姐12 小时前
SSM在线影评网站平台82ap4(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面
数据库·ssm框架·在线影评平台·影片分类
知识分享小能手13 小时前
SQL Server 2019入门学习教程,从入门到精通,SQL Server 2019数据库的操作(2)
数据库·学习·sqlserver
踩坑小念14 小时前
秒杀场景下如何处理redis扣除状态不一致问题
数据库·redis·分布式·缓存·秒杀