5.7. 配置多站点 Ceph 对象网关

作为系统管理员,您可以配置多站点 Ceph 对象网关来镜像集群间的数据,以满足灾难恢复的需要。

您可以使用一个或多个 RGW 域来配置多站点。域允许其中的 RGW 独立于域外的 RGW 并与其隔离。这样,一个域中写入 RGW 的数据就无法被另一个域中的 RGW 访问。

警告

在单一站点配置中已使用网关后,Ceph-ansible 无法将网关重新配置为多站点设置。您可以手动部署此配置。联系红帽支持以获取帮助。

注意

从 Red Hat Ceph Storage 4.1,您不需要在 group_vars/all.yml 文件中设置 rgw_multisite_endpoints_list 的值。

如需更多信息,请参阅 Red Hat Ceph Storage Object Gateway Configuration and Administration Guide 中的 多站点 部分。

5.7.1. 先决条件

  • 两个 Red Hat Ceph Storage 集群。
  • 在 Ceph 对象网关节点上,执行 Red Hat Ceph Storage安装指南中的安装 Red Hat Ceph Storage 要求一节中列出的任务。
  • 对于每个对象网关节点,执行 Red Hat Ceph Storage 安装指南中的安装 Ceph 对象网关一节中的第 1 到 6 步。

5.7.2. 使用一个域配置多站点 Ceph 对象网关

Ceph-ansible 配置 Ceph 对象网关,以在具有多个 Ceph 对象网关实例的多个存储集群之间镜像数据。

警告

在单一站点配置中已使用网关后,Ceph-ansible 无法将网关重新配置为多站点设置。您可以手动部署此配置。联系红帽支持以获取帮助。

先决条件

  • 两个正在运行的 Red Hat Ceph Storage 集群。
  • 在 Ceph 对象网关节点上,执行 Red Hat Ceph Storage安装指南中的安装 Red Hat Ceph Storage 要求一节中列出的任务。
  • 对于每个对象网关节点,执行 Red Hat Ceph Storage 安装指南中的安装 Ceph 对象网关一节中的第 1 到 6 步。

流程

  1. 生成系统密钥并将其输出捕获至 multi-site-keys.txt 文件中:

    [root@ansible ~]# echo system_access_key: $(cat /dev/urandom | tr -dc 'a-zA-Z0-9' | fold -w 20 | head -n 1) > multi-site-keys.txt
    [root@ansible ~]# echo system_secret_key: $(cat /dev/urandom | tr -dc 'a-zA-Z0-9' | fold -w 40 | head -n 1) >> multi-site-keys.txt

