当前位置:首页 > 技术 > 正文内容

基于 Bitnami 镜像构建 PostgreSQL 高可用集群

访客 技术 2026年8月2日 1

PostgreSQL 高可用方案依托 repmgr(Replication Manager)实现,该工具开源且专用于自动化管理数据库集群的复制拓扑与故障切换流程。

镜像获取与构建

推荐从 Docker Hub 拉取预构建镜像:

docker pull bitnami/postgresql-repmgr:latest

如需特定版本,可指定标签拉取:

docker pull bitnami/postgresql-repmgr:[TAG]

查看可用版本:https://hub.docker.com/r/bitnami/postgresql-repmgr/tags/

也可选择本地构建:

docker build -t bitnami/postgresql-repmgr:latest \
  'https://github.com/bitnami/bitnami-docker-postgresql-repmgr.git#master:14/debian-10'

数据持久化配置

容器销毁后数据会丢失,需通过卷挂载实现持久化。将宿主机目录映射至容器内 /bitnami/postgresql 路径,首次启动时若目录为空会自动初始化。

docker run \
  -v /data/pg-ha:/bitnami/postgresql \
  bitnami/postgresql-repmgr:latest

注意:该镜像以非 root 身份运行(UID 1001),挂载目录需确保权限匹配。

容器网络互联

命令行方式

创建网络

docker network create pg-net --driver bridge

启动 repmgr 实例

docker run -d --rm --name primary \
  --network pg-net \
  -e REPMGR_PARTNER_NODES=primary \
  -e REPMGR_NODE_NAME=primary \
  -e REPMGR_NODE_NETWORK_NAME=primary \
  -e REPMGR_PRIMARY_HOST=primary \
  -e REPMGR_PASSWORD=replmgr_secret \
  -e POSTGRESQL_PASSWORD=db_secret \
  bitnami/postgresql-repmgr:latest

连接客户端验证

docker run -it --rm \
  --network pg-net \
  bitnami/postgresql:14 \
  psql -h primary -U postgres

Compose 方式

version: '3'

networks:
  pg-net:
    driver: bridge

services:
  db-primary:
    image: bitnami/postgresql-repmgr:latest
    networks:
      - pg-net
    environment:
      POSTGRESQL_PASSWORD: dbpass
      REPMGR_PASSWORD: replpass
      REPMGR_PRIMARY_HOST: db-primary
      REPMGR_NODE_NETWORK_NAME: db-primary
      REPMGR_NODE_NAME: db-primary
      REPMGR_PARTNER_NODES: db-primary

  app:
    image: your-application:latest
    networks:
      - pg-net

应用容器内通过主机名 db-primary 连接数据库服务。

核心环境变量

变量名说明默认值
POSTGRESQL_PASSWORDpostgres 用户密码
POSTGRESQL_PASSWORD_FILE密码文件路径(优先级高于直接指定)
REPMGR_USERNAMErepmgr 专用账户名repmgr
REPMGR_PASSWORDrepmgr 账户密码
REPMGR_PASSWORD_FILErepmgr 密码文件路径
REPMGR_USE_PASSFILE启用 passfile 替代明文密码
REPMGR_PASSFILE_PATH密码文件存放位置
REPMGR_PRIMARY_HOST初始主节点地址
REPMGR_PARTNER_NODES集群节点列表(逗号分隔)
REPMGR_NODE_NAME当前节点标识名称
REPMGR_NODE_NETWORK_NAME当前节点网络主机名
REPMGR_PGHBA_TRUST_ALLpg_hba.conf 认证方式设为 trust(配合 pgpool LDAP 时使用)no

初始化配置

首次启动执行脚本

容器首次启动时,会自动执行 /docker-entrypoint-initdb.d 目录下 .sh.sql.sql.gz 后缀的文件。通过卷挂载注入自定义初始化脚本:

docker run \
  -v /data/init-scripts:/docker-entrypoint-initdb.d \
  bitnami/postgresql-repmgr:latest

数据库与用户创建

自动创建指定数据库:

docker run --name pg-0 \
  -e POSTGRESQL_DATABASE=app_db \
  bitnami/postgresql-repmgr:latest

创建受限用户(仅对指定库有权限):

docker run --name pg-0 \
  -e POSTGRESQL_USERNAME=app_user \
  -e POSTGRESQL_PASSWORD=user_pass \
  -e POSTGRESQL_DATABASE=app_db \
  bitnami/postgresql-repmgr:latest

指定 POSTGRESQL_USERNAME 后,postgres 用户不再设置密码。如需保留 postgres 远程登录,需额外配置 POSTGRESQL_POSTGRES_PASSWORD。

