16.2. 地域复制要求和限制
- 在地理复制设置中,Red Hat Quay 要求所有区域都可以读取和写入所有其他区域的对象存储。对象存储必须可以被所有其他区域访问。
- 如果一个地理复制站点的对象存储系统失败,该站点的 Red Hat Quay 部署必须被关闭,以便客户端由全局负载均衡器重定向到具有完整存储系统的剩余站点。否则,客户端将遇到拉取和推送失败。
- Red Hat Quay 没有内部感知连接的对象存储系统的健康状态或可用性。用户必须配置一个全局负载均衡器(LB),以监控分布式系统的健康状况,并根据存储状态将流量路由到不同的站点。
-
要检查 geo-replication 部署的状态,您必须使用
/health/endtoend
checkpoint,该检查点用于全局健康监控。您必须使用/health/endtoend
端点手动配置重定向。/health/instance
端点仅检查本地实例健康状况。 - 如果一个站点的对象存储系统不可用,则其余站点或站点没有自动重定向到剩余的存储系统或系统。
- 地理复制(geo-replication)是异步的。如果一个站点永久丢失,则已存储在该站点的对象存储系统中,但在失败时还没有复制到剩余的站点的数据会丢失。
单个数据库(因此所有元数据和 Red Hat Quay 配置)在所有区域之间共享。
地理复制不会复制数据库。如果出现停机,启用了地理复制功能的 Red Hat Quay 不会切换到另一个数据库。
- 单个 Redis 缓存在整个 Red Hat Quay 设置间共享,需要可以被所有 Red Hat Quay pod 访问。
-
完全相同的配置应该在所有区域间使用,但存储后端除外,该配置也可以使用
QUAY_DISTRIBUTED_STORAGE_PREFERENCE
环境变量明确配置。 - 地理复制需要每个区域中的对象存储。它不适用于本地存储。
- 每个区域必须能够访问每个区域中的每个存储引擎,这需要一个网络路径。
- 或者,可以使用存储代理选项。
- 整个存储后端(如所有 blob)都会被复制。相反,存储库镜像可以限制为存储库或镜像。
- 所有 Red Hat Quay 实例都必须共享相同的入口点,通常通过负载均衡器。
- 所有 Red Hat Quay 实例都必须具有相同的超级用户集合,因为它们在通用配置文件中定义。
-
地理复制要求您的 Clair 配置设置为
unmanaged
。非受管 Clair 数据库允许 Red Hat Quay Operator 在地理复制环境中工作,其中多个 Red Hat Quay Operator 实例必须与同一数据库通信。如需更多信息,请参阅高级 Clair 配置。 - geo-Replication 需要 SSL/TLS 证书和密钥。如需更多信息,请参阅使用 SSL/TLS 保护到 Red Hat Quay 的连接。
如果无法满足上述要求,您应该使用两个不同的 Red Hat Quay 部署,并利用存储库镜像功能。
16.2.1. 为独立 Red Hat Quay 启用存储复制 复制链接链接已复制到粘贴板!
使用以下步骤在 Red Hat Quay 上启用存储复制。
流程
更新
config.yaml
文件,使其包含要复制数据的存储引擎。您必须列出所有要使用的存储引擎:Copy to Clipboard Copied! Toggle word wrap Toggle overflow 可选。如果需要将所有镜像复制到所有存储引擎,您可以通过手动设置
DISTRIBUTED_STORAGE_DEFAULT_LOCATIONS
字段来将镜像复制到存储引擎。这可确保所有镜像复制到该存储引擎。例如:# ... DISTRIBUTED_STORAGE_DEFAULT_LOCATIONS: - usstorage - eustorage # ...
# ... DISTRIBUTED_STORAGE_DEFAULT_LOCATIONS: - usstorage - eustorage # ...
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 注意要启用每个命名空间复制,请联系红帽 Quay 支持。
为异地复制 默认将存储并启用 Replicate 到存储引擎 后,您必须在所有存储间同步现有镜像数据。要做到这一点,您必须运行以下命令来在容器中执行:
podman exec -it <container_id>
$ podman exec -it <container_id>
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 要在添加新存储后同步内容,请输入以下命令:
scl enable python27 bash
# scl enable python27 bash
Copy to Clipboard Copied! Toggle word wrap Toggle overflow python -m util.backfillreplication
# python -m util.backfillreplication
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 注意这是添加新存储后同步内容的一次性操作。
16.2.2. 使用存储首选项运行 Red Hat Quay 复制链接链接已复制到粘贴板!
- 将 config.yaml 复制到运行 Red Hat Quay 的所有机器
对于每个区域中的每个机器,使用机器运行的区域的首选存储引擎添加
QUAY_DISTRIBUTED_STORAGE_PREFERENCE
环境变量。例如,对于在欧洲运行的机器,主机上有
$QUAY/config
的配置目录:sudo podman run -d --rm -p 80:8080 -p 443:8443 \ --name=quay \ -v $QUAY/config:/conf/stack:Z \ -e QUAY_DISTRIBUTED_STORAGE_PREFERENCE=europestorage \ registry.redhat.io/quay/quay-rhel8:v3.11.10
$ sudo podman run -d --rm -p 80:8080 -p 443:8443 \ --name=quay \ -v $QUAY/config:/conf/stack:Z \ -e QUAY_DISTRIBUTED_STORAGE_PREFERENCE=europestorage \ registry.redhat.io/quay/quay-rhel8:v3.11.10
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 注意指定的环境变量值必须与 config 面板中定义的 Location ID 的名称匹配。
- 重启所有 Red Hat Quay 容器
16.2.3. 从独立的 Red Hat Quay 部署中删除地理复制站点 复制链接链接已复制到粘贴板!
通过按照以下流程,Red Hat Quay 管理员可以删除地理复制设置中的站点。
先决条件
-
您已为 Red Hat Quay geo-replication 配置至少两个站点,例如
usstorage
和eustorage
。 - 每个站点都有自己的组织、存储库和镜像标签。
流程
运行以下命令,在所有定义的站点间同步 Blob:
python -m util.backfillreplication
$ python -m util.backfillreplication
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 警告在从 Red Hat Quay
config.yaml
文件中删除存储引擎 前,您必须确保 所有 Blob 在所有定义的站点间同步。在继续操作前,请完成此步骤。-
在站点
usstorage
的 Red Hat Quayconfig.yaml
文件中,删除eustorage
站点的DISTRIBUTED_STORAGE_CONFIG
条目。 输入以下命令获取正在运行的容器列表:
podman ps
$ podman ps
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 输出示例
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 92c5321cde38 registry.redhat.io/rhel8/redis-5:1 run-redis 11 days ago Up 11 days ago 0.0.0.0:6379->6379/tcp redis 4e6d1ecd3811 registry.redhat.io/rhel8/postgresql-13:1-109 run-postgresql 33 seconds ago Up 34 seconds ago 0.0.0.0:5432->5432/tcp postgresql-quay d2eadac74fda registry-proxy.engineering.redhat.com/rh-osbs/quay-quay-rhel8:v3.9.0-131 registry 4 seconds ago Up 4 seconds ago 0.0.0.0:80->8080/tcp, 0.0.0.0:443->8443/tcp quay
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 92c5321cde38 registry.redhat.io/rhel8/redis-5:1 run-redis 11 days ago Up 11 days ago 0.0.0.0:6379->6379/tcp redis 4e6d1ecd3811 registry.redhat.io/rhel8/postgresql-13:1-109 run-postgresql 33 seconds ago Up 34 seconds ago 0.0.0.0:5432->5432/tcp postgresql-quay d2eadac74fda registry-proxy.engineering.redhat.com/rh-osbs/quay-quay-rhel8:v3.9.0-131 registry 4 seconds ago Up 4 seconds ago 0.0.0.0:80->8080/tcp, 0.0.0.0:443->8443/tcp quay
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 输入以下命令在 PostgreSQL 容器内执行 shell:
podman exec -it postgresql-quay -- /bin/bash
$ podman exec -it postgresql-quay -- /bin/bash
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 运行以下命令来输入 psql :
bash-4.4$ psql
bash-4.4$ psql
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 输入以下命令在 geo-replicated 部署中显示站点列表:
quay=# select * from imagestoragelocation;
quay=# select * from imagestoragelocation;
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 输出示例
id | name ----+------------------- 1 | usstorage 2 | eustorage
id | name ----+------------------- 1 | usstorage 2 | eustorage
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 输入以下命令退出 postgres CLI 以重新输入 bash-4.4 :
\q
\q
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 输入以下命令永久删除
eustorage
站点:重要无法撤销以下操作。请谨慎使用。
bash-4.4$ python -m util.removelocation eustorage
bash-4.4$ python -m util.removelocation eustorage
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 输出示例
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
16.2.4. 在 OpenShift Container Platform 中设置地理复制 复制链接链接已复制到粘贴板!
使用以下步骤在 OpenShift Container Platform 上设置异地复制。
流程
- 为 Red Hat Quay 部署 postgres 实例。
输入以下命令登录到数据库:
psql -U <username> -h <hostname> -p <port> -d <database_name>
psql -U <username> -h <hostname> -p <port> -d <database_name>
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 为 Red Hat Quay 创建名为
quay
的数据库。例如:CREATE DATABASE quay;
CREATE DATABASE quay;
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 在数据库中启用 pg_trm 扩展
\c quay; CREATE EXTENSION IF NOT EXISTS pg_trgm;
\c quay; CREATE EXTENSION IF NOT EXISTS pg_trgm;
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 部署 Redis 实例:
注意- 如果您的云供应商有自己的服务,则部署 Redis 实例可能是必需的。
- 如果您使用 Builders,则需要部署 Redis 实例。
- 为 Redis 部署虚拟机
- 验证可以从运行 Red Hat Quay 的集群访问它
- 必须打开端口 6379/TCP
在实例内运行 Redis
sudo dnf install -y podman podman run -d --name redis -p 6379:6379 redis
sudo dnf install -y podman podman run -d --name redis -p 6379:6379 redis
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
- 创建两个对象存储后端,每个集群一个。理想情况下,一个对象存储桶将接近第一个或主、集群,另一个将接近第二个或次要集群。
- 使用环境变量覆盖来部署具有相同配置捆绑包的集群,以便为单个集群选择适当的存储后端。
- 配置负载均衡器以为集群提供单一入口点。
使用以下步骤为 OpenShift Container Platform 上的 Red Hat Quay 配置 geo-replication。
流程
创建在集群之间共享的
config.yaml
文件。此config.yaml
文件包含常见 PostgreSQL、Redis 和存储后端的详情:geo-replication
config.yaml
文件Copy to Clipboard Copied! Toggle word wrap Toggle overflow 运行以下命令来创建
configBundleSecret
:oc create secret generic --from-file config.yaml=./config.yaml georep-config-bundle
$ oc create secret generic --from-file config.yaml=./config.yaml georep-config-bundle
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 在每个集群中,设置
configBundleSecret
,并使用QUAY_DISTRIBUTED_STORAGE_PREFERENCE
环境变量覆盖来配置该集群的相应存储。例如:注意两个部署之间的
config.yaml
文件都必须匹配。如果对一个集群进行更改,还必须在另一个集群中更改它。美国集群
QuayRegistry
示例Copy to Clipboard Copied! Toggle word wrap Toggle overflow 注意因为 SSL/TLS 是非受管的,并且路由被管理,所以您必须在配置捆绑包中直接提供证书。如需更多信息,请参阅配置 TLS 和路由。
欧洲集群
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 注意因为 SSL/TLS 是非受管的,并且路由被管理,所以您必须在配置捆绑包中直接提供证书。如需更多信息,请参阅配置 TLS 和路由。
通过按照以下流程,Red Hat Quay 管理员可以删除地理复制设置中的站点。
先决条件
- 已登陆到 OpenShift Container Platform。
-
您已为 Red Hat Quay geo-replication 配置至少两个站点,例如
usstorage
和eustorage
。 - 每个站点都有自己的组织、存储库和镜像标签。
流程
运行以下命令,在所有定义的站点间同步 Blob:
python -m util.backfillreplication
$ python -m util.backfillreplication
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 警告在从 Red Hat Quay
config.yaml
文件中删除存储引擎 前,您必须确保 所有 Blob 在所有定义的站点间同步。运行此命令时,会创建复制 worker 提取的复制作业。如果存在需要复制的 Blob,脚本会返回要复制的 Blob 的 UUID。如果您多次运行此命令,并且返回脚本的输出为空,这并不意味着复制过程已完成;这意味着没有为复制进行排队。在继续操作前,客户应该使用适当的 judgement,因为分配的时间复制取决于检测到的 Blob 数量。
另外,您可以使用 Microsoft Azure 等第三方云工具来检查同步状态。
在继续操作前,必须完成此步骤。
-
在站点
usstorage
的 Red Hat Quayconfig.yaml
文件中,删除eustorage
站点的DISTRIBUTED_STORAGE_CONFIG
条目。 输入以下命令识别您的
Quay
应用程序 pod:oc get pod -n <quay_namespace>
$ oc get pod -n <quay_namespace>
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 输出示例
quay390usstorage-quay-app-5779ddc886-2drh2 quay390eustorage-quay-app-66969cd859-n2ssm
quay390usstorage-quay-app-5779ddc886-2drh2 quay390eustorage-quay-app-66969cd859-n2ssm
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 输入以下命令在
usstorage
pod 中打开交互式 shell 会话:oc rsh quay390usstorage-quay-app-5779ddc886-2drh2
$ oc rsh quay390usstorage-quay-app-5779ddc886-2drh2
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 输入以下命令永久删除
eustorage
站点:重要无法撤销以下操作。请谨慎使用。
python -m util.removelocation eustorage
sh-4.4$ python -m util.removelocation eustorage
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 输出示例
Copy to Clipboard Copied! Toggle word wrap Toggle overflow