主存储集群

  1. 进入 Ceph-ansible 配置目录:

    [root@ansible ~]# cd /usr/share/ceph-ansible
  2. 打开并编辑 group_vars/all.yml 文件。取消注释 rgw_multisite 行并将其设置为 true。取消注释 rgw_multisite_proto 参数。

    rgw_multisite: true
    rgw_multisite_proto: "http"
  3. /usr/share/ceph-ansible 中创建 host_vars 目录:

    [root@ansible ceph-ansible]# mkdir host_vars
  4. host_vars 中为主存储群集上的每个对象网关节点创建一个文件。文件名应当与 Ansible 清单文件中使用的名称相同。例如,如果对象网关节点命名为 rgw-primary,则创建 host_vars/rgw-primary 文件。

    语法

    touch host_vars/NODE_NAME

    示例

    [root@ansible ceph-ansible]# touch host_vars/rgw-primary

    注意

    如果集群中有多个 Ceph 对象网关节点用于多站点配置,则为每个节点创建单独的文件。

  5. 编辑该文件,并添加对应对象网关节点上所有实例的配置详情。配置以下设置,并相应地更新 ZONE_NAMEZONE_GROUP_NAMEZONE_USER_NAMEZONE_DISPLAY_NAMEREALM_NAME。使用 multi-site-keys.txt 文件中保存的随机字符串用于 ACCESS_KEYSECRET_KEY

    语法

    rgw_instances:
      - instance_name: 'INSTANCE_NAME'
          rgw_multisite: true
          rgw_zonemaster: true
          rgw_zonesecondary: false
          rgw_zonegroupmaster: true
          rgw_zone: ZONE_NAME_1
          rgw_zonegroup: ZONE_GROUP_NAME_1
          rgw_realm: REALM_NAME_1
          rgw_zone_user: ZONE_USER_NAME_1
          rgw_zone_user_display_name: "ZONE_DISPLAY_NAME_1"
          system_access_key: ACCESS_KEY_1
          system_secret_key: SECRET_KEY_1
          radosgw_address: "{{ _radosgw_address }}"
          radosgw_frontend_port: RGW_PRIMARY_PORT_NUMBER_1

    示例

    rgw_instances:
      - instance_name: 'rgw0'
          rgw_multisite: true
          rgw_zonemaster: true
          rgw_zonesecondary: false
          rgw_zonegroupmaster: true
          rgw_zone: paris
          rgw_zonegroup: idf
          rgw_realm: france
          rgw_zone_user: jacques.chirac
          rgw_zone_user_display_name: "Jacques Chirac"
          system_access_key: P9Eb6S8XNyo4dtZZUUMy
          system_secret_key: qqHCUtfdNnpHq3PZRHW5un9l0bEBM812Uhow0XfB
          radosgw_address: "{{ _radosgw_address }}"
          radosgw_frontend_port: 8080

  6. 可选: 要创建多个实例,编辑该文件并将配置详情添加到对应对象网关节点上的所有实例。配置以下设置,并更新 rgw_instances 下的项目。将 multi-site-keys-realm-1.txt 文件中保存的随机字符串用于 ACCESS_KEY_1SECRET_KEY_1

    语法

    rgw_instances:
      - instance_name: 'INSTANCE_NAME_1'
          rgw_multisite: true
          rgw_zonemaster: true
          rgw_zonesecondary: false
          rgw_zonegroupmaster: true
          rgw_zone: ZONE_NAME_1
          rgw_zonegroup: ZONE_GROUP_NAME_1
          rgw_realm: REALM_NAME_1
          rgw_zone_user: ZONE_USER_NAME_1
          rgw_zone_user_display_name: "ZONE_DISPLAY_NAME_1"
          system_access_key: ACCESS_KEY_1
          system_secret_key: SECRET_KEY_1
          radosgw_address: "{{ _radosgw_address }}"
          radosgw_frontend_port: PORT_NUMBER_1
      - instance_name: 'INSTANCE_NAME_2'
          rgw_multisite: true
          rgw_zonemaster: true
          rgw_zonesecondary: false
          rgw_zonegroupmaster: true
          rgw_zone: ZONE_NAME_1
          rgw_zonegroup: ZONE_GROUP_NAME_1
          rgw_realm: REALM_NAME_1
          rgw_zone_user: ZONE_USER_NAME_1
          rgw_zone_user_display_name: "ZONE_DISPLAY_NAME_1"
          system_access_key: ACCESS_KEY_1
          system_secret_key: SECRET_KEY_1
          radosgw_address: "{{ _radosgw_address }}"
          radosgw_frontend_port: PORT_NUMBER_2

    示例

    rgw_instances:
      - instance_name: 'rgw0'
          rgw_multisite: true
          rgw_zonemaster: true
          rgw_zonesecondary: false
          rgw_zonegroupmaster: true
          rgw_zone: paris
          rgw_zonegroup: idf
          rgw_realm: france
          rgw_zone_user: jacques.chirac
          rgw_zone_user_display_name: "Jacques Chirac"
          system_access_key: P9Eb6S8XNyo4dtZZUUMy
          system_secret_key: qqHCUtfdNnpHq3PZRHW5un9l0bEBM812Uhow0XfB
          radosgw_address: "{{ _radosgw_address }}"
          radosgw_frontend_port: 8080
     - instance_name: 'rgw1'
          rgw_multisite: true
          rgw_zonemaster: true
          rgw_zonesecondary: false
          rgw_zonegroupmaster: true
          rgw_zone: paris
          rgw_zonegroup: idf
          rgw_realm: france
          rgw_zone_user: jacques.chirac
          rgw_zone_user_display_name: "Jacques Chirac"
          system_access_key: P9Eb6S8XNyo4dtZZUUMy
          system_secret_key: qqHCUtfdNnpHq3PZRHW5un9l0bEBM812Uhow0XfB
          radosgw_address: "{{ _radosgw_address }}"
          radosgw_frontend_port: 8081

