使用 Bitnami/Postgresql-Repmgr 镜像快速设置 PostgreSQL HA

什么是 PostgreSQL HA?

此 PostgreSQL 集群解决方案包括 PostgreSQL 复制管理器(replication manager),这是一种用于管理 PostgreSQL 集群上的复制(replication)和故障转移(failover)的开源工具。

获取此镜像

获取 Bitnami PostgreSQL HA Docker 镜像的推荐方法是从 Docker Hub Registry 中提取预构建的镜像。

$ dockerpullbitnami/postgresql-repmgr:latest

要使用特定版本,您可以拉取版本化标签。您可以在 Docker Hub Registry 中查看可用版本的列表。

https://hub.docker.com/r/bitnami/postgresql-repmgr/tags/。

$ dockerpullbitnami/postgresql-repmgr:[TAG]

如果您愿意,您也可以自己构建镜像。

$ dockerbuild-tbitnami/postgresql-repmgr:latest'https://github.com/bitnami/bitnami-docker-postgresql-repmgr.git#master:14/debian-10'

持久化您的应用程序

如果删除容器,所有数据都将丢失,下次运行镜像时,数据库将重新初始化。为避免这种数据丢失,您应该挂载一个即使在容器被删除后仍将持续存在的卷。

对于持久性,您应该在 /bitnami/postgresql 路径上挂载一个目录。如果挂载的目录是空的,它将在第一次运行时被初始化。

$ dockerrun\
-v /path/to/postgresql-repmgr-persistence:/bitnami/postgresql\
bitnami/postgresql-repmgr:latest

此存储库中的 docker-compose.yml 文件已经配置了持久性。

注意:由于这是一个非 root 容器,因此挂载的文件和目录必须具有 UID 1001 的适当权限。

连接到其他容器

使用 Docker 容器网络,您的应用程序容器可以轻松访问在容器内运行的 PostgreSQL 服务器,反之亦然。

https://docs.docker.com/engine/userguide/networking/。

连接到同一网络的容器可以使用容器名称作为主机名相互通信。

使用命令行

在此示例中,我们将创建一个 PostgreSQL 客户端实例,该实例将连接到与客户端在同一 docker 网络上运行的服务器实例。

$ dockernetworkcreatemy-network--driverbridge

Step 2: 在您的 network 中启动 postgresql-repmgr 容器

使用 docker run 命令的 –network 参数将容器附加到 my-network 网络。

$ dockerrun--detach--rm--namepg-0\
--networkmy-network\
--envREPMGR_PARTNER_NODES=pg-0\
--envREPMGR_NODE_NAME=pg-0\
--envREPMGR_NODE_NETWORK_NAME=pg-0\
--envREPMGR_PRIMARY_HOST=pg-0\
--envREPMGR_PASSWORD=repmgrpass\
--envPOSTGRESQL_PASSWORD=secretpass\
bitnami/postgresql-repmgr:latest

Step 3: 运行你的 PostgreSQL client 实例

最后,我们创建一个新的容器实例来启动 PostgreSQL client 并连接到上一步中创建的服务器:

$ dockerrun-it--rm\
--networkmy-network\
bitnami/postgresql:10\
psql-hpg-0-Upostgres

使用 Docker Compose

如果未指定,Docker Compose 会自动设置一个新网络并将所有已部署的服务附加到该网络。但是,我们将明确定义一个名为 my-network 的新 bridge 网络。在此示例中,我们假设您希望从您自己的自定义应用程序镜像连接到 PostgreSQL 服务器,该镜像在以下代码段中由服务名称 myapp 标识。

