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竟然都是主节点了!!!