辅助存储集群

  1. 进入 Ceph-ansible 配置目录:

    [root@ansible ~]# cd /usr/share/ceph-ansible
  2. 打开并编辑 group_vars/all.yml 文件。取消注释 rgw_multisite 行并将其设置为 true。取消注释 rgw_multisite_proto 参数。

    rgw_multisite: true
    rgw_multisite_proto: "http"
  3. /usr/share/ceph-ansible 中创建 host_vars 目录:

    [root@ansible ceph-ansible]# mkdir host_vars
  4. host_vars 中为次要存储集群上的每个对象网关节点创建一个文件。文件名应当与 Ansible 清单文件中使用的名称相同。例如,如果对象网关节点命名为 rgw-secondary,则创建 host_vars/rgw-secondary 文件。

    语法

    touch host_vars/NODE_NAME

    示例

    [root@ansible ceph-ansible]# touch host_vars/rgw-secondary

    注意

    如果集群中有多个 Ceph 对象网关节点用于多站点配置,则为每个节点创建文件。

  5. 配置以下设置:使用与 ZONE_USER_NAMEZONE_DISPLAY_NAMEACCESS_KEYSECRET_KEYREALM_NAMEZONE_GROUP_NAME 相同的值。为主存储集群中的 ZONE_NAME 使用不同的值。将 MASTER_RGW_NODE_NAME 设置为 master 区域的 Ceph 对象网关节点。请注意,与主存储集群相比,rgw_zonemasterrgw_zonesecondaryrgw_zonegroupmaster 的设置将被撤销。

    语法

    rgw_instances:
      - instance_name: 'INSTANCE_NAME_1'
          rgw_multisite: true
          rgw_zonemaster: false
          rgw_zonesecondary: true
          rgw_zonegroupmaster: false
          rgw_zone: ZONE_NAME_2
          rgw_zonegroup: ZONE_GROUP_NAME_1
          rgw_realm: REALM_NAME_1
          rgw_zone_user: ZONE_USER_NAME_1
          rgw_zone_user_display_name: "ZONE_DISPLAY_NAME_1"
          system_access_key: ACCESS_KEY_1
          system_secret_key: SECRET_KEY_1
          radosgw_address: "{{ _radosgw_address }}"
          radosgw_frontend_port: PORT_NUMBER_1
          endpoint: RGW_PRIMARY_HOSTNAME_ENDPOINT:RGW_PRIMARY_PORT_NUMBER_1

    示例

    rgw_instances:
      - instance_name: 'rgw0'
          rgw_multisite: true
          rgw_zonemaster: false
          rgw_zonesecondary: true
          rgw_zonegroupmaster: false
          rgw_zone: lyon
          rgw_zonegroup: idf
          rgw_realm: france
          rgw_zone_user: jacques.chirac
          rgw_zone_user_display_name: "Jacques Chirac"
          system_access_key: P9Eb6S8XNyo4dtZZUUMy
          system_secret_key: qqHCUtfdNnpHq3PZRHW5un9l0bEBM812Uhow0XfB
          radosgw_address: "{{ _radosgw_address }}"
          radosgw_frontend_port: 8080
          endpoint: http://rgw-primary:8081

  6. 可选: 要创建多个实例,编辑该文件并将配置详情添加到对应对象网关节点上的所有实例。配置以下设置,并更新 rgw_instances 下的项目。将 multi-site-keys-realm-1.txt 文件中保存的随机字符串用于 ACCESS_KEY_1SECRET_KEY_1。将 RGW_PRIMARY_HOSTNAME 设置为主存储集群中的对象网关节点。

    语法

    rgw_instances:
      - instance_name: 'INSTANCE_NAME_1'
          rgw_multisite: true
          rgw_zonemaster: false
          rgw_zonesecondary: true
          rgw_zonegroupmaster: false
          rgw_zone: ZONE_NAME_2
          rgw_zonegroup: ZONE_GROUP_NAME_1
          rgw_realm: REALM_NAME_1
          rgw_zone_user: ZONE_USER_NAME_1
          rgw_zone_user_display_name: "ZONE_DISPLAY_NAME_1"
          system_access_key: ACCESS_KEY_1
          system_secret_key: SECRET_KEY_1
          radosgw_address: "{{ _radosgw_address }}"
          radosgw_frontend_port: PORT_NUMBER_1
          endpoint: RGW_PRIMARY_HOSTNAME:RGW_PRIMARY_PORT_NUMBER_1
      - instance_name: '_INSTANCE_NAME_2_'
          rgw_multisite: true
          rgw_zonemaster: false
          rgw_zonesecondary: true
          rgw_zonegroupmaster: false
          rgw_zone: ZONE_NAME_2
          rgw_zonegroup: ZONE_GROUP_NAME_1
          rgw_realm: REALM_NAME_1
          rgw_zone_user: ZONE_USER_NAME_1
          rgw_zone_user_display_name: "ZONE_DISPLAY_NAME_1"
          system_access_key: ACCESS_KEY_1
          system_secret_key: SECRET_KEY_1
          radosgw_address: "{{ _radosgw_address }}"
          radosgw_frontend_port:  PORT_NUMBER_1
          endpoint: RGW_PRIMARY_HOSTNAME:RGW_PRIMARY_PORT_NUMBER_2

    示例

    rgw_instances:
      - instance_name: 'rgw0'
          rgw_multisite: true
          rgw_zonemaster: false
          rgw_zonesecondary: true
          rgw_zonegroupmaster: false
          rgw_zone: lyon
          rgw_zonegroup: idf
          rgw_realm: france
          rgw_zone_user: jacques.chirac
          rgw_zone_user_display_name: "Jacques Chirac"
          system_access_key: P9Eb6S8XNyo4dtZZUUMy
          system_secret_key: qqHCUtfdNnpHq3PZRHW5un9l0bEBM812Uhow0XfB
          radosgw_address: "{{ _radosgw_address }}"
          radosgw_frontend_port: 8080
          endpoint: http://rgw-primary:8080
      - instance_name: 'rgw1'
          rgw_multisite: true
          rgw_zonemaster: false
          rgw_zonesecondary: true
          rgw_zonegroupmaster: false
          rgw_zone: lyon
          rgw_zonegroup: idf
          rgw_realm: france
          rgw_zone_user: jacques.chirac
          rgw_zone_user_display_name: "Jacques Chirac"
          system_access_key: P9Eb6S8XNyo4dtZZUUMy
          system_secret_key: qqHCUtfdNnpHq3PZRHW5un9l0bEBM812Uhow0XfB
          radosgw_address: "{{ _radosgw_address }}"
          radosgw_frontend_port: 8081
          endpoint: http://rgw-primary:8081

