
什么是 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 重要的:
- 请使用您的应用程序镜像更新上述代码段中的YOUR_APPLICATION_IMAGE 占位符
- 在您的应用程序容器中,使用主机名
pg-0连接到PostgreSQL服务器
使用以下命令启动容器:
$ docker-compose up -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 中指定的文件内容)。
$ docker run --name pg-0 --env REPMGR_PASSWORD=repmgrpass --env POSTGRESQL_PASSWORD=secretpass bitnami/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 客户端手动创建数据库。
$ docker run --name pg-0 --env POSTGRESQL_DATABASE=my_database bitnami/postgresql-repmgr:latest 首次运行时创建数据库用户
您还可以创建一个受限数据库用户,该用户仅对使用POSTGRESQL_DATABASE 环境变量创建的数据库具有权限。 为此,请提供POSTGRESQL_USERNAME 环境变量。
$ docker run --name pg-0 --env POSTGRESQL_USERNAME=my_user --env POSTGRESQL_PASSWORD=password123 --env POSTGRESQL_DATABASE=my_database bitnami/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
$ docker network create my-network --driver bridge Step 2: 创建初始主节点
第一步是启动初始主节点:
$ docker run --detach --name pg-0 \ --network my-network \ --env REPMGR_PARTNER_NODES=pg-0,pg-1 \ --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: 创建备用节点
接下来我们启动一个备用节点:
$ docker run --detach --name pg-1 \ --network my-network \ --env REPMGR_PARTNER_NODES=pg-0,pg-1 \ --env REPMGR_NODE_NAME=pg-1 \ --env REPMGR_NODE_NETWORK_NAME=pg-1 \ --env REPMGR_PRIMARY_HOST=pg-0 \ --env REPMGR_PASSWORD=repmgrpass \ --env POSTGRESQL_PASSWORD=secretpass \ bitnami/postgresql-repmgr:latest 使用这三个命令,您现在可以启动并运行一个两节点 PostgreSQL 主备流复制集群。 您可以通过添加/删除备用节点来扩展集群,而不会导致任何停机时间。
注意:集群会完整地复制主节点,其中包括所有用户和数据库。
如果主节点宕机,repmgr 将确保任何备用节点担任主节点,从而保证高可用性。
注意:集群中其他节点的配置需要更新,以便它们知道它们。这将需要重新启动旧节点,以适应 REPMGR_PARTNER_NODES 环境变量。
使用Docker Compose,可以使用此存储库中的docker-compose.yml 文件设置HA PostgreSQL 集群:
$ curl -sSL https://raw.githubusercontent.com/bitnami/bitnami-docker-postgresql-repmgr/master/docker-compose.yml > docker-compose.yml $ docker-compose up -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
$ docker run \ -v /path/to/certs:/opt/bitnami/postgresql/certs \ -e POSTGRESQL_ENABLE_TLS=yes \ -e POSTGRESQL_TLS_CERT_FILE=/opt/bitnami/postgresql/certs/postgres.crt \ -e POSTGRESQL_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 用户,因此您需要为主机中的挂载目录设置适当的权限:
$ sudo chgrp -R root /path/to/custom-conf/ $ sudo chmod -R g+rwX /path/to/custom-conf/ Step 1: 运行 PostgreSQL 镜像
运行 PostgreSQL 镜像,从您的主机挂载一个目录。
$ docker run --name pg-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 容器以使更改生效。
$ docker restart pg-0 或者使用Docker Compose:
$ docker-compose restart pg-0 $ docker-compose restart pg-1 有关配置选项的完整列表,请参阅服务器配置手册。
允许从默认postgresql.conf 以外的文件加载设置。
除了使用自定义的repmgr.conf、postgresql.conf 或pg_hba.conf,您还可以在/bitnami/postgresql/conf/ 的卷中包含conf.d 目录中以.conf 结尾的文件。为此,默认的postgresql.conf 包含以下部分:
##------------------------------------------------------------------------------ ## CONFIG FILE INCLUDES ##------------------------------------------------------------------------------ ## These options allow settings to be loaded from files other than the ## default postgresql.conf. include_dir = 'conf.d' # Include files ending in '.conf' from directory 'conf.d' 如果您使用自定义postgresql.conf,您应该在配置文件中创建(或取消注释)上述部分,在这种情况下,结构应该类似于
/path/to/custom-conf/ └── postgresql.conf /path/to/extra-custom-conf/ └── extended.conf 请记住为主机中的挂载目录设置适当的权限:
$ sudo chgrp -R root /path/to/extra-custom-conf/ $ sudo chmod -R g+rwX /path/to/extra-custom-conf/ Step 1: 运行 PostgreSQL 镜像
运行PostgreSQL 镜像,从您的主机挂载一个目录。
$ docker run --name pg-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 容器以使更改生效。
$ docker restart pg-0 或者使用 Docker Compose:
$ docker-compose restart pg-0 $ docker-compose restart pg-1 环境变量
请在下表中查看Bitnami PostgreSQL HA 容器中可用的环境变量列表:
| Environment Variable | Default value |
|---|---|
| REPMGR_NODE_ID | nil |
| REPMGR_NODE_ID_START_SEED | 1000 |
| REPMGR_NODE_NAME | nil |
| REPMGR_NODE_NETWORK_NAME | nil |
| REPMGR_NODE_PRIORITY | 100 |
| REPMGR_PARTNER_NODES | nil |
| REPMGR_PRIMARY_HOST | nil |
| REPMGR_NODE_LOCATION | default |
| REPMGR_PRIMARY_PORT | 5432 |
| REPMGR_PORT_NUMBER | 5432 |
| REPMGR_LOG_LEVEL | NOTICE |
| REPMGR_START_OPTIONS | nil |
| REPMGR_CONNECT_TIMEOUT | 5 |
| REPMGR_RECONNECT_ATTEMPTS | 3 |
| REPMGR_RECONNECT_INTERVAL | 5 |
| REPMGR_USE_REPLICATION_SLOTS | 1 |
| REPMGR_MASTER_RESPONSE_TIMEOUT | 20 |
| REPMGR_DEGRADED_MONITORING_TIMEOUT | 5 |
| REPMGR_USERNAME | repmgr |
| REPMGR_DATABASE | repmgr |
| REPMGR_PASSWORD | nil |
| REPMGR_PASSWORD_FILE | nil |
| REPMGR_FENCE_OLD_PRIMARY | no |
| REPMGR_CHILD_NODES_CHECK_INTERVAL | 5 |
| REPMGR_CHILD_NODES_CONNECTED_MIN_COUNT | 1 |
| REPMGR_CHILD_NODES_DISCONNECT_TIMEOUT | 30 |
| REPMGR_USE_PASSFILE | nil |
| POSTGRESQL_USERNAME | postgres |
| POSTGRESQL_DATABASE | nil |
| POSTGRESQL_PASSWORD | nil |
| POSTGRESQL_PASSWORD_FILE | nil |
| POSTGRESQL_POSTGRES_PASSWORD | nil |
| POSTGRESQL_POSTGRES_PASSWORD_FILE | nil |
| POSTGRESQL_PORT_NUMBER | 5432 |
| POSTGRESQL_INITDB_ARGS | nil |
| POSTGRESQL_PGCTLTIMEOUT | 60 |
| POSTGRESQL_SHUTDOWN_MODE | fast |
| POSTGRESQL_ENABLE_TLS | no |
| POSTGRESQL_TLS_CERT_FILE | nil |
| POSTGRESQL_TLS_KEY_FILE | nil |
| POSTGRESQL_TLS_CA_FILE | nil |
| POSTGRESQL_TLS_CRL_FILE | nil |
| POSTGRESQL_TLS_PREFER_SERVER_CIPHERS | yes |
日志
Bitnami PostgreSQL HA Docker 镜像将容器日志发送到stdout。查看日志:
$ docker logs pg-0 如果您希望以不同的方式使用容器日志,则可以使用--log-driver 选项配置容器logging driver。在默认配置中,docker 使用json-file driver。
维护
升级这个镜像
Bitnami 提供了PostgreSQL HA 的最新版本,包括安全补丁,这些补丁在上游发布后很快就会发布。我们建议您按照以下步骤升级容器。
Step 1: 获取更新的镜像
$ docker pull bitnami/postgresql-repmgr:latest 或者,如果您使用的是Docker Compose,请将image 属性的值更新为bitnami/postgresql-repmgr:latest。
Step 2: 停止正在运行的容器
使用命令停止当前运行的容器
$ docker stop pg-0 或者使用 Docker Compose:
$ docker-compose stop pg-0 $ docker-compose stop pg-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: 移除当前运行的容器
$ docker rm -v pg-0 或者使用 Docker Compose:
$ docker-compose rm -v pg-0 $ docker-compose rm -v pg-1 Step 4: 运行新镜像
从新镜像重新创建容器。
$ docker run --name pg-0 bitnami/postgresql-repmgr:latest 或者使用 Docker Compose:
$ docker-compose up pg-0 $ docker-compose up pg-1 更多
热门文章
- 动物疫苗那里买(动物疫苗厂家有哪些)
- 12月9日|V2ray/SSR/Clash/Shadowrocket每天更新19.6M/S免费节点订阅链接,付费节点订阅推荐
- 11月23日|SSR/V2ray/Shadowrocket/Clash每天更新19.5M/S免费节点订阅链接,付费节点订阅推荐
- 12月31日|SSR/Shadowrocket/Clash/V2ray每天更新18.6M/S免费节点订阅链接,付费节点订阅推荐
- 动物疫苗类型有哪几种种类(动物疫苗的种类和制备原理)
- 猫咪3针疫苗间隔多久打一次好一点(猫三针疫苗间隔多久打)
- 被猫抓了如何判断得没得狂犬(被猫抓了如何判断得没得狂犬病)
- 1月24日|V2ray/Shadowrocket/SSR/Clash每天更新20.1M/S免费节点订阅链接,付费节点订阅推荐
- typescript环境搭建及编译运行
- 1月26日|Clash/SSR/Shadowrocket/V2ray每天更新20.8M/S免费节点订阅链接,付费节点订阅推荐