16.2. 地理复制要求和约束


  • 在地理复制设置中,Red Hat Quay 要求所有区域都可以读取和写入所有其他区域的对象存储。对象存储必须可以被所有其他区域访问。
  • 如果一个地理复制站点的对象存储系统失败,该站点的 Red Hat Quay 部署必须被关闭,以便客户端由全局负载均衡器重定向到具有完整存储系统的剩余站点。否则,客户端将遇到拉取和推送失败。
  • Red Hat Quay 没有内部感知连接的对象存储系统的健康状态或可用性。用户必须配置全局负载均衡器(LB)来监控分布式系统的健康状况,并根据存储状态将流量路由到不同的站点。
  • 要检查 geo-replication 部署的状态,您必须使用 /health/endtoend 检查点,该检查点用于全局健康监控。您必须使用 /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 在跨地复制环境中工作,其中多个 Operator 实例必须与同一数据库通信。如需更多信息,请参阅高级 Clair 配置

    如果 Clair 配置保持 管理,则必须检索由 Operator 部署的 Clair 实例的配置文件。如需更多信息,请参阅 为 OpenShift Container Platform 上的 Clair 部署检索并解码 Clair 配置 secret

  • geo-Replication 需要 SSL/TLS 证书和密钥。如需更多信息,请参阅 * Geo-Replication 需要 SSL/TLS 证书和密钥。如需更多信息,请参阅使用 SSL/TLS 证书部署概念验证

如果无法满足上述要求,您应该使用两个或多个 Red Hat Quay 部署,并利用存储库镜像功能。

16.2.1. 为独立 Red Hat Quay 启用存储复制

使用以下步骤在 Red Hat Quay 上启用存储复制。

流程

  1. 更新 config.yaml 文件,使其包含要复制数据的存储引擎。您必须列出所有要使用的存储引擎:

    # ...
    FEATURE_STORAGE_REPLICATION: true
    # ...
    DISTRIBUTED_STORAGE_CONFIG:
        usstorage:
            - RHOCSStorage
            - access_key: <access_key>
              bucket_name: <example_bucket>
              hostname: my.noobaa.hostname
              is_secure: false
              port: "443"
              secret_key: <secret_key>
              storage_path: /datastorage/registry
        eustorage:
            - S3Storage
            - host: s3.amazon.com
              port: "443"
              s3_access_key: <access_key>
              s3_bucket: <example bucket>
              s3_secret_key: <secret_key>
              storage_path: /datastorage/registry
    DISTRIBUTED_STORAGE_DEFAULT_LOCATIONS: []
    DISTRIBUTED_STORAGE_PREFERENCE:
        - usstorage
        - eustorage
    # ...
    Copy to Clipboard Toggle word wrap
  2. 可选。如果需要完成所有镜像到所有存储引擎,您可以通过手动设置 DISTRIBUTED_STORAGE_DEFAULT_LOCATIONS 字段来手动将镜像复制到存储引擎。这样可确保所有镜像都复制到该存储引擎中。例如:

    # ...
    DISTRIBUTED_STORAGE_DEFAULT_LOCATIONS:
        - usstorage
        - eustorage
    # ...
    Copy to Clipboard Toggle word wrap
    注意

    要启用按命名空间复制,请联络 Red Hat Quay 支持。

  3. 在为异地复制添加存储 并启用 Replicate 到存储引擎 后,您必须在所有存储中同步现有镜像数据。要做到这一点,您必须运行以下命令来在容器中执行:

    $ podman exec -it <container_id>
    Copy to Clipboard Toggle word wrap
  4. 要在添加新存储后同步内容,请输入以下命令:

    # scl enable python27 bash
    Copy to Clipboard Toggle word wrap
    # python -m util.backfillreplication
    Copy to Clipboard Toggle word wrap
    注意

    这是添加新存储后要同步内容的一个时间操作。

16.2.2. 使用存储首选项运行 Red Hat Quay

  1. 将 config.yaml 复制到所有运行 Red Hat Quay 的机器
  2. 对于每个区域中的每个机器,添加一个 QUAY_DISTRIBUTED_STORAGE_PREFERENCE 环境变量,其中包含运行机器的区域的首选存储引擎。

    例如,对于在 Europe 中运行且具有 $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.14.4
    Copy to Clipboard Toggle word wrap
    注意

    指定的环境变量值必须与配置面板中定义的 Location ID 的名称匹配。

  3. 重启所有 Red Hat Quay 容器

通过使用以下步骤,Red Hat Quay 管理员可以删除地理复制设置中的站点。

先决条件

  • 您已配置了 Red Hat Quay 异地复制,至少有两个站点,例如 usstorageeustorage
  • 每个站点都有自己的组织、存储库和镜像标签。