在两个站点中,执行以下步骤:

  1. 在主存储集群上运行 Ansible playbook:

    • 裸机部署:

      [user@ansible ceph-ansible]$ ansible-playbook site.yml -i hosts
    • 容器部署:

      [user@ansible ceph-ansible]$ ansible-playbook site-container.yml -i hosts
  2. 验证辅助存储集群可以访问主存储集群中的 API。

    在辅助存储集群中的 Object Gateway 节点中,使用 curl 或者另一个 HTTP 客户端连接到主集群中的 API。使用用于在 all.yml 中配置 rgw_pull_protorgw_pullhostrgw_pull_port 的信息编写 URL。在上例中,URL 是 http://cluster0-rgw-000:8080。如果无法访问 API,请验证 URL 是否正确,并根据需要更新 all.yml。URL 正常工作并解决所有网络问题后,请继续下一步,以在次要存储集群上运行 Ansible playbook。

  3. 在辅助存储集群上运行 Ansible playbook:

    注意

    如果部署了集群,且您只对 Ceph 对象网关进行了更改,则使用 --limit rgws 选项。

    • 裸机部署:

      [user@ansible ceph-ansible]$ ansible-playbook site.yml -i hosts
    • 容器部署:

      [user@ansible ceph-ansible]$ ansible-playbook site-container.yml -i hosts

      在主存储和次要存储集群上运行 Ansible playbook 后,Ceph 对象网关以主动-主动状态运行。

  4. 验证两个站点上的多站点 Ceph 对象网关配置:

    语法

    radosgw-admin sync status

5.7.3. 使用多个域和多个实例配置多站点 Ceph 对象网关

Ceph-ansible 配置 Ceph 对象网关,以在具有多个 Ceph 对象网关实例的多个存储集群之间镜像数据。

警告

在单一站点配置中已使用网关后,Ceph-ansible 无法将网关重新配置为多站点设置。您可以手动部署此配置。联系红帽支持以获取帮助。

先决条件

  • 两个正在运行的 Red Hat Ceph Storage 集群。
  • 每个存储集群中至少有两个对象网关节点。
  • 在 Ceph 对象网关节点上,执行 Red Hat Ceph Storage安装指南中的安装 Red Hat Ceph Storage 要求一节中列出的任务。
  • 对于每个对象网关节点,执行 Red Hat Ceph Storage 安装指南中的安装 Ceph 对象网关一节中的第 1 到 6 步。

