Postgresql通过pgpool进行高可用部署主从,灾备

发布于:2025-06-29 ⋅ 阅读:(19) ⋅ 点赞:(0)

1、bitnami/postgresql-repmgr:15 (镜像名)

Bitnami 的 PostgreSQL-Repmgr 镜像是一个预配置的 Docker 镜像,集成了 PostgreSQL 数据库和 repmgr(Replication Manager)工具,用于快速搭建高可用(HA)的 PostgreSQL 集群。

1. 核心组件

  • PostgreSQL:开源关系型数据库,支持主从复制。

  • repmgr:用于管理 PostgreSQL 复制和自动故障转移的工具,提供:

    • 自动主从切换(failover)

    • 节点监控

    • 集群状态管理


2. 镜像特点

  • 开箱即用:预配置主从复制和 repmgr 管理。

  • 基于 Bitnami 标准化镜像

    • 非 root 用户运行(UID 1001),增强安全性。

    • 数据卷挂载到 /bitnami/postgresql

    • 日志输出到标准输出(方便 Docker 日志收集)。

  • 环境变量驱动:通过环境变量配置数据库、复制和用户权限。

docker-compose.yml (同机部署)

配置电脑的hosts文件,pg-0 和pg-1的ip地址

services:
  pg-0:
    image: harbor-operation.com.cn/library/bitnami/postgresql-repmgr:15
    container_name: pg-0
    environment:
      POSTGRESQL_POSTGRES_PASSWORD: 1qaz@WSX  # 使用冒号格式
      POSTGRESQL_USERNAME: frank
      POSTGRESQL_PASSWORD: 1qaz@WSX
      POSTGRESQL_DATABASE: frank-dev
      POSTGRESQL_NUM_SYNCHRONOUS_REPLICAS: 0
      REPMGR_USERNAME: repmgr
      REPMGR_PASSWORD: 1qaz@WSX
      REPMGR_DATABASE: repmgr
      REPMGR_PRIMARY_HOST: pg-0
      REPMGR_PRIMARY_PORT: 5432
      REPMGR_PARTNER_NODES: "pg-0:5432,pg-1:25432"  # 注意用引号包裹包含逗号的值
      REPMGR_NODE_NAME: pg-0
      REPMGR_NODE_NETWORK_NAME: pg-0
      REPMGR_PORT_NUMBER: 5432
      POSTGRESQL_INITDB_ARGS: "--data-checksums"
      REPMGR_GENERATE_PGHBA_CONF: "yes"
      REPMGR_PGHBA_TRUST_ALL: "yes"
      REPMGR_CREATE_DB: "yes"
    volumes:
      - postgres_data_pg0:/bitnami/postgresql
    ports:
      - "5432:5432"
    networks:
      - docker_postgres15_network
  pg-1:
    image: harbor-operation.com.cn/library/bitnami/postgresql-repmgr:15
    container_name: pg-1
    environment:
      POSTGRESQL_POSTGRES_PASSWORD: 1qaz@WSX  # 使用冒号格式
      POSTGRESQL_USERNAME: frank
      POSTGRESQL_PASSWORD: 1qaz@WSX
      POSTGRESQL_DATABASE: frank-dev
      POSTGRESQL_NUM_SYNCHRONOUS_REPLICAS: 0
      REPMGR_USERNAME: repmgr
      REPMGR_PASSWORD: 1qaz@WSX
      REPMGR_DATABASE: repmgr
      REPMGR_PRIMARY_HOST: pg-0
      REPMGR_PRIMARY_PORT: 5432
      REPMGR_PARTNER_NODES: "pg-0:5432,pg-1:15432"
      REPMGR_NODE_NAME: pg-1
      REPMGR_NODE_NETWORK_NAME: pg-1
      REPMGR_PORT_NUMBER: 5432
      REPMGR_ROLE: standby  # 关键!明确声明为备用节点
      POSTGRESQL_INITDB_ARGS: "--data-checksums"
      REPMGR_GENERATE_PGHBA_CONF: "yes"
      REPMGR_PGHBA_TRUST_ALL: "yes"
      REPMGR_CREATE_DB: "yes"
    volumes:
      - postgres_data_pg1:/bitnami/postgresql
    ports:
      - "15432:5432"
    networks:
      - docker_postgres15_network