version: '2'
networks:
my-network:
driver: bridge
services:
pg-0:
image: 'bitnami/postgresql-repmgr:latest'
networks:
- my-network
environment:
- POSTGRESQL_PASSWORD=custompassword
-REPMGR_PASSWORD=repmgrpassword
-REPMGR_PRIMARY_HOST=pg-0
-REPMGR_NODE_NETWORK_NAME=pg-0
-REPMGR_NODE_NAME=pg-0
-REPMGR_PARTNER_NODES=pg-0
myapp:
image: 'YOUR_APPLICATION_IMAGE'
networks:
- my-network
  1. 请使用您的应用程序镜像更新上述代码段中的 YOUR_APPLICATION_IMAGE 占位符。
  2. 在您的应用程序容器中,使用主机名 pg-0 连接到 PostgreSQL 服务器。

使用以下命令启动容器:

$ docker-composeup-d

配置

初始化一个新实例。

第一次执行容器时,它将执行位于 /docker-entrypoint-initdb.d 的扩展名为 .sh、.sql 和 .sql.gz 的文件。

为了将您的自定义文件放入 docker 镜像中,您可以将它们挂载为卷。

在首次运行时设置 root 和 repmgr 密码。

在上述命令中,您可能已经注意到 POSTGRESQL_PASSWORD 和 REPMGR_PASSWORD 环境变量的使用。第一次运行镜像时传递 POSTGRESQL_PASSWORD 环境变量会将 postgres 用户的密码设置为 POSTGRESQL_PASSWORD 的值(或 POSTGRESQL_PASSWORD_FILE 中指定的文件内容)。同样,传递 REPMGR_PASSWORD 环境变量将 repmgr 用户的密码设置为 REPMGR_PASSWORD 的值(或 REPMGR_PASSWORD_FILE 中指定的文件内容)。

$ dockerrun--namepg-0--envREPMGR_PASSWORD=repmgrpass--envPOSTGRESQL_PASSWORD=secretpassbitnami/postgresql-repmgr:latest

或通过修改此存储库中存在的 docker-compose.yml 文件:

...
services:
pg-0:
...
environment:
- - POSTGRESQL_PASSWORD=adminpassword
+ - POSTGRESQL_PASSWORD=password123
--REPMGR_PASSWORD=repmgrpassword
+ - REPMGR_PASSWORD=password123
...
pg-1:
...
environment:
- - POSTGRESQL_PASSWORD=adminpassword
+ - POSTGRESQL_PASSWORD=password123
--REPMGR_PASSWORD=repmgrpassword
+ - REPMGR_PASSWORD=password123
...

Note!postgres 和 repmgr 用户都是超级用户,并且对 PostgreSQL 数据库具有完全的管理访问权限。

如果要为 postgres 用户设置非特权用户和密码,请参阅在首次运行时创建数据库用户。

首次运行时创建数据库

通过在第一次运行镜像时传递 POSTGRESQL_DATABASE 环境变量,将创建一个数据库。如果您的应用程序要求数据库已经存在,这将非常有用,您不必使用 PostgreSQL 客户端手动创建数据库。

$ dockerrun--namepg-0--envPOSTGRESQL_DATABASE=my_databasebitnami/postgresql-repmgr:latest

首次运行时创建数据库用户

您还可以创建一个受限数据库用户,该用户仅对使用 POSTGRESQL_DATABASE 环境变量创建的数据库具有权限。为此,请提供 POSTGRESQL_USERNAME 环境变量。

$ dockerrun--namepg-0--envPOSTGRESQL_USERNAME=my_user--envPOSTGRESQL_PASSWORD=password123--envPOSTGRESQL_DATABASE=my_databasebitnami/postgresql-repmgr:latest

此存储库中的 docker-compose.yml 文件已配置此设置。

Note!指定 POSTGRESQL_USERNAME 时,不会为 postgres 用户分配密码,因此您无法以 postgres 用户身份远程登录 PostgreSQL 服务器。如果您仍想使用用户 postgres 访问,请设置 POSTGRESQL_POSTGRES_PASSWORD 环境变量(或 POSTGRESQL_POSTGRES_PASSWORD_FILE 中指定的文件内容)。

使用流复制和 repmgr 设置 HA PostgreSQL 集群。

