Ceph 对象存储多站点复制系列。第二部分

Daniel Parkes, Anthony D'Atri (IBM)

Ceph 对象存储多站点复制系列

在上一集中,我们介绍了 Ceph 对象存储多站点功能。我们描述了将在以下章节中使用的实验室设置,以部署和配置 Ceph 对象多站点异步复制。

本系列第二部分将列举建立我们 Ceph 集群之间的初始多站点复制步骤,如图所示。

Ceph 对象存储多站点初始配置

作为 Quincy 版本的组成部分,一个新的 Manager 模块 rgw 被添加到 Ceph 编排器 cephadm 中。rgw 管理器模块使多站点复制的配置变得简单明了。本节将向您展示如何使用新的 rgw 管理器模块通过 CLI 配置 Ceph 对象多站点复制,在两个区域之间(每个区域都是一个独立的 Ceph 集群)。

我们将首先为 cluster1 创建一个 RGW 模块规范文件。

我们将使用主机上的标签来帮助定义哪些节点可以托管每个服务。在这种情况下,对于复制 RGW 服务,我们设置了 rgwsync 标签。配置了此标签的任何主机都将使用文件中定义的规范启动 RGW 服务。包含的其余选项将负责配置我们的 realm、zonegroup 和 zone 的名称,并指示 RGW 服务监听 8000/tcp 端口。

[root@ceph-node-00 ~]# cat << EOF >> /root/rgw.spec
placement:
  label: rgwsync
  count_per_host: 1
rgw_realm: multisite
rgw_zone: zone1
rgw_zonegroup: multizg
spec:
  rgw_frontend_port: 8000
EOF

在我们的第一个集群中,我们希望在节点 ceph-node-00ceph-node-01 上运行同步 RGW 服务,因此我们需要标记相应的节点

[root@ceph-node-00 ~]# ceph orch host label add ceph-node-00.cephlab.com rgwsync
Added label rgwsync to host ceph-node-00.cephlab.com
[root@ceph-node-00 ~]# ceph orch host label add ceph-node-01.cephlab.com rgwsync
Added label rgwsync to host ceph-node-01.cephlab.com

一旦节点被标记,我们便启用 RGW 管理器模块并启动 RGW 多站点配置。在启动多站点配置时,rgw 管理器模块将负责以下步骤

  • 创建 realm、zonegroup 和 zone 并应用周期
  • 创建具有 zone 名称的特定 RGW RADOS 池
  • 创建一个 RGW 多站点复制同步用户
  • 为每个 RGW 服务配置 realm、zonegroup 和 zone
  • 使用 cephadm 编排器创建 RGW 服务
[root@ceph-node-00 ~]# ceph mgr module enable rgw
[root@ceph-node-00 ~]# ceph rgw realm bootstrap -i rgw.spec
Realm(s) created correctly. Please use 'ceph rgw realm tokens' to get the token.

注意:从 Tentacle 版本开始,创建的第一个 realm 不会自动成为默认 realm,因此使用这些版本需要运行

radosgw-admin realm default --rgw-realm=$realm

让我们检查 realm

[root@ceph-node-00 ~]# radosgw-admin realm list
{
    "default_info": "d85b6eef-2285-4072-8407-35e2ea7a17a2",
    "realms": [
        "multisite"
    ]
}

多站点同步用户

[root@ceph01 ~]# radosgw-admin user list | grep sysuser
    "Sysuser-multisite"

多站点同步用户

[root@ceph01 ~]# radosgw-admin user list | grep sysuser
    "Sysuser-multisite"

Zone1 RGW RADOS 池

[root@ceph01 ~]# ceph osd lspools | grep rgw
24 .rgw.root
25 zone1.rgw.log
26 zone1.rgw.control
27 zone1.rgw.meta

一旦我们创建了第一个 bucket,bucket 索引池将自动创建。同样,一旦我们将第一个对象/数据上传到 zone1 中的 bucket,数据池将为我们创建。默认情况下,使用集群预定义的 CRUSH 规则 replicated_rule 创建复制因子为 3 的池。如果我们要使用 Erasure Coding (EC) 或自定义数据池,例如故障域,我们需要在开始将数据上传到第一个 bucket 之前,手动预先创建具有自定义配置的池。

注意:请务必仔细检查您的 RGW 池是否具有足够的放置组 (PG) 数量,以提供所需的性能。我们可以选择使用 bulk 标志设置为每个池的 PG 自动缩放器管理器模块,或者我们可以使用 PG 计算器 提前静态计算我们的池将需要的 PG 数量。我们建议的目标是每个 OSD 200 个 PG 副本,即“PG 比率”。