流程

  1. 在任何节点上,为 realm 1 和 2 生成系统访问密钥和密钥,并将它们分别保存在名为 multi-site-keys-realm-1.txtmulti-site-keys-realm-2.txt 的文件中:

    # echo system_access_key: $(cat /dev/urandom | tr -dc 'a-zA-Z0-9' | fold -w 20 | head -n 1) > multi-site-keys-realm-1.txt
    [root@ansible ~]# echo system_secret_key: $(cat /dev/urandom | tr -dc 'a-zA-Z0-9' | fold -w 40 | head -n 1) >> multi-site-keys-realm-1.txt
    
    # echo system_access_key: $(cat /dev/urandom | tr -dc 'a-zA-Z0-9' | fold -w 20 | head -n 1) > multi-site-keys-realm-2.txt
    [root@ansible ~]# echo system_secret_key: $(cat /dev/urandom | tr -dc 'a-zA-Z0-9' | fold -w 40 | head -n 1) >> multi-site-keys-realm-2.txt

site-A 存储集群

  1. 进入 Ansible 配置目录:

    [root@ansible ~]# cd /usr/share/ceph-ansible
  2. 打开并编辑 group_vars/all.yml 文件。取消注释 rgw_multisite 行并将其设置为 true。取消注释 rgw_multisite_proto 参数。

    rgw_multisite: true
    rgw_multisite_proto: "http"
  3. /usr/share/ceph-ansible 中创建 host_vars 目录:

    [root@ansible ceph-ansible]# mkdir host_vars
  4. host_vars 中为 site-A 存储集群上的每个对象网关节点创建一个文件。文件名应当与 Ansible 清单文件中使用的名称相同。例如,如果对象网关节点命名为 rgw-site-a,则创建 host_vars/rgw-site-a 文件。

    语法

    touch host_vars/NODE_NAME

    示例

    [root@ansible ceph-ansible]# touch host_vars/rgw-site-a

    注意

    如果集群中有多个 Ceph 对象网关节点用于多站点配置,则为每个节点创建单独的文件。

  5. 要为第一个域创建多个实例,请编辑文件,并将配置详情添加到对应对象网关节点上的所有实例。配置以下设置,以及更新第一个域的 rgw_instances 下的项目。将 multi-site-keys-realm-1.txt 文件中保存的随机字符串用于 ACCESS_KEY_1SECRET_KEY_1

    语法

    rgw_instances:
      - instance_name: '_INSTANCE_NAME_1_'
          rgw_multisite: true
          rgw_zonemaster: true
          rgw_zonesecondary: false
          rgw_zonegroupmaster: true
          rgw_zone: ZONE_NAME_1
          rgw_zonegroup: ZONE_GROUP_NAME_1
          rgw_realm: REALM_NAME_1
          rgw_zone_user: ZONE_USER_NAME_1
          rgw_zone_user_display_name: "ZONE_DISPLAY_NAME_1"
          system_access_key: ACCESS_KEY_1
          system_secret_key: SECRET_KEY_1
          radosgw_address: "{{ _radosgw_address }}"
          radosgw_frontend_port: PORT_NUMBER_1
        - instance_name: '_INSTANCE_NAME_2_'
          rgw_multisite: true
          rgw_zonemaster: true
          rgw_zonesecondary: false
          rgw_zonegroupmaster: true
          rgw_zone: ZONE_NAME_1
          rgw_zonegroup: ZONE_GROUP_NAME_1
          rgw_realm: REALM_NAME_1
          rgw_zone_user: ZONE_USER_NAME_1
          rgw_zone_user_display_name: "ZONE_DISPLAY_NAME_1"
          system_access_key: ACCESS_KEY_1
          system_secret_key: SECRET_KEY_1
          radosgw_address: "{{ _radosgw_address }}"
          radosgw_frontend_port: PORT_NUMBER_1

    示例

    rgw_instances:
      - instance_name: 'rgw0'
          rgw_multisite: true
          rgw_zonemaster: true
          rgw_zonesecondary: false
          rgw_zonegroupmaster: true
          rgw_zone: paris
          rgw_zonegroup: idf
          rgw_realm: france
          rgw_zone_user: jacques.chirac
          rgw_zone_user_display_name: "Jacques Chirac"
          system_access_key: P9Eb6S8XNyo4dtZZUUMy
          system_secret_key: qqHCUtfdNnpHq3PZRHW5un9l0bEBM812Uhow0XfB
          radosgw_address: "{{ _radosgw_address }}"
          radosgw_frontend_port: 8080
     - instance_name: 'rgw1'
          rgw_multisite: true
          rgw_zonemaster: true
          rgw_zonesecondary: false
          rgw_zonegroupmaster: true
          rgw_zone: paris
          rgw_zonegroup: idf
          rgw_realm: france
          rgw_zone_user: jacques.chirac
          rgw_zone_user_display_name: "Jacques Chirac"
          system_access_key: P9Eb6S8XNyo4dtZZUUMy
          system_secret_key: qqHCUtfdNnpHq3PZRHW5un9l0bEBM812Uhow0XfB
          radosgw_address: "{{ _radosgw_address }}"
          radosgw_frontend_port: 8080

    注意

    在将 site-B 上的所有域配置为 site-A 为次要域后,跳过下一步并运行它,然后运行 Ansible playbook。

  6. 对于其他域的多个实例,请配置以下设置,以及更新 rgw_instances 下的项目。使用 multi-site-keys-realm-2.txt 文件中保存的随机字符串用于 ACCESS_KEY_2SECRET_KEY_2

    语法

    rgw_instances:
      - instance_name: 'INSTANCE_NAME_1'
          rgw_multisite: true
          rgw_zonemaster: false
          rgw_zonesecondary: true
          rgw_zonegroupmaster: false
          rgw_zone: ZONE_NAME_2
          rgw_zonegroup: ZONE_GROUP_NAME_2
          rgw_realm: REALM_NAME_2
          rgw_zone_user: ZONE_USER_NAME_2
          rgw_zone_user_display_name: "ZONE_DISPLAY_NAME_2"
          system_access_key: ACCESS_KEY_2
          system_secret_key: SECRET_KEY_2
          radosgw_address: "{{ _radosgw_address }}"
          radosgw_frontend_port: PORT_NUMBER_1
          endpoint: RGW_SITE_B_PRIMARY_HOSTNAME_ENDPOINT:RGW_SITE_B_PORT_NUMBER_1
      - instance_name: 'INSTANCE_NAME_2'
          rgw_multisite: true
          rgw_zonemaster: false
          rgw_zonesecondary: true
          rgw_zonegroupmaster: false
          rgw_zone: ZONE_NAME_2
          rgw_zonegroup: ZONE_GROUP_NAME_2
          rgw_realm: REALM_NAME_2
          rgw_zone_user: ZONE_USER_NAME_2
          rgw_zone_user_display_name: "ZONE_DISPLAY_NAME_2"
          system_access_key: ACCESS_KEY_2
          system_secret_key: SECRET_KEY_2
          radosgw_address: "{{ _radosgw_address }}"
          radosgw_frontend_port: PORT_NUMBER_1
          endpoint: RGW_SITE_B_PRIMARY_HOSTNAME_ENDPOINT:RGW_SITE_B_PORT_NUMBER_1

    示例

    rgw_instances:
      - instance_name: 'rgw0'
          rgw_multisite: true
          rgw_zonemaster: false
          rgw_zonesecondary: true
          rgw_zonegroupmaster: false
          rgw_zone: fairbanks
          rgw_zonegroup: alaska
          rgw_realm: usa
          rgw_zone_user: edward.lewis
          rgw_zone_user_display_name: "Edward Lewis"
          system_access_key: yu17wkvAx3B8Wyn08XoF
          system_secret_key: 5YZfaSUPqxSNIkZQQA3lBZ495hnIV6k2HAz710BY
          radosgw_address: "{{ _radosgw_address }}"
          radosgw_frontend_port: 8080
          endpoint: http://rgw-site-b:8081
      - instance_name: 'rgw1'
          rgw_multisite: true
          rgw_zonemaster: false
          rgw_zonesecondary: true
          rgw_zonegroupmaster: false
          rgw_zone: fairbanks
          rgw_zonegroup: alaska
          rgw_realm: usa
          rgw_zone_user: edward.lewis
          rgw_zone_user_display_name: "Edward Lewis"
          system_access_key: yu17wkvAx3B8Wyn08XoF
          system_secret_key: 5YZfaSUPqxSNIkZQQA3lBZ495hnIV6k2HAz710BY
          radosgw_address: "{{ _radosgw_address }}"
          radosgw_frontend_port: 8081
          endpoint: http://rgw-site-b:8081

  7. 在 site-A 存储集群上运行 Ansible playbook:

    • 裸机部署:

      [user@ansible ceph-ansible]$ ansible-playbook site.yml -i hosts
    • 容器部署:

      [user@ansible ceph-ansible]$ ansible-playbook site-container.yml -i hosts