流程

  1. 运行以下命令,同步所有定义的站点之间的 Blob:

    $ python -m util.backfillreplication
    Copy to Clipboard Toggle word wrap
    警告

    在从 Red Hat Quay config.yaml 文件中删除存储引擎 前,您必须确保在 所有定义的站点间同步所有 Blob。在继续操作前完成此步骤。

  2. 在 Red Hat Quay config.yaml 文件中,删除 eu storage 站点的 DISTRIBUTED_STORAGE_CONFIG 条目。
  3. 输入以下命令获取正在运行的容器列表:

    $ podman ps
    Copy to Clipboard Toggle word wrap

    输出示例

    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 Toggle word wrap

  4. 输入以下命令在 PostgreSQL 容器内执行 shell:

    $ podman exec -it postgresql-quay -- /bin/bash
    Copy to Clipboard Toggle word wrap
  5. 运行以下命令来输入 psql :

    bash-4.4$ psql
    Copy to Clipboard Toggle word wrap
  6. 输入以下命令在地理复制部署中显示站点列表:

    quay=# select * from imagestoragelocation;
    Copy to Clipboard Toggle word wrap

    输出示例

     id |       name
    ----+-------------------
      1 | usstorage
      2 | eustorage
    Copy to Clipboard Toggle word wrap

  7. 输入以下命令退出 postgres CLI 以重新输入 bash-4.4:

    \q
    Copy to Clipboard Toggle word wrap
  8. 输入以下命令永久删除 eustorage 站点:

    重要

    以下操作无法撤消。请谨慎使用。

    bash-4.4$ python -m util.removelocation eustorage
    Copy to Clipboard Toggle word wrap

    输出示例

    WARNING: This is a destructive operation. Are you sure you want to remove eustorage from your storage locations? [y/n] y
    Deleted placement 30
    Deleted placement 31
    Deleted placement 32
    Deleted placement 33
    Deleted location eustorage
    Copy to Clipboard Toggle word wrap

使用以下步骤在 OpenShift Container Platform 上设置 geo-replication。

流程

  1. 为 Red Hat Quay 部署 postgres 实例。
  2. 输入以下命令登录到数据库:

    psql -U <username> -h <hostname> -p <port> -d <database_name>
    Copy to Clipboard Toggle word wrap
  3. 为 Red Hat Quay 创建名为 quay 的数据库。例如:

    CREATE DATABASE quay;
    Copy to Clipboard Toggle word wrap
  4. 在数据库中启用 pg_trm 扩展

    \c quay;
    CREATE EXTENSION IF NOT EXISTS pg_trgm;
    Copy to Clipboard Toggle word wrap
  5. 部署 Redis 实例:

    注意
    • 如果您的云供应商有自己的服务,则部署 Redis 实例可能是必需的。
    • 如果您使用 Builders,则需要部署 Redis 实例。
    1. 为 Redis 部署虚拟机
    2. 验证是否可以从运行 Red Hat Quay 的集群访问
    3. 必须打开端口 6379/TCP
    4. 在实例内运行 Redis

      sudo dnf install -y podman
      podman run -d --name redis -p 6379:6379 redis
      Copy to Clipboard Toggle word wrap
  6. 创建两个对象存储后端,每个集群一个。理想情况下,一个对象存储桶将接近第一个或主集群,另一个则运行更接近第二个或次要集群。
  7. 使用同一配置捆绑包部署集群,使用环境变量覆盖来为单个集群选择适当的存储后端。
  8. 配置负载均衡器,以提供集群的单个入口点。

使用以下步骤为 OpenShift Container Platform 上的 Red Hat Quay 配置 geo-replication。