使用以下环境变量,可以使用 Bitnami PostgreSQL HA Docker 镜像轻松设置具有[流复制](Streaming replication)和 repmgr 的 HA PostgreSQL 集群:

  • POSTGRESQL_PASSWORD:postgres 用户的密码。没有默认值。
  • POSTGRESQL_PASSWORD_FILE:包含 postgres 用户密码的文件的路径。这将覆盖POSTGRESQL_PASSWORD 中指定的值。没有默认值。
  • REPMGR_USERNAME:repmgr 用户的用户名。默认为 repmgr。
  • REPMGR_PASSWORD_FILE:包含 repmgr 用户密码的文件的路径。这将覆盖 REPMGR_PASSWORD 中指定的值。没有默认值。
  • REPMGR_PASSWORD:repmgr 用户的密码。没有默认值。
  • REPMGR_USE_PASSFILE:配置 repmgr 以在其配置中使用 passfile 和 PGPASSFILE 而不是纯文本密码。
  • REPMGR_PASSFILE_PATH:密码文件的位置,如果它不存在,它将使用 REPMGR 凭据创建。
  • REPMGR_PRIMARY_HOST:初始主节点的主机名。没有默认值。
  • REPMGR_PARTNER_NODES:集群中的伙伴节点的逗号分隔列表。没有默认值。
  • REPMGR_NODE_NAME:节点名称。没有默认值。
  • REPMGR_NODE_NETWORK_NAME:节点主机名。没有默认值。
  • REPMGR_PGHBA_TRUST_ALL:这将在生成的 pg_hba.conf 中设置 auth-method。仅当您使用带有 LDAP 身份验证的 pgpool 时才将其设置为 yes。默认为 no。

在 HA PostgreSQL 集群中,您可以拥有一个主节点和零个或多个备用节点。主节点处于读写模式,而备用节点处于只读模式。为获得最佳性能,建议将读取限制在备用节点。

注意:对于 9.6 版之前的 Postgresql,REPMGR_USE_PASSFILE 和 REPMGR_PASSFILE_PATH 将被忽略。

使用 REPMGR_PASSFILE_PATH 挂载外部密码文件时,还需要相应地配置 REPMGR_PASSWORD 和 REPMGR_USERNAME。

Step 1: 创建 network

$ dockernetworkcreatemy-network--driverbridge

Step 2: 创建初始主节点

第一步是启动初始主节点:

$ dockerrun--detach--namepg-0\
--networkmy-network\
--envREPMGR_PARTNER_NODES=pg-0,pg-1\
--envREPMGR_NODE_NAME=pg-0\
--envREPMGR_NODE_NETWORK_NAME=pg-0\
--envREPMGR_PRIMARY_HOST=pg-0\
--envREPMGR_PASSWORD=repmgrpass\
--envPOSTGRESQL_PASSWORD=secretpass\
bitnami/postgresql-repmgr:latest

Step 3: 创建备用节点

接下来我们启动一个备用节点:

$ dockerrun--detach--namepg-1\
--networkmy-network\
--envREPMGR_PARTNER_NODES=pg-0,pg-1\
--envREPMGR_NODE_NAME=pg-1\
--envREPMGR_NODE_NETWORK_NAME=pg-1\
--envREPMGR_PRIMARY_HOST=pg-0\
--envREPMGR_PASSWORD=repmgrpass\
--envPOSTGRESQL_PASSWORD=secretpass\
bitnami/postgresql-repmgr:latest

使用这三个命令,您现在可以启动并运行一个两节点 PostgreSQL 主备流复制集群。您可以通过添加/删除备用节点来扩展集群,而不会导致任何停机时间。

注意:集群会完整地复制主节点,其中包括所有用户和数据库。

如果主节点宕机,repmgr 将确保任何备用节点担任主节点,从而保证高可用性。

注意:集群中其他节点的配置需要更新,以便它们知道它们。这将需要重新启动旧节点,以适应 REPMGR_PARTNER_NODES 环境变量。