Site-B Storage Cluster

  1. 进入 Ceph-ansible 配置目录:

    [root@ansible ~]# cd /usr/share/ceph-ansible
  2. 打开并编辑 group_vars/all.yml 文件。取消注释 rgw_multisite 行并将其设置为 true。取消注释 rgw_multisite_proto 参数。

    rgw_multisite: true
    rgw_multisite_proto: "http"
  3. /usr/share/ceph-ansible 中创建 host_vars 目录:

    [root@ansible ceph-ansible]# mkdir host_vars
  4. host_vars 中为 site-B 存储集群上的每个对象网关节点创建一个文件。文件名应当与 Ansible 清单文件中使用的名称相同。例如,如果对象网关节点命名为 rgw-site-b,则创建 host_vars/rgw-site-b 文件。

    语法

    touch host_vars/NODE_NAME

    示例

    [root@ansible ceph-ansible]# touch host_vars/rgw-site-b

    注意

    如果集群中有多个 Ceph 对象网关节点用于多站点配置,则为每个节点创建文件。

  5. 要为第一个域创建多个实例,请编辑文件,并将配置详情添加到对应对象网关节点上的所有实例。配置以下设置,以及更新第一个域的 rgw_instances 下的项目。将 multi-site-keys-realm-1.txt 文件中保存的随机字符串用于 ACCESS_KEY_1SECRET_KEY_1。将 RGW_SITE_A_PRIMARY_HOSTNAME_ENDPOINT 设置为 site-A 存储集群中的对象网关节点。

    语法

    rgw_instances:
      - instance_name: 'INSTANCE_NAME_1'
          rgw_multisite: true
          rgw_zonemaster: false
          rgw_zonesecondary: true
          rgw_zonegroupmaster: false
          rgw_zone: ZONE_NAME_1
          rgw_zonegroup: ZONE_GROUP_NAME_1
          rgw_realm: REALM_NAME_1
          rgw_zone_user: ZONE_USER_NAME_1
          rgw_zone_user_display_name: "ZONE_DISPLAY_NAME_1"
          system_access_key: ACCESS_KEY_1
          system_secret_key: SECRET_KEY_1
          radosgw_address: "{{ _radosgw_address }}"
          radosgw_frontend_port: PORT_NUMBER_1
          endpoint: RGW_SITE_A_HOSTNAME_ENDPOINT:RGW_SITE_A_PORT_NUMBER_1
      - instance_name: '_INSTANCE_NAME_2_'
          rgw_multisite: true
          rgw_zonemaster: false
          rgw_zonesecondary: true
          rgw_zonegroupmaster: false
          rgw_zone: ZONE_NAME_1
          rgw_zonegroup: ZONE_GROUP_NAME_1
          rgw_realm: REALM_NAME_1
          rgw_zone_user: ZONE_USER_NAME_1
          rgw_zone_user_display_name: "ZONE_DISPLAY_NAME_1"
          system_access_key: ACCESS_KEY_1
          system_secret_key: SECRET_KEY_1
          radosgw_address: "{{ _radosgw_address }}"
          radosgw_frontend_port:  PORT_NUMBER_1
          endpoint: RGW_SITE_A_PRIMARY_HOSTNAME_ENDPOINT:RGW_SITE_A_PORT_NUMBER_1

    示例

    rgw_instances:
      - instance_name: 'rgw0'
          rgw_multisite: true
          rgw_zonemaster: false
          rgw_zonesecondary: true
          rgw_zonegroupmaster: false
          rgw_zone: paris
          rgw_zonegroup: idf
          rgw_realm: france
          rgw_zone_user: jacques.chirac
          rgw_zone_user_display_name: "Jacques Chirac"
          system_access_key: P9Eb6S8XNyo4dtZZUUMy
          system_secret_key: qqHCUtfdNnpHq3PZRHW5un9l0bEBM812Uhow0XfB
          radosgw_address: "{{ _radosgw_address }}"
          radosgw_frontend_port: 8080
          endpoint: http://rgw-site-a:8080
      - instance_name: 'rgw1'
          rgw_multisite: true
          rgw_zonemaster: false
          rgw_zonesecondary: true
          rgw_zonegroupmaster: false
          rgw_zone: paris
          rgw_zonegroup: idf
          rgw_realm: france
          rgw_zone_user: jacques.chirac
          rgw_zone_user_display_name: "Jacques Chirac"
          system_access_key: P9Eb6S8XNyo4dtZZUUMy
          system_secret_key: qqHCUtfdNnpHq3PZRHW5un9l0bEBM812Uhow0XfB
          radosgw_address: "{{ _radosgw_address }}"
          radosgw_frontend_port: 8081
          endpoint: http://rgw-site-a:8081

  6. 对于其他域的多个实例,请配置以下设置,以及更新 rgw_instances 下的项目。使用 multi-site-keys-realm-2.txt 文件中保存的随机字符串用于 ACCESS_KEY_2SECRET_KEY_2。将 RGW_SITE_A_PRIMARY_HOSTNAME_ENDPOINT 设置为 site-A 存储集群中的对象网关节点。

    语法

    rgw_instances:
      - instance_name: 'INSTANCE_NAME_1'
          rgw_multisite: true
          rgw_zonemaster: true
          rgw_zonesecondary: false
          rgw_zonegroupmaster: true
          rgw_zone: ZONE_NAME_2
          rgw_zonegroup: ZONE_GROUP_NAME_2
          rgw_realm: REALM_NAME_2
          rgw_zone_user: ZONE_USER_NAME_2
          rgw_zone_user_display_name: "ZONE_DISPLAY_NAME_2"
          system_access_key: ACCESS_KEY_2
          system_secret_key: SECRET_KEY_2
          radosgw_address: "{{ _radosgw_address }}"
          radosgw_frontend_port: PORT_NUMBER_1
      - instance_name: '_INSTANCE_NAME_2_'
          rgw_multisite: true
          rgw_zonemaster: true
          rgw_zonesecondary: false
          rgw_zonegroupmaster: true
          rgw_zone: ZONE_NAME_2
          rgw_zonegroup: ZONE_GROUP_NAME_2
          rgw_realm: REALM_NAME_2
          rgw_zone_user: ZONE_USER_NAME_2
          rgw_zone_user_display_name: "ZONE_DISPLAY_NAME_2"
          system_access_key: ACCESS_KEY_2
          system_secret_key: SECRET_KEY_2
          radosgw_address: "{{ _radosgw_address }}"
          radosgw_frontend_port: PORT_NUMBER_1

    示例

    rgw_instances:
      - instance_name: 'rgw0'
          rgw_multisite: true
          rgw_zonemaster: true
          rgw_zonesecondary: false
          rgw_zonegroupmaster: true
          rgw_zone: fairbanks
          rgw_zonegroup: alaska
          rgw_realm: usa
          rgw_zone_user: edward.lewis
          rgw_zone_user_display_name: "Edward Lewis"
          system_access_key: yu17wkvAx3B8Wyn08XoF
          system_secret_key: 5YZfaSUPqxSNIkZQQA3lBZ495hnIV6k2HAz710BY
          radosgw_address: "{{ _radosgw_address }}"
          radosgw_frontend_port: 8080
      - instance_name: 'rgw1'
          rgw_multisite: true
          rgw_zonemaster: true
          rgw_zonesecondary: false
          rgw_zonegroupmaster: true
          rgw_zone: fairbanks
          rgw_zonegroup: alaska
          rgw_realm: usa
          rgw_zone_user: edward.lewis
          rgw_zone_user_display_name: "Edward Lewis"
          system_access_key: yu17wkvAx3B8Wyn08XoF
          system_secret_key: 5YZfaSUPqxSNIkZQQA3lBZ495hnIV6k2HAz710BY
          radosgw_address: "{{ _radosgw_address }}"
          radosgw_frontend_port: 8081

  7. 在 site-B 存储集群上运行 Ansible playbook:

    • 裸机部署:

      [user@ansible ceph-ansible]$ ansible-playbook site.yml -i hosts
    • 容器部署:

      [user@ansible ceph-ansible]$ ansible-playbook site-container.yml -i hosts

      site-A 存储集群上针对其他 site-A 的域再次运行 Ansible playbook。

      site-Asite-B 存储集群上运行 Ansible playbook 后,Ceph 对象网关以主动-主动状态运行。

验证

  1. 验证多站点 Ceph 对象网关配置:

    1. 从每个站点的 Ceph monitor 和对象网关节点(site-A 和 site-B),使用 curl 或其他 HTTP 客户端来验证是否可从其他站点访问 API。
    2. 对两个站点运行 radosgw-admin sync status 命令。

      语法

      radosgw-admin sync status
      radosgw-admin sync status --rgw -realm REALM_NAME 1

      1
      对存储集群的对应节点上的多个域使用这个选项。

      示例

      [user@ansible ceph-ansible]$ radosgw-admin sync status
      
      [user@ansible ceph-ansible]$ radosgw-admin sync status --rgw -realm usa