注意:只有 RGW 数据池才能配置 Erasure Coding。其余的 RGW 池星座必须配置为使用复制方案,默认情况下使用 size=3

RGW 服务正在运行,通过 8000 端口提供 S3 端点

[root@ceph-node-00 ~]# curl http://ceph-node-00:8000
<?xml version="1.0" encoding="UTF-8"?><ListAllMyBucketsResult xmlns="http://s3.amazonaws.com/doc/2006-03-01/"><Owner><ID>anonymous</ID><DisplayName></DisplayName></Owner><Buckets></Buckets></ListAllMyBucketsResult>

RGW 管理器模块创建一个包含我们部署编码信息的 token。想要添加到我们的多站点配置中作为复制区域的其他 Ceph 集群可以将此 token 导入到 RGW 管理器模块,并使用单个命令配置和运行复制。

我们可以使用 ceph rgw realm tokens 命令检查 token 的内容,并使用 base64 命令对其进行解码。如您所见,它提供了二级区域连接到主 zonegroup 并提取 realm 和 zonegroup 配置所需的必要信息。

[root@ceph-node-00 ~]# TOKEN=$(ceph rgw realm tokens | jq .[0].token | sed 's/"//g')
[root@ceph-node-00 ~]# echo $TOKEN | base64 -d
{
    "realm_name": "multisite",
    "realm_id": "d85b6eef-2285-4072-8407-35e2ea7a17a2",
    "endpoint": "http://ceph-node-00.cephlab.com:8000",
    "access_key": "RUB7U4C6CCOMG3EM9QGF",
    "secret": "vg8XFPehb21Y8oUMB9RS0XXXXH2E1qIDIhZzpC"
}

您可以看到提示表明我们已切换到我们的第二个 Ceph 集群,复制了来自我们第一个集群的 token 并以类似于第一个集群的方式定义了其余参数。

[root@ceph-node-04 ~]# cat rgw2.spec
placement:
  label: rgwsync
  count_per_host: 1
rgw_zone: zone2
rgw_realm_token: ewogICAgInJlYWxtX25hbWUiOiAibXVsdGlzaXRlIiwKICAgICJyZWFsbV9pZCI6ICIxNmM3OGJkMS0xOTIwLTRlMjMtOGM3Yi1lYmYxNWQ5ODI0NTgiLAogICAgImVuZHBvaW50IjogImh0dHA6Ly9jZXBoLW5vZGUtMDEuY2VwaGxhYi5jb206ODAwMCIsCiAgICAiYWNjZXNzX2tleSI6ICIwOFlXQ0NTNzEzUU9LN0pQQzFRUSIsCiAgICAic2VjcmV0IjogImZUZGlmTXpDUldaSXgwajI0ZEw4VGppRUFtOHpRdE01ZGNScXEyTjYiCn0=
spec:
  rgw_frontend_port: 8000

我们标记将运行 Ceph RGW 同步服务的宿主机

[root@ceph-node-04 ~]# ceph orch host label add ceph-node-04.cephlab.com rgwsync
Added label rgwsync to host ceph-node-04.cephlab.com
[root@ceph-node-04 ~]# ceph orch host label add ceph-node-05.cephlab.com rgwsync
Added label rgwsync to host ceph-node-05.cephlab.com

启用模块,并使用我们刚刚创建的规范文件运行 ceph rgw zone create 命令

[root@ceph02 ~]# ceph mgr module enable rgw
[root@ceph02 ~]# ceph rgw zone create -i rgw2.spec --start-radosgw
Zones zone2 created successfully

rgw 管理器模块将负责使用来自多站点同步用户的访问和密钥提取 realm 和 zonegroup 周期。最后,它将创建 zone2 并执行最终的周期更新,以便所有区域都具有最新的配置更改,并添加 zone2 到 zonegroup multizg。在以下 radosgw-admin zonegroup get 命令的输出中,我们可以看到 zonegroup 端点。我们还可以看到 zone1 是我们 zonegroup 的主区域,以及 zone1zone2 的相应端点。