流复制高可用集群搭建

单主单从架构

步骤一:创建网络

docker network create pg-cluster --driver bridge

步骤二:部署主节点

docker run -d --name node-0 \
  --network pg-cluster \
  -e REPMGR_PARTNER_NODES=node-0,node-1 \
  -e REPMGR_NODE_NAME=node-0 \
  -e REPMGR_NODE_NETWORK_NAME=node-0 \
  -e REPMGR_PRIMARY_HOST=node-0 \
  -e REPMGR_PASSWORD=repl_secret \
  -e POSTGRESQL_PASSWORD=db_secret \
  bitnami/postgresql-repmgr:latest

步骤三:部署从节点

docker run -d --name node-1 \
  --network pg-cluster \
  -e REPMGR_PARTNER_NODES=node-0,node-1 \
  -e REPMGR_NODE_NAME=node-1 \
  -e REPMGR_NODE_NETWORK_NAME=node-1 \
  -e REPMGR_PRIMARY_HOST=node-0 \
  -e REPMGR_PASSWORD=repl_secret \
  -e POSTGRESQL_PASSWORD=db_secret \
  bitnami/postgresql-repmgr:latest

此时两节点集群已具备自动故障转移能力。主节点故障时,repmgr 自动提升从节点为新的主节点。集群支持动态增删从节点,无需停机。

注意:集群变更后需同步更新各节点 REPMGR_PARTNER_NODES 环境变量,并重启使配置生效。

TLS 加密通信

变量名功能默认值
POSTGRESQL_ENABLE_TLS启用 TLS 加密no
POSTGRESQL_TLS_CERT_FILE服务器证书路径
POSTGRESQL_TLS_KEY_FILE证书私钥路径
POSTGRESQL_TLS_CA_FILECA 证书路径(启用客户端证书验证)
POSTGRESQL_TLS_CRL_FILE证书吊销列表路径
POSTGRESQL_TLS_PREFER_SERVER_CIPHERS优先采用服务端加密套件yes

启用 TLS 后,PostgreSQL 同时兼容加密与非加密连接,但优先使用加密通道。

快速启用示例

docker run \
  -v /etc/ssl/certs:/opt/bitnami/postgresql/certs \
  -e POSTGRESQL_ENABLE_TLS=yes \
  -e POSTGRESQL_TLS_CERT_FILE=/opt/bitnami/postgresql/certs/server.crt \
  -e POSTGRESQL_TLS_KEY_FILE=/opt/bitnami/postgresql/certs/server.key \
  bitnami/postgresql-repmgr:latest

自定义配置文件

镜像默认配置路径:

  • /opt/bitnami/repmgr/conf/repmgr.conf
  • /opt/bitnami/postgresql/conf/postgresql.conf
  • /opt/bitnami/postgresql/conf/pg_hba.conf

通过挂载覆盖默认配置:

docker run --name node-0 \
  -v /data/pg-conf:/bitnami/repmgr/conf \
  bitnami/postgresql-repmgr:latest

权限设置:

sudo chgrp -R root /data/pg-conf
sudo chmod -R g+rwX /data/pg-conf

conf.d 扩展配置

默认 postgresql.conf 包含以下配置:

include_dir = 'conf.d'

可将额外 .conf 文件置于 /bitnami/postgresql/conf/conf.d/ 目录实现配置拆分:

docker run --name node-0 \
  -v /data/pg-extra:/bitnami/postgresql/conf/conf.d \
  -v /data/pg-conf:/bitnami/repmgr/conf \
  bitnami/postgresql-repmgr:latest

修改配置后重启容器生效:

docker restart node-0

日志查看

日志直接输出至标准输出,通过以下命令查看:

docker logs node-0

如需调整日志收集方式,可通过 --log-driver 参数配置,默认采用 json-file 驱动。

版本升级流程

  1. 拉取最新镜像

    docker pull bitnami/postgresql-repmgr:latest
    
  2. 停止现有容器并备份数据

    docker stop node-0 node-1
    rsync -a /data/pg-data /data/pg-data.bkp.$(date +%Y%m%d-%H%M%S)
    
  3. 移除旧容器

    docker rm -v node-0 node-1
    
  4. 基于新镜像重建

    docker run --name node-0 bitnami/postgresql-repmgr:latest
    

完整环境变量参考

