14.3. PostgreSQL
14.3.1. 描述 复制链接链接已复制到粘贴板!
rhscl/postgresql-13-rhel7 镜像提供 PostgreSQL 13 SQL 数据库服务器; rhscl/postgresql-12-rhel7 镜像提供 PostgreSQL 12 服务器,而 rhscl/postgresql-10-rhel7 镜像提供 PostgreSQL 10 服务器。
14.3.2. 访问和使用 复制链接链接已复制到粘贴板!
要拉取 rhscl/postgresql-13-rhel7 镜像,以 root 用户身份运行以下命令:
podman pull registry.redhat.io/rhscl/postgresql-13-rhel7
# podman pull registry.redhat.io/rhscl/postgresql-13-rhel7
要拉取 rhscl/postgresql-12-rhel7 镜像,以 root 用户身份运行以下命令:
podman pull registry.redhat.io/rhscl/postgresql-12-rhel7
# podman pull registry.redhat.io/rhscl/postgresql-12-rhel7
要拉取 rhscl/postgresql-10-rhel7 镜像,以 root 用户身份运行以下命令:
podman pull registry.redhat.io/rhscl/postgresql-10-rhel7
# podman pull registry.redhat.io/rhscl/postgresql-10-rhel7
要只设置强制环境变量,而不将数据库存储在主机目录中,请执行以下命令:
podman run -d --name postgresql_database -e POSTGRESQL_USER=<user> \ -e POSTGRESQL_PASSWORD=<pass> -e POSTGRESQL_DATABASE=<db> \ -p 5432:5432 <image_name>
# podman run -d --name postgresql_database -e POSTGRESQL_USER=<user> \
-e POSTGRESQL_PASSWORD=<pass> -e POSTGRESQL_DATABASE=<db> \
-p 5432:5432 <image_name>
这将创建一个名为 postgresql_database 的容器,它使用数据库 db 和 user 运行 PostgreSQL,其凭据用户为 :pass。端口 5432 将公开并映射到主机。如果您希望数据库在容器执行之间持久,还要添加 -v /host/db/path:/var/lib/pgsql/data 参数。这将是 PostgreSQL 数据库集群目录。
如果没有初始化数据库集群目录,则入口点脚本首先运行 initdb 并设置必要的数据库用户和密码。初始化数据库后,或者已经存在,则执行 postgres,并将作为 PID 1 运行。您可以通过运行 podman stop postgresql_database 命令来停止分离的容器。
postgres 守护进程首先将其日志写入标准输出。要检查容器镜像日志,请使用 podman logs <image_name> 命令。然后,日志输出被重定向到日志记录收集器进程,并出现在 pg_log/ 目录中。
14.3.3. 配置 复制链接链接已复制到粘贴板!
镜像通过将 -e VAR=VALUE 传递给 podman run 命令来识别您可以在初始化过程中设置的以下环境变量:
| 变量名称 | 描述 |
|---|---|
|
| 要创建的 PostgreSQL 帐户的用户名 |
|
| 用户帐户的密码 |
|
| 数据库名称 |
|
| postgres admin 帐户的密码(可选) |
postgres 管理员帐户默认没有设置密码,仅允许本地连接。您可以在初始化容器时设置 POSTGRESQL_ADMIN_PASSWORD 环境变量来设置它。这样,您可以远程登录到 postgres 帐户。本地连接仍不需要密码。
由于密码是镜像配置的一部分,因此唯一支持的为数据库用户更改密码的方法是分别更改环境变量 POSTGRESQL_PASSWORD 和 POSTGRESQL_ADMIN_PASSWORD。通过 SQL 语句或者通过环境变量更改数据库密码会导致变量中保存的值与实际密码不匹配。每当数据库容器镜像启动时,它会将密码重置为环境变量中存储的值。
以下选项与迁移相关:
| 变量名称 | 描述 | 默认 |
|---|---|---|
|
| 要从中迁移的主机名/IP | |
|
|
远程 | |
|
| 可选:Ignore sql 导入错误 | 否 |
以下环境变量会影响 PostgreSQL 配置文件,并且都是可选的:
| 变量名称 | 描述 | 默认 |
|---|---|---|
|
| 允许的最大客户端连接数。这也设置准备的事务的最大数量。 | 100 |
|
| 设置处于 "prepared" 状态的事务的最大数量。如果您使用准备好的事务,可能希望它至少像 max_connections 一样。 | 0 |
|
| 设置专用于 PostgreSQL 用来缓存数据的内存量 | 32M |
|
| 设置为由操作系统和数据库本身提供磁盘缓存量的估算 | 128M |
当使用 --memory 参数集运行 PostgreSQL 镜像时,如果没有为 POSTGRESQL_SHARED_BUFFERS 和 POSTGRESQL_EFFECTIVE_SIZE 提供值,则根据 --memory 参数中提供的值自动计算这些值。该值基于上游公式来计算,并分别设置为 1/4 和 1/2。
您还可以通过将 -v /host:/container 选项传递给 podman run 命令来设置以下挂载点:
| 卷挂载点 | 描述 |
|---|---|
|
| PostgreSQL 数据库集群目录 |
将目录从主机挂载到容器时,请确保挂载的目录具有适当的权限,并且目录的所有者和组与容器中运行的用户 UID 或名称匹配。
除非将 -u 选项与 podman run 命令搭配使用,否则容器中的进程通常会在 UID 26 下运行。要更改数据目录权限,请使用以下命令:
setfacl -m u:26:-wx /your/data/dir podman run <...> -v /your/data/dir:/var/lib/pgsql/data:Z <...>
$ setfacl -m u:26:-wx /your/data/dir
$ podman run <...> -v /your/data/dir:/var/lib/pgsql/data:Z <...>
14.3.4. 数据迁移 复制链接链接已复制到粘贴板!
PostgreSQL 容器镜像支持从远程 PostgreSQL 服务器迁移数据。使用以下命令并更改镜像名称,并在需要时添加可选配置变量:
podman run -d --name postgresql_database \
-e POSTGRESQL_MIGRATION_REMOTE_HOST=172.17.0.2 \
-e POSTGRESQL_MIGRATION_ADMIN_PASSWORD=remoteAdminP@ssword \
[ OPTIONAL_CONFIGURATION_VARIABLES ]
$ podman run -d --name postgresql_database \
-e POSTGRESQL_MIGRATION_REMOTE_HOST=172.17.0.2 \
-e POSTGRESQL_MIGRATION_ADMIN_PASSWORD=remoteAdminP@ssword \
[ OPTIONAL_CONFIGURATION_VARIABLES ]
rhscl/postgresql-12-rhel7
迁移完成转储和恢复方法(针对远程集群运行 pg_dumpall 并通过 psql在本地导入转储)。因为进程已流化(unix 管道),所以这个过程中没有创建中间转储文件,所以不会浪费额外的存储空间。
如果应用过程中某些 SQL 命令失败,则迁移脚本的默认行为也未能确保脚本化、无人值守迁移的"全部或无"结果。在大多数常见情况下,您期望迁移成功(但不保证),从先前版本的 PostgreSQL 服务器容器迁移(使用相同原则创建),例如:从 rhscl/postgresql-10-rhel7 迁移到 rhscl/postgresql-12-rhel7。从不同类型的 PostgreSQL 容器镜像迁移可能会失败。
如果这个"所有或无"原则不开了,则有一个可选的 POSTGRESQL_MIGRATION_IGNORE_ERRORS 选项,该选项该选项是"尽力迁移"。但是,一些数据可能会丢失,并且用户最多可以检查标准错误输出,并在迁移后手动解决问题。
容器镜像为用户提供迁移帮助,但无法保证完全自动迁移。因此,在开始迁移数据库前,您需要执行手动步骤来获取迁移的所有数据。
在迁移场景中,您可能不使用 POSTGRESQL_USER 等变量。所有数据(包括数据库、角色或密码)的信息都从旧集群中复制。确保您使用与用于初始化旧 PostgreSQL 容器镜像相同的可选配置变量。如果在远程集群中进行一些非默认配置,您可能需要手动复制配置文件。
旧集群和新 PostgreSQL 集群之间的 IP 通信默认没有加密,而是取决于用户在远程集群中配置 SSL,或使用不同方法确保安全性。
14.3.5. 升级数据库 复制链接链接已复制到粘贴板!
在决定执行数据目录升级前,请确定您已备份所有数据。请注意,如果升级失败,您可能需要手动回滚。
PostreSQL 镜像支持自动升级由上一 rhscl 镜像提供的 PostgreSQL 服务器版本创建的数据目录,例如 rhscl/postgresql-13-rhel7 镜像支持从 rhscl/postgresql-12-rhel7 进行升级。升级过程旨在,您应能够只从镜像 A 切换到镜像 B,并相应地设置 $POSTGRESQL_UPGRADE 变量来显式请求数据库数据转换。
升级过程使用 pg_upgrade 二进制文件进行内部实施,以便容器需要包含两个版本的 PostgreSQL 服务器(请参阅 pg_upgrade man page 了解更多信息)。
对于 pg_upgrade 进程和新服务器版本,需要初始化新的数据目录。这个数据目录由 /var/lib/pgsql/data/ 目录中的容器工具自动创建,它通常是外部 bind-mountpoint。然后,pg_upgrade 执行与转储和恢复方法类似。它同时启动旧的和新的 PostgreSQL 服务器(在容器中使用)和"转储"旧数据目录,同时它会"恢复"到新数据目录中。此操作需要复制许多数据文件。根据您选择的升级类型,相应地设置 $POSTGRESQL_UPGRADE 变量:
|
| 数据文件从旧数据目录复制到新目录中。如果升级失败,这个选项的风险较低。 |
|
| 数据文件从旧数据到新的数据目录中,从而提高性能。但是,旧目录变得不可用,即使出现失败也是如此。 |
确保有足够的空间用于复制的数据。因为空间不足而无法升级失败,可能会导致数据丢失。
14.3.6. 延长镜像 复制链接链接已复制到粘贴板!
PostgreSQL 镜像可以使用 Source-to-image 扩展。
例如,若要使用 ~/image-configuration/ 目录中配置构建自定义 new-postgresql 镜像,请使用以下命令:
s2i build ~/image-configuration/ postgresql new-postgresql
$ s2i build ~/image-configuration/ postgresql new-postgresql
传递给 S2I 构建的目录应包含以下一个或多个目录:
|
|
在容器的早期启动期间,提供此目录中的所有 |
|
|
包含的配置文件( |
|
|
当数据库被新初始化时,包含 shell 脚本( |
|
|
与 |
在 S2I 构建期间,提供的所有文件都复制到新镜像的 /opt/app-root/src/ 目录中。只有具有相同名称的文件可以进行自定义,而用户提供的文件优先于 /usr/share/container-scripts/ 目录中的默认文件,因此可以覆盖它们。