流程

  1. 创建在集群之间共享的 config.yaml 文件。此 config.yaml 文件包含通用 PostgreSQL、Redis 和存储后端的详情:

    geo-replication config.yaml 文件

    SERVER_HOSTNAME: <georep.quayteam.org or any other name> 
    1
    
    DB_CONNECTION_ARGS:
      autorollback: true
      threadlocals: true
    DB_URI: postgresql://postgres:password@10.19.0.1:5432/quay
    BUILDLOGS_REDIS:
      host: 10.19.0.2
      port: 6379
    USER_EVENTS_REDIS:
      host: 10.19.0.2
      port: 6379
    DATABASE_SECRET_KEY: 0ce4f796-c295-415b-bf9d-b315114704b8
    DISTRIBUTED_STORAGE_CONFIG:
      usstorage:
        - GoogleCloudStorage
        - access_key: GOOGQGPGVMASAAMQABCDEFG
          bucket_name: georep-test-bucket-0
          secret_key: AYWfEaxX/u84XRA2vUX5C987654321
          storage_path: /quaygcp
      eustorage:
        - GoogleCloudStorage
        - access_key: GOOGQGPGVMASAAMQWERTYUIOP
          bucket_name: georep-test-bucket-1
          secret_key: AYWfEaxX/u84XRA2vUX5Cuj12345678
          storage_path: /quaygcp
    DISTRIBUTED_STORAGE_DEFAULT_LOCATIONS:
      - usstorage
      - eustorage
    DISTRIBUTED_STORAGE_PREFERENCE:
      - usstorage
      - eustorage
    FEATURE_STORAGE_REPLICATION: true
    Copy to Clipboard Toggle word wrap

    1
    路由必须使用正确的 SERVER_HOSTNAME,并且必须与全局负载平衡器的主机名匹配。
  2. 输入以下命令来创建 configBundleSecret

    $ oc create secret generic --from-file config.yaml=./config.yaml georep-config-bundle
    Copy to Clipboard Toggle word wrap
  3. 在每个集群中,设置 configBundleSecret,并使用 QUAY_DISTRIBUTED_STORAGE_PREFERENCE 环境变量覆盖来为该集群配置适当的存储。例如:

    注意

    两个部署之间的 config.yaml 文件都必须匹配。如果对一个集群进行更改,还必须更改它。

    US cluster QuayRegistry 示例

    apiVersion: quay.redhat.com/v1
    kind: QuayRegistry
    metadata:
      name: example-registry
      namespace: quay-enterprise
    spec:
      configBundleSecret: georep-config-bundle
      components:
        - kind: objectstorage
          managed: false
        - kind: route
          managed: true
        - kind: tls
          managed: false
        - kind: postgres
          managed: false
        - kind: clairpostgres
          managed: false
        - kind: redis
          managed: false
        - kind: quay
          managed: true
          overrides:
            env:
            - name: QUAY_DISTRIBUTED_STORAGE_PREFERENCE
              value: usstorage
        - kind: mirror
          managed: true
          overrides:
            env:
            - name: QUAY_DISTRIBUTED_STORAGE_PREFERENCE
              value: usstorage
    Copy to Clipboard Toggle word wrap

    注意

    因为 SSL/TLS 是非受管的,且路由被管理,因此您必须直接在 config 捆绑包中提供证书。如需更多信息,请参阅配置 SSL/TLS 和路由

    欧洲集群

    apiVersion: quay.redhat.com/v1
    kind: QuayRegistry
    metadata:
      name: example-registry
      namespace: quay-enterprise
    spec:
      configBundleSecret: georep-config-bundle
      components:
        - kind: objectstorage
          managed: false
        - kind: route
          managed: true
        - kind: tls
          managed: false
        - kind: postgres
          managed: false
        - kind: clairpostgres
          managed: false
        - kind: redis
          managed: false
        - kind: quay
          managed: true
          overrides:
            env:
            - name: QUAY_DISTRIBUTED_STORAGE_PREFERENCE
              value: eustorage
        - kind: mirror
          managed: true
          overrides:
            env:
            - name: QUAY_DISTRIBUTED_STORAGE_PREFERENCE
              value: eustorage
    Copy to Clipboard Toggle word wrap

    注意

    因为 SSL/TLS 是非受管的,且路由被管理,因此您必须直接在 config 捆绑包中提供证书。如需更多信息,请参阅配置 SSL/TLS 和路由

通过使用以下步骤,Red Hat Quay 管理员可以删除地理复制设置中的站点。

先决条件

  • 已登陆到 OpenShift Container Platform。
  • 您已配置了 Red Hat Quay 异地复制,至少有两个站点,例如 usstorageeustorage
  • 每个站点都有自己的组织、存储库和镜像标签。

流程

  1. 运行以下命令,同步所有定义的站点之间的 Blob:

    $ python -m util.backfillreplication
    Copy to Clipboard Toggle word wrap
    警告

    在从 Red Hat Quay config.yaml 文件中删除存储引擎 前,您必须确保在 所有定义的站点间同步所有 Blob。

    在运行此命令时,会创建复制作业,由复制工作程序提取。如果有需要复制的 Blob,该脚本会返回将复制的 Blob 的 UUID。如果您多次运行此命令,并且返回脚本的输出为空,并不意味着完成复制过程;这意味着没有更多 Blob 进行复制。客户应在继续前使用适当的 judgement,因为分配的时间复制取决于检测到的 Blob 数量。

    或者,您可以使用第三方云工具(如 Microsoft Azure)来检查同步状态。

    在继续之前,必须完成此步骤。

  2. 在 Red Hat Quay config.yaml 文件中,删除 eu storage 站点的 DISTRIBUTED_STORAGE_CONFIG 条目。
  3. 输入以下命令来标识 Quay 应用程序 pod:

    $ oc get pod -n <quay_namespace>
    Copy to Clipboard Toggle word wrap

    输出示例

    quay390usstorage-quay-app-5779ddc886-2drh2
    quay390eustorage-quay-app-66969cd859-n2ssm
    Copy to Clipboard Toggle word wrap

  4. 输入以下命令在 usstorage pod 中打开交互式 shell 会话:

    $ oc rsh quay390usstorage-quay-app-5779ddc886-2drh2
    Copy to Clipboard Toggle word wrap
  5. 输入以下命令永久删除 eustorage 站点:

    重要

    以下操作无法撤消。请谨慎使用。

    sh-4.4$ python -m util.removelocation eustorage
    Copy to Clipboard Toggle word wrap

    输出示例

    WARNING: This is a destructive operation. Are you sure you want to remove eustorage from your storage locations? [y/n] y
    Deleted placement 30
    Deleted placement 31
    Deleted placement 32
    Deleted placement 33
    Deleted location eustorage
    Copy to Clipboard Toggle word wrap

返回顶部
Red Hat logoGithubredditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

通过我们的产品和服务,以及可以信赖的内容,帮助红帽用户创新并实现他们的目标。 了解我们当前的更新.

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

Theme

© 2025 Red Hat