变量默认值
REPMGR_NODE_IDnil
REPMGR_NODE_ID_START_SEED1000
REPMGR_NODE_NAMEnil
REPMGR_NODE_NETWORK_NAMEnil
REPMGR_NODE_PRIORITY100
REPMGR_PARTNER_NODESnil
REPMGR_PRIMARY_HOSTnil
REPMGR_NODE_LOCATIONdefault
REPMGR_PRIMARY_PORT5432
REPMGR_PORT_NUMBER5432
REPMGR_LOG_LEVELNOTICE
REPMGR_START_OPTIONSnil
REPMGR_CONNECT_TIMEOUT5
REPMGR_RECONNECT_ATTEMPTS3
REPMGR_RECONNECT_INTERVAL5
REPMGR_USE_REPLICATION_SLOTS1
REPMGR_MASTER_RESPONSE_TIMEOUT20
REPMGR_DEGRADED_MONITORING_TIMEOUT5
REPMGR_USERNAMErepmgr
REPMGR_DATABASErepmgr
REPMGR_PASSWORDnil
REPMGR_PASSWORD_FILEnil
REPMGR_FENCE_OLD_PRIMARYno
REPMGR_CHILD_NODES_CHECK_INTERVAL5
REPMGR_CHILD_NODES_CONNECTED_MIN_COUNT1
REPMGR_CHILD_NODES_DISCONNECT_TIMEOUT30
REPMGR_USE_PASSFILEnil
POSTGRESQL_USERNAMEpostgres
POSTGRESQL_DATABASEnil
POSTGRESQL_PASSWORDnil
POSTGRESQL_PASSWORD_FILEnil
POSTGRESQL_POSTGRES_PASSWORDnil
POSTGRESQL_POSTGRES_PASSWORD_FILEnil
POSTGRESQL_PORT_NUMBER5432
POSTGRESQL_INITDB_ARGSnil
POSTGRESQL_PGCTLTIMEOUT60
POSTGRESQL_SHUTDOWN_MODEfast
POSTGRESQL_ENABLE_TLSno
POSTGRESQL_TLS_CERT_FILEnil
POSTGRESQL_TLS_KEY_FILEnil
POSTGRESQL_TLS_CA_FILEnil
POSTGRESQL_TLS_CRL_FILEnil
POSTGRESQL_TLS_PREFER_SERVER_CIPHERSyes

相关文章

Linux crontab 详解

1) crontab 是什么cron 是 Linux 的定时任务守护进程;crontab 是用来编辑/查看“按时间周期执行命令”的表(cron table)。常见两类:用户 crontab:每个用户一份(crontab -e 编辑)系统级 crontab / cron.d:可指定执行用户(/etc/crontab、/etc/cron.d/*)2) crontab 时间...

富文本里可以允许的 HTML 属性

一、所有标签默认允许的安全属性(极少)class        (可选)id           (通常建议禁用)title️ 注意:id 容易被滥用做锚点注入,很多系统直接禁用class 允许的话最好只允许固定前缀(如 editor-*)二、a 标签允许属性<a href="" t...

Mac 安装 Node.js 指南

方法一:通过官网安装包(最简单,适合初学者)如果你只是想快速安装并开始使用,这是最直接的方法。访问 Node.js 官网。页面会显示两个版本:LTS (Recommended For Most Users):长期支持版,最稳定。建议选这个。Current:最新特性版,包含最新功能但可能不够稳定。下载 .pkg 安装包并运行。按照安装向导点击“下一步”即可完成。方法二:使用 Homebrew 安装(...

Dom\HTML_NO_DEFAULT_NS 的副作用:自动加闭合标签

在使用Dom\HTMLDocument时,Dom\HTML_NO_DEFAULT_NS 将禁止在解析过程中设置元素的命名空间, 此设置是为了与DOMDocument向后兼容而存在的。当使用它时,已知的一个副作用就是:自动加闭合标签例如 </img> 为什么会这样?当你使用:Dom\HTML_NO_DEFAULT_NS文档会变成 无命名空间模式,此时内部更接近 XML...

Laravel 事件和监听器创建

在 Laravel 中,使用 Artisan 命令创建 Events(事件) 和 Listeners(监听器) 是非常高效的。你可以通过以下几种方式来实现:1. 手动创建单个 Event如果你只想创建一个事件类,可以使用 make:event 命令:Bashphp artisan make:event UserRegistered执行后,文件将生成在 app/Even...

自定义域名解析神器 dnsmasq

什么是 dnsmasq?dnsmasq 是一个轻量级、功能强大的网络服务工具,专为小型和中等规模网络设计。它是一个综合的网络基础设施解决方案[1]。dnsmasq 能做什么?功能说明应用场景DNS 转发与缓存将 DNS 查询转发到上游服务器(ISP、Google DNS 等),并在本地缓存结果加快 DNS 查询速度,减少外部 DNS 流量本地 DNS解析本地网络设备的主机名,无需编辑&n...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。