networks:
  docker_postgres15_network:
    ipam:
      config:
        - subnet: 172.72.10.0/28
    driver: bridge

volumes:
  postgres_data_pg0:
  postgres_data_pg1:

2、bitnami/pgpool:4 (镜像名)

1. 核心组件

  • Pgpool-II:高性能中间件,为 PostgreSQL 提供连接池、负载均衡、自动故障转移等功能。

  • 关键特性

    • 连接池:减少频繁连接开销。

    • 负载均衡:读操作分散到多个从节点。

    • 自动故障转移:主节点故障时提升从节点为新主。

    • Watchdog:多 Pgpool 节点间高可用(防止单点故障)。


2. 镜像特点

  • 版本:基于 Pgpool-II 4.x(支持 PostgreSQL 10+)。

  • 安全:以非 root 用户(UID 1001)运行。

  • 配置驱动:通过环境变量或配置文件(/opt/bitnami/pgpool/conf/)管理。

  • 集成健康检查:内置对后端 PostgreSQL 节点的监控。

docker-compose.yml

创建挂载的目录和文件

services:
  pgpool:
    image: harbor-operation.com.cn/library/bitnami/pgpool:4
    container_name: "my-pgpool"
    network_mode: "bridge"
    ports:
      - 9999:5432
    volumes:
      - ./conf/myconf.conf:/config/myconf.conf
    environment:
      - PGPOOL_USER_CONF_FILE=/config/myconf.conf
      - PGPOOL_BACKEND_NODES=0:pg-0:5432,1:pg-1:15432
      - PGPOOL_SR_CHECK_USER=repmgr
      - PGPOOL_SR_CHECK_PASSWORD=1qaz@WSX
      - PGPOOL_ENABLE_LDAP=no
      - PGPOOL_POSTGRES_USERNAME=postgres
      - PGPOOL_POSTGRES_PASSWORD=1qaz@WSX
      - PGPOOL_ADMIN_USERNAME=admin
      - PGPOOL_ADMIN_PASSWORD=1qaz@WSX
      - PGPOOL_ENABLE_LOAD_BALANCING=yes
      - PGPOOL_POSTGRES_CUSTOM_USERS=frank
      - PGPOOL_POSTGRES_CUSTOM_PASSWORDS=1qaz@WSX
    restart: always
    extra_hosts:
      - "pg-0:192.168.32.235"
      - "pg-1:192.168.32.235"
    healthcheck:
      test: ["CMD", "/opt/bitnami/scripts/pgpool/healthcheck.sh"]
      interval: 10s
      timeout: 5s
      retries: 5

3、实验主从

1)链接pgpool,创建数据表和数据,数据会自动同步到pg-0和pg-1

2)操作pg-1从数据库,只读不可操作。

3)模拟pg-0故障

a)从日志中可以看到当pg-0挂掉后会再重试5次,如果还访问不了会执行find_primary_node方法查找可以作为主节点的节点,然后把找到节点设置为新的主节点,所以现在pg-1是主节点,这个时候我们访问pgpoll还是能访问的,现在在users表里面再添加一行数据: 

 

 b)pgpool加了数据之后,pg-1已经成为了主节点,去pg-1把王五的年纪改完25成功,pgpool数据也同步修改

c)现在将pg-0启动起来,也会自动加入集群,会发现就算pg-0重新启动器来了,但是pg-1还是主节点不变,pg-0又会成为副节点。数据也会同步进去。

4、but:存在的问题:

pg-0 和 pg-1竟然都是主节点了!!!


网站公告

今日签到

点亮在社区的每一天
去签到