使用 Docker Compose,可以使用此存储库中的 docker-compose.yml 文件设置 HA PostgreSQL 集群:

$ curl-sSLhttps://raw.githubusercontent.com/bitnami/bitnami-docker-postgresql-repmgr/master/docker-compose.yml > docker-compose.yml
$ docker-composeup-d

保护 PostgreSQL 流量

PostgreSQL 支持使用 SSL/TLS 协议对连接进行加密。如果您希望启用此可选功能,您可以使用以下环境变量来配置应用程序:

  • POSTGRESQL_ENABLE_TLS:是否为流量启用 TLS。默认为 no。
  • POSTGRESQL_TLS_CERT_FILE:包含 TLS 流量证书文件的文件。没有默认值。
  • POSTGRESQL_TLS_KEY_FILE:包含证书密钥的文件。没有默认值。
  • POSTGRESQL_TLS_CA_FILE:包含证书 CA 的文件。如果提供,PostgreSQL 将通过向 TLS/SSL 客户端请求证书来对其进行身份验证(请参阅ref)。没有默认值。
  • POSTGRESQL_TLS_CRL_FILE:包含证书吊销列表的文件。没有默认值。
  • POSTGRESQL_TLS_PREFER_SERVER_CIPHERS:是否使用服务器的 TLS 密码首选项而不是客户端的。默认为 yes。

启用 TLS 时,PostgreSQL 默认支持标准流量和加密流量,但更喜欢后者。下面是一些关于如何快速设置 TLS 流量的示例:

使用 docker run

$ dockerrun\
-v /path/to/certs:/opt/bitnami/postgresql/certs\
-ePOSTGRESQL_ENABLE_TLS=yes\
-ePOSTGRESQL_TLS_CERT_FILE=/opt/bitnami/postgresql/certs/postgres.crt\
-ePOSTGRESQL_TLS_KEY_FILE=/opt/bitnami/postgresql/certs/postgres.key\
bitnami/postgresql-repmgr:latest

修改此存储库中存在的 docker-compose.yml 文件:

services:
pg-0:
...
environment:
...
- POSTGRESQL_ENABLE_TLS=yes
-POSTGRESQL_TLS_CERT_FILE=/opt/bitnami/postgresql/certs/postgres.crt
- POSTGRESQL_TLS_KEY_FILE=/opt/bitnami/postgresql/certs/postgres.key
...
volumes:
...
- /path/to/certs:/opt/bitnami/postgresql/certs
...

或者,您也可以在自定义配置文件中提供此配置。

配置文件

该镜像在 /opt/bitnami/repmgr/conf/ 和 /opt/bitnami/postgresql/conf/ 中查找 repmgr.conf、postgresql.conf 和 pg_hba.conf 文件。您可以在 /bitnami/repmgr/conf/ 挂载一个卷,并复制/编辑 /path/to/custom-conf/ 中的配置文件。如果 /bitnami/repmgr/conf/ 为空,默认配置将填充到 conf/ 目录。

/path/to/custom-conf/
└── postgresql.conf

由于带有 Replication manager 镜像的 PostgreSQL 是非 root 用户,因此您需要为主机中的挂载目录设置适当的权限:

$ sudochgrp-Rroot /path/to/custom-conf/
$ sudochmod-Rg+rwX /path/to/custom-conf/

Step 1: 运行 PostgreSQL 镜像

运行 PostgreSQL 镜像,从您的主机挂载一个目录。

$ dockerrun--namepg-0\
-v /path/to/custom-conf/:/bitnami/repmgr/conf/ \
bitnami/postgresql-repmgr:latest

或者使用 Docker Compose:

version: '2'
services:
pg-0:
image: bitnami/postgresql-repmgr:latest
ports:
- '5432:5432'
volumes:
- /path/to/custom-conf/:/bitnami/repmgr/conf/
pg-1:
image: bitnami/postgresql-repmgr:latest
ports:
- '5432:5432'
volumes:
- /path/to/custom-conf/:/bitnami/repmgr/conf/

