docker compose 部署 pgsql高可用搭建

介绍

Repmgr是一个用于管理和监控基于流复制的pg集群的工具。其本质上是一个运行在pg库上的进程。它在每个pg库上都需要运行一个repmgrd进程来管理和监控库的状态、复制关系以及执行故障检测和切换等操作。 Repmgr 主要提供了 repmgr 和 repmgrd 两个工具。

 

  • repmgr:是一个执行管理任务的命令行工具,方便进行 pg服务器集群的管理。具有设置备用服务器、promote 备库、主从切换、显示复制集群中服务器的状态等功能。
  • repmgrd:是一个守护进程,它主动监控数据库状态并支持以下任务:监控和记录复制集群信息、故障检测、故障转移、集群中事件的通知(需要自定义脚本接受通知)。

注意:新版本已停止开源。最新支持版本17,支持14版本

 

架构图

 

 原理

在主库宕机时,备库在尝试多次连接主库失败后,repmgrd 会在所有备库中选举一个候选备库提升为新主库,其他备库去对接到该新主上,形成一个新的集群。

Repmgr 选举候选备库按照以下顺序选举:LSN > Priority > Node_ID

系统将优先选举一个 LSN 较大的库;

若 LSN 一样,会根据 Priority 优先级进行比较(该优先级是在配置文件中进行参数配置,如果 Priority 为 0,则代表该库被禁止提升为主库);

若优先级也一样,会比较库的 Node ID,小者会优先选举。

客户端连接的pgpool,可以加个keepalived作为vip

 

部署

一、环境配置

1.1 绑定hosts

192.168.1.10 pg-0
192.168.1.20 pg-1
192.168.1.30 pg-2

 

 

1.2 创建工作目录

mkdir -p /opt/pg
chown -R 1001:1001 /opt/pg

 

 

二、启动pg repmgr

postgresql-repmgr:latest 可指定版本 postgresql-repmgr:14

2.1 节点1操作

version: '3.8'
services:
  pg-0:
    image: bitnami/postgresql-repmgr:14
    container_name: pg-0
    restart: always
    network_mode: host
    environment:
      - REPMGR_PARTNER_NODES=192.168.1.10,192.168.1.20,192.168.1.30
      - REPMGR_NODE_NAME=pg-0
      - REPMGR_NODE_NETWORK_NAME=192.168.1.10     #当前节点
      - REPMGR_PRIMARY_HOST=192.168.1.10   #指定主节点
      - REPMGR_PASSWORD=123456
      - POSTGRESQL_PASSWORD=123456
      - PGPASSWORD=123456
    volumes:
      - ./data/:/bitnami/postgresql/
 

 

2.2 节点2操作

version: '3.8'
services:
  pg-1:
    image: bitnami/postgresql-repmgr:14
    container_name: pg-1
    restart: always
    network_mode: host
    environment:
      - REPMGR_PARTNER_NODES=192.168.1.10,192.168.1.20,192.168.1.30
      - REPMGR_NODE_NAME=pg-1
      - REPMGR_NODE_NETWORK_NAME=192.168.1.20     #当前节点
      - REPMGR_PRIMARY_HOST=192.168.1.10   #指定主节点
      - REPMGR_PASSWORD=123456
      - POSTGRESQL_PASSWORD=123456
      - PGPASSWORD=123456
    volumes:
      - ./data/:/bitnami/postgresql/

 

 

2.3 节点3操作

version: '3.8'
services:
  pg-2:
    image: bitnami/postgresql-repmgr:14
    container_name: pg-2
    restart: always
    network_mode: host
    environment:
      - REPMGR_PARTNER_NODES=192.168.1.10,192.168.1.20,192.168.1.30
      - REPMGR_NODE_NAME=pg-2
      - REPMGR_NODE_NETWORK_NAME=192.168.1.30     #当前节点
      - REPMGR_PRIMARY_HOST=192.168.1.10   #指定主节点
      - REPMGR_PASSWORD=123456
      - POSTGRESQL_PASSWORD=123456
      - PGPASSWORD=123456
    volumes:
      - ./data/:/bitnami/postgresql/
 

 

2.4 每台机器都启动

docker compose -f pgsql.yml up -d 

 

2.5 检查集群状态

docker exec -it pg-0 bash                #进入容器
psql -U postgres -h localhost -p 5432    #进入数据库
SELECT pg_is_in_recovery();              #查询集群状态   

  • 如果返回 t (true):当前节点是从节点,处于只读模式
  • 如果返回 f (false):当前节点是主节点,可以读写

 

 

2.6 主节点创建检查用户

CREATE USER checkuser WITH PASSWORD '123456';

可以发现 主节点创建后。 两个从节点也跟着自动创建了用户

 

 

三、所有节点创建pgpool

version: '3.8'
services:
  pgpool:
    image: bitnami/pgpool:latest
    container_name: pgpool
    restart: always
    environment:
      - PGPOOL_BACKEND_NODES=0:192.168.219.130:5432,1:192.168.219.132:5432,2:192.168.219.133:5432
      - PGPOOL_SR_CHECK_USER=checkuser
      - PGPOOL_SR_CHECK_PASSWORD=1213456
      - PGPOOL_ENABLE_LDAP=no
      - PGPOOL_POSTGRES_USERNAME=postgres
      - PGPOOL_POSTGRES_PASSWORD=123456
      - PGPOOL_ADMIN_USERNAME=admin
      - PGPOOL_ADMIN_PASSWORD=123456
      - PGPASSWORD=123456
      - PGPOOL_MAX_POOL=30
      - PGPOOL_NUM_INIT_CHILDREN=200
      - PGPOOL_CHILD_MAX_CONNECTIONS=2000
    ports:
      - "9999:5432"


docker compose -f pgpool.yml up -d docker logs -f pgpool

 

 

通过日志可以看到 节点成功

 

 

 

四、创建数据库测试

docker exec -it pg-0 bash                #进入容器
psql -U postgres -h localhost -p 5432    #进入数据库

 

 

节点一 5432端口 执行 (正常其他库有数据)

create database t1;    #创建数据库
\c t1;                 #进入数据库 所有节点执行。 证明已经同步到其他节点

 

节点一 9999端口 执行

 create database t2;  #创建数据库
 \c t2;               #进入数据库 所有节点执行。 证明已经同步到其他节点

 

节点二 5432端口 执行

postgres=#  create database t5;
ERROR:  cannot execute CREATE DATABASE in a read-only transaction

 #能看到从节点无法创建数据库

 

节点二 9999端口 执行

 create database t5;

 

 

 

五、验证高可用

验证停主节点。看从节点是否为新主

停服务

查看从节点日志可以看到 第二个从节点变成了新主。并且上面创建的数据库也还在

接着我们启动原来的主节点

可以发现原先的主节点变成了从节点

 

posted @ 2025-10-23 10:44  mrdongdong  阅读(3)  评论(0)    收藏  举报