使用 bitnami/postgresql-repmgr 镜像快速设置 PostgreSQL HA

这篇博客介绍了如何利用 bitnami/postgresql-repmgr Docker 镜像快速设置 PostgreSQL 高可用(HA)集群。内容涵盖 PostgreSQL HA 的概念,获取镜像的方法,数据持久化,容器间的连接,配置过程,包括初始化实例、设置密码、创建集群,以及保护 PostgreSQL 流量和维护升级等方面。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

image

什么是 PostgreSQL HA?

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

获取此镜像

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

$ docker pull bitnami/postgresql-repmgr:latest

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

$ docker pull bitnami/postgresql-repmgr:[TAG]

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

$ 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 /path/to/postgresql-repmgr-persistence:/bitnami/postgresql \
    bitnami/postgresql-repmgr:latest

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

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

连接到其他容器

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

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

使用命令行

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

Step 1: 创建 network
$ docker network create my-network --driver bridge
Step 2: 在您的 network 中启动 postgresql-repmgr 容器

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

$ docker run --detach --rm --name pg-0 \
  --network my-network \
  --env REPMGR_PARTNER_NODES=pg-0 \
  --env REPMGR_NODE_NAME=pg-0 \
  --env REPMGR_NODE_NETWORK_NAME=pg-0 \
  --env REPMGR_PRIMARY_HOST=pg-0 \
  --env REPMGR_PASSWORD=repmgrpass \
  --env POSTGRESQL_PASSWORD=secretpass \
  bitnami/postgresql-repmgr:latest
Step 3: 运行你的 PostgreSQL client 实例

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

$ docker run -it --rm \
  --network my-network \
  bitnami/postgresql:10 \
  psql -h pg-0 -U postgres

使用 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 服务器

使用以下命令启动容器:


<think>好的,我现在需要解决用户的问题:如何正确使用mysqld的--defaults-file和--datadir参数来启动MySQL服务。用户可能遇到了配置文件路径或数据目录设置的问题,导致服务无法正常启动。我需要结合提供的引用资料,给出正确的步骤和注意事项。 首先,根据引用[1],用户可以通过mysqld --defaults-file=your_path_to_my_cnf来指定配置文件的位置。需要注意的是,这个参数必须在命令行最前面,否则可能无效。然后,引用[4]提到,MySQL 5.7之后使用mysqld --initialize来初始化数据库,这可能会影响数据目录的设置。而--datadir参数用于指定数据存储的位置,但需要确保目录存在且权限正确。 用户可能混淆了启动服务和初始化数据库的步骤。正确的流程应该是先初始化数据库,指定datadir,然后在启动时用--defaults-file包含正确的配置文件路径。例如,初始化时可能需要运行mysqld --initialize --datadir=/path/to/data,然后在启动服务时使用mysqld --defaults-file=/path/my.cnf --datadir=/path/to/data。 另外,引用[2]中的示例显示,安装服务时同时指定--defaults-file和datadir可能存在问题,因为配置文件里可能已经定义了datadir。如果配置文件和命令行参数中的datadir不一致,可能会引发错误。需要检查配置文件中的datadir是否与命令行参数一致,或者直接在配置文件中设置datadir,避免冲突。 总结步骤应该是:1. 确保配置文件中的datadir与命令行参数一致,或通过命令行覆盖;2. 初始化数据库时指定datadir;3. 启动服务时使用--defaults-file指定配置文件,并确保其他参数如datadir正确。同时注意权限问题,可能需要以管理员身份运行命令。</think>### 分步说明 #### 1. 确认配置文件路径和数据目录权限 - 配置文件(如`my.cnf`或`my.ini`)需包含完整的配置参数,尤其是`datadir`的定义。若需覆盖配置文件中的`datadir`,需在命令行中显式指定`--datadir`参数。 - 数据目录需满足: - 目录必须已存在(若未初始化需先创建) - MySQL服务用户需具备读写权限(Linux系统需`chown -R mysql:mysql /your/datadir`) #### 2. 初始化数据库(仅首次部署需要) ```bash # 安全初始化(生成随机root密码) mysqld --defaults-file=/path/to/my.cnf --initialize --datadir=/path/to/datadir # 或非安全初始化(空root密码) mysqld --defaults-file=/path/to/my.cnf --initialize-insecure --datadir=/path/to/datadir ``` 初始化完成后,注意查看日志输出的临时密码(安全初始化方式)[^4]。 #### 3. 启动MySQL服务 ```bash # 直接前台运行(调试模式) mysqld --defaults-file=/path/to/my.cnf --datadir=/path/to/datadir # 或注册为系统服务(Windows示例) mysqld --install "MySQLServiceName" --defaults-file="C:\path\to\my.ini" ``` > 关键点: > - `--defaults-file`必须作为第一个参数[^1] > - 若配置文件中已定义`datadir`,可省略`--datadir`参数 > - Windows服务安装需管理员权限[^2] #### 4. 验证参数生效 ```sql -- 登录后查询变量值 SHOW VARIABLES LIKE 'datadir'; SELECT @@GLOBAL.default_storage_engine; ``` ### 典型错误场景 | 错误现象 | 原因分析 | 解决方案 | |---------|----------|----------| | `[ERROR] [MY-010119] Aborting` | 参数顺序错误 | 确保`--defaults-file`是第一个参数 | | `[ERROR] Can't find file: './mysql/plugin.frm'` | 未初始化或路径错误 | 执行`--initialize`并检查`datadir`权限 | | `[Warning] World-writable config file is ignored` | 配置文件权限不安全 | Linux系统执行`chmod 644 my.cnf` | ### 配置参数优先级 MySQL按以下顺序加载配置(后加载的覆盖前者): 1. 内置默认值 2. `/etc/my.cnf`全局配置文件 3. `$MYSQL_HOME/my.cnf`实例专属配置 4. `--defaults-file`指定文件 5. 命令行参数(最高优先级) 因此,通过`--datadir=/path`可以覆盖配置文件中的定义[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值