Step 2: 编辑配置

使用您喜欢的编辑器编辑主机上的配置。

vi /path/to/custom-conf/postgresql.conf

Step 3: 重启 PostgreSQL

更改配置后,重新启动 PostgreSQL 容器以使更改生效。

$ dockerrestartpg-0

或者使用 Docker Compose:

$ docker-composerestartpg-0
$ docker-composerestartpg-1

有关配置选项的完整列表,请参阅服务器配置手册。

http://www.postgresql.org/docs/10/static/runtime-config.html。

允许从默认 postgresql.conf 以外的文件加载设置。

除了使用自定义的 repmgr.conf、postgresql.conf 或 pg_hba.conf,您还可以在 /bitnami/postgresql/conf/ 的卷中包含 conf.d 目录中以 .conf 结尾的文件。为此,默认的 postgresql.conf 包含以下部分:

##------------------------------------------------------------------------------
##CONFIGFILEINCLUDES
##------------------------------------------------------------------------------

##Theseoptionsallowsettingstobeloadedfromfilesotherthanthe
##defaultpostgresql.conf.

include_dir = 'conf.d'#Includefilesendingin'.conf'fromdirectory'conf.d'

如果您使用自定义 postgresql.conf,您应该在配置文件中创建(或取消注释)上述部分,在这种情况下,结构应该类似于。

/path/to/custom-conf/
└── postgresql.conf
/path/to/extra-custom-conf/
└── extended.conf

请记住为主机中的挂载目录设置适当的权限:

$ sudochgrp-Rroot /path/to/extra-custom-conf/
$ sudochmod-Rg+rwX /path/to/extra-custom-conf/

Step 1: 运行 PostgreSQL 镜像

运行 PostgreSQL 镜像,从您的主机挂载一个目录。

$ dockerrun--namepg-0\
-v /path/to/extra-custom-conf/:/bitnami/postgresql/conf/conf.d/ \
-v /path/to/custom-conf/:/bitnami/repmgr/conf/ \
bitnami/postgresql-repmgr:latest

或者使用 Docker Compose:

version: '2'
services:
pg-0:
image: bitnami/postgresql-repmgr:latest
ports:
- '5432:5432'
volumes:
- /path/to/extra-custom-conf/:/bitnami/postgresql/conf/conf.d/
- /path/to/custom-conf/:/bitnami/repmgr/conf/
pg-1:
image: bitnami/postgresql-repmgr:latest
ports:
- '5432:5432'
volumes:
- /path/to/extra-custom-conf/:/bitnami/postgresql/conf/conf.d/
- /path/to/custom-conf/:/bitnami/repmgr/conf/

Step 2: 编辑配置

使用您喜欢的编辑器编辑主机上的配置。

vi /path/to/extra-custom-conf/extended.conf

Step 3: 重启 PostgreSQL

更改配置后,重新启动 PostgreSQL 容器以使更改生效。

$ dockerrestartpg-0

或者使用 Docker Compose:

$ docker-composerestartpg-0
$ docker-composerestartpg-1

环境变量

请在下表中查看 Bitnami PostgreSQL HA 容器中可用的环境变量列表:

日志

Bitnami PostgreSQL HA Docker 镜像将容器日志发送到 stdout。查看日志:

$ dockerlogspg-0

如果您希望以不同的方式使用容器日志,则可以使用 –log-driver 选项配置容器 logging driver。在默认配置中,docker 使用 json-file driver。

https://docs.docker.com/engine/admin/logging/overview/。

维护

升级这个镜像

Bitnami 提供了 PostgreSQL HA 的最新版本,包括安全补丁,这些补丁在上游发布后很快就会发布。我们建议您按照以下步骤升级容器。

Step 1: 获取更新的镜像

$ dockerpullbitnami/postgresql-repmgr:latest