[root@ceph-node-00 ~]# radosgw-admin zonegroup get
{
    "id": "2761ad42-fd71-4170-87c6-74c20dd1e334",
    "name": "multizg",
    "api_name": "multizg",
    "is_master": true,
    "endpoints": [
        "http://ceph-node-04.cephlab.com:8000",
        "http://ceph-node-05.cephlab.com:8000"
    ],
    "hostnames": [],
    "hostnames_s3website": [],
    "master_zone": "66df8c0a-c67d-4bd7-9975-bc02a549f13e",
    "zones": [
        {
            "id": "66df8c0a-c67d-4bd7-9975-bc02a549f13e",
            "name": "zone1",
            "endpoints": [
                "http://ceph-node-00.cephlab.com:8000",
                "http://ceph-node-01.cephlab.com:8000"
            ],
            "log_meta": false,
            "log_data": true,
            "bucket_index_max_shards": 11,
            "read_only": false,
            "tier_type": "",
            "sync_from_all": true,
            "sync_from": [],
            "redirect_zone": "",
            "supported_features": [
                "compress-encrypted",
                "resharding"
            ]
        },
        {
            "id": "7b9273a9-eb59-413d-a465-3029664c73d7",
            "name": "zone2",
            "endpoints": [
                "http://ceph-node-04.cephlab.com:8000",
                "http://ceph-node-05.cephlab.com:8000"
            ],
            "log_meta": false,
            "log_data": true,
            "bucket_index_max_shards": 11,
            "read_only": false,
            "tier_type": "",
            "sync_from_all": true,
            "sync_from": [],
            "redirect_zone": "",
            "supported_features": [
                "compress-encrypted",
                "resharding"
            ]
        }
    ],
    "placement_targets": [
        {
            "name": "default-placement",
            "tags": [],
            "storage_classes": [
                "STANDARD"
            ]
        }
    ],
    "default_placement": "default-placement",
    "realm_id": "beeea955-8341-41cc-a046-46de2d5ddeb9",
    "sync_policy": {
        "groups": []
    },
    "enabled_features": [
        "resharding"
    ]
}

为了验证复制是否有效,让我们创建一个用户和一个 bucket

[root@ceph-node-00 ~]# radosgw-admin user create --uid='user1' --display-name='First User' --access-key='S3user1' --secret-key='S3user1key'

[root@ceph-node-00 ~]# aws configure
AWS Access Key ID [None]: S3user1
AWS Secret Access Key [None]: S3user1key
Default region name [None]: multizg
Default output format [None]: json
[root@ceph-node-00 ~]# aws --endpoint http://s3.cephlab.com:80 s3 ls
[root@ceph-node-00 ~]# aws --endpoint http://s3.cephlab.com:80 s3 mb s3://firstbucket
make_bucket: firstbucket
[root@ceph-node-00 ~]# aws --endpoint http://s3.cephlab.com:80 s3 cp /etc/hosts s3://firstbucket
upload: ../etc/hosts to s3://firstbucket/hosts

如果我们在第二个 Ceph 集群中检查,zone2,我们可以看到所有元数据都已复制,并且我们在 zone1 中创建的所有用户和 bucket 现在都存在于 zone2 中。

注意:在此示例中,我们将使用 radosgw-admin 命令进行检查,但我们也可以使用指向第二个区域内 RGW 的 IP/主机名的 S3 API 命令。

[root@ceph-node-04 ~]# radosgw-admin user list
[
    "dashboard",
    "user1",
    "sysuser-multisite"
]
[root@ceph-node-04 ~]# radosgw-admin bucket stats --bucket firstbucket | jq .bucket
"firstbucket"

要检查复制状态,我们可以使用 radosgw-admin sync status 命令。例如

[root@ceph-node-00 ~]# radosgw-admin sync status
          realm beeea955-8341-41cc-a046-46de2d5ddeb9 (multisite)
      zonegroup 2761ad42-fd71-4170-87c6-74c20dd1e334 (multizg)
           zone 66df8c0a-c67d-4bd7-9975-bc02a549f13e (zone1)
   current time 2024-01-05T22:51:17Z
zonegroup features enabled: resharding
                   disabled: compress-encrypted
  metadata sync no sync (zone is master)
      data sync source: 7b9273a9-eb59-413d-a465-3029664c73d7 (zone2)
                        syncing
                        full sync: 0/128 shards
                        incremental sync: 128/128 shards
                        data is caught up with source

总结与下一步

作为总结,在本系列第二部分中,我们已经完成了在两个站点/区域之间部署 Ceph 对象存储多站点复制的步骤,使用了 rgw 管理器模块。这只是我们的第一个构建块,因为我们的目标是拥有一个完整的部署,包括急需的负载均衡器。

在系列第三部分中,我们将继续微调我们的多站点复制设置,为每种类型的请求(面向客户端或多站点复制)专门分配特定的 RGW 服务。

脚注

作者谨此感谢 IBM 对社区的支持,通过促使我们有时间创建这些帖子。