或者,如果您使用的是 Docker Compose,请将 image 属性的值更新为 bitnami/postgresql-repmgr:latest。

Step 2: 停止正在运行的容器

使用命令停止当前运行的容器。

$ dockerstoppg-0

或者使用 Docker Compose:

$ docker-composestoppg-0
$ docker-composestoppg-1

接下来,使用以下命令对持久卷 /path/to/postgresql-persistence 进行快照:

$ rsync-a /path/to/postgresql-persistence /path/to/postgresql-persistence.bkp.$(date +%Y%m%d-%H.%M.%S)

Step 3: 移除当前运行的容器

$ dockerrm-vpg-0

或者使用 Docker Compose:

$ docker-composerm-vpg-0
$ docker-composerm-vpg-1

Step 4: 运行新镜像

从新镜像重新创建容器。

$ dockerrun--namepg-0bitnami/postgresql-repmgr:latest

或者使用 Docker Compose:

$ docker-composeuppg-0
$ docker-composeuppg-1

文章来源网络,作者:管理,如若转载,请注明出处:https://shuyeidc.com/wp/261917.html<

(0)
管理的头像管理
上一篇2025-05-03 20:50
下一篇 2025-05-03 20:51

相关推荐

  • 站群服务器和普通服务器到底哪个更适合GEO,怎么选?

    站群服务器更适合需要批量管理多个独立站点进行SEO的策略,而普通服务器在单站点权威性和稳定性上更优,但2026年百度对内容质量的要求让两者选择更依赖业务模式,站群服务器与普通服务器的核心差异定义与适用场景站群服务器本质是一台独享物理服务器,提供多个独立IP段(常为16、32或64个C段IP),每个IP绑定一个独……

    2026-07-28
    0
  • 物理服务器和云服务器做站群到底选哪个,哪个更稳定?

    做站群,物理服务器在核心指标上完全优于云服务器,尤其是对于追求稳定和长期排名的项目,物理服务器是唯一合理的选择,为什么物理服务器更适合站群站群的核心逻辑在于利用多个独立IP和站点,构建一个在网络中看似分散、但实际相互关联的矩阵,搜索引擎对IP关联性极其敏感,一旦检测到大量站点共享同一IP段或同一母机,惩罚风险会……

    2026-07-28
    0
  • 国内高防服务器哪家防御真实靠谱,怎么选?

    国内高防服务器哪家防御真实靠谱?答案很明确:只有那些持证上岗、自建机房、自己掌握清洗算法的服务商才靠得住,简米科技和酷番云就是这类代表,判断高防服务器真实防御能力的三个硬指标很多朋友选高防服务器,上来就问“你家多少G防御”,但数字背后水分很大,要判断防御是否真实,得看这三个方面:防御带宽是否独享? 有些服务商宣……

    2026-07-28
    0
  • 裸金属服务器和物理服务器有什么区别?,怎么选?

    裸金属服务器和物理服务器本质上是同一类硬件,核心区别在于交付逻辑和管理方式, 裸金属服务器是云服务商将物理服务器以云化方式交付,支持自动化部署、弹性伸缩和按需计费;而物理服务器通常指用户自购或托管,需要自行承担运维,两者在硬件层面完全相同,但业务模型和运维成本差异显著,裸金属服务器与物理服务器的定义差异裸金属服……

    2026-07-28
    0
  • 做GEO站群选哪家服务器服务商靠谱,怎么选?

    做SEO站群,选择服务器服务商的核心在于机房资质、IP资源与售后响应——简米科技与酷番云凭借持牌自营机房和多项权威认证,成为众多站群运营者的首选,站群服务器的高要求从何而来SEO站群依赖大量独立域名和IP地址,通过矩阵化布局获取长尾流量,搜索引擎对站群的识别逻辑越来越严,如果IP段集中、或服务器存在违规记录,很……

    2026-07-28
    0

发表回复

您的邮箱地址不会被公开。必填项已用 * 标注