注意

本文档适用于 Ceph 的开发版本。

云迁移

此功能使得 S3 对象能够作为对象生命周期的一部分,通过存储类迁移到远程云服务。迁移是单向的:数据不能从远程区域迁移回来。此功能的目的是实现数据向多个云提供商的迁移。支持与 AWS (S3) 兼容的云提供商。

我们使用分层类型为 cloud-s3cloud-s3-glacier 的特殊存储类来配置远程云 S3 对象存储服务,数据将迁移到该服务。这些类是根据区域组放置目标定义的,与常规存储类不同,它们不需要数据池。

必须配置远程云对象存储服务的用户凭证。请注意,源 ACL 不会被保留。可以将特定源用户的权限映射到特定目标用户。

云存储类分层类型

  • tier-type (字符串)

    用于迁移对象的远程云服务的类型。支持以下分层类型:

    • cloud-s3 : 常规 S3 兼容对象存储服务。

    • cloud-s3-glacier : S3 Glacier 或磁带存储服务。

云存储类分层配置

{
  "access_key": <access>,
  "secret": <secret>,
  "endpoint": <endpoint>,
  "region": <region>,
  "host_style": <path | virtual>,
  "acls": [ { "type": <id | email | uri>,
              "source_id": <source_id>,
              "dest_id": <dest_id> } ... ],
  "location_constraint": <location-constraint>,
  "target_path": <target_path>,
  "target_storage_class": <target-storage-class>,
  "multipart_sync_threshold": {object_size},
  "multipart_min_part_size": {part_size},
  "retain_head_object": <true | false>
}

云迁移特定可配置项

  • access_key (字符串)

    远程云 S3 访问密钥。

  • secret (字符串)

    远程云 S3 服务的密钥。

  • endpoint (字符串)

    远程云 S3 服务的 URL。

  • region (字符串)

    远程云 S3 服务区域名称。

  • host_style (path | virtual)

    访问远程云 S3 服务时使用的主机样式类型(默认:path)。

  • acls (数组)

    包含 acl_mappings 列表。

  • acl_mapping (容器)

    每个 acl_mapping 结构包含 typesource_iddest_id。这些定义了对每个对象执行的 ACL 突变。ACL 突变使得将源用户 ID 转换为目标用户 ID 成为可能。

  • type (id | email | uri)

    ACL 类型:id 定义用户 ID,email 通过电子邮件定义用户,uri 通过 uri 定义用户(组)。

  • source_id (字符串)

    源区域中的用户 ID。

  • dest_id (字符串)

    目标上的用户 ID。

  • target_path (字符串)

    定义如何构建目标路径的字符串。目标路径指定了一个前缀,源存储桶名称/对象名称将附加到该前缀。如果未指定,则创建的 target_pathrgwx-${zonegroup}-${storage-class}-cloud-bucket

    例如:target_path = rgwx-archive-${zonegroup}/

  • location_constraint (字符串)

    指定将在远程 S3 端点上创建目标存储桶的区域。对于 AWS,只有当区域不是 US East (us-east-1) 时才需要指定此位置。

  • target_storage_class (字符串)

    定义对象迁移到的目标存储类的字符串。如果未指定,对象将迁移到 STANDARD 存储类。

  • retain_head_object (true | false)

    如果为 true,则保留迁移到云服务的对象的元数据。如果为 false(默认值),则对象在迁移后被删除。此选项对于当前版本化对象将被忽略。有关更多详细信息,请参阅下面的版本化对象部分。

S3 特定可配置项

目前,云迁移仅适用于与 AWS S3 协议兼容的后端。有几个可配置项可用于调整访问云服务时的行为:

{
  "multipart_sync_threshold": {object_size},
  "multipart_min_part_size": {part_size}
}
  • multipart_sync_threshold (整数)

    大小等于或大于此值的对象将使用分段上传迁移到云端。

  • multipart_min_part_size (整数)

    使用分段上传迁移对象时使用的最小分段大小。

如何配置

有关如何为区域组配置存储类,请参阅添加存储类。云迁移需要创建一个特殊存储类,其分层类型定义为 cloud-s3cloud-s3-glacier

注意

如果您之前没有执行过多站点配置,则会为您创建一个 default 区域和区域组,并且对区域/区域组的更改在 Ceph Object Gateways (RGW daemons) 重新启动之前不会生效。如果您已为多站点创建了一个 realm,则一旦使用 radosgw-admin period update --commit 提交更改,区域/区域组更改就会生效。

radosgw-admin zonegroup placement add --rgw-zonegroup={zone-group-name} \
                                        --placement-id={placement-id} \
                                        --storage-class={storage-class-name} \
                                        --tier-type=cloud-s3

例如

radosgw-admin zonegroup placement add --rgw-zonegroup=default \
                                        --placement-id=default-placement \
                                        --storage-class=CLOUDTIER --tier-type=cloud-s3
[
    {
        "key": "default-placement",
        "val": {
            "name": "default-placement",
            "tags": [],
            "storage_classes": [
                "CLOUDTIER",
                "STANDARD"
            ],
            "tier_targets": [
                {
                    "key": "CLOUDTIER",
                    "val": {
                        "tier_type": "cloud-s3",
                        "storage_class": "CLOUDTIER",
                        "retain_head_object": "false",
                        "s3": {
                            "endpoint": "",
                            "access_key": "",
                            "secret": "",
                            "host_style": "path",
                            "location_constraint": "";
                            "target_storage_class": "",
                            "target_path": "",
                            "acl_mappings": [],
                            "multipart_sync_threshold": 33554432,
                            "multipart_min_part_size": 33554432
                        }
                    }
                }
            ]
        }
    }
]

注意

一旦创建了 --tier-type=cloud-s3--tier-type=cloud-s3-glacier 的存储类,以后就不能将其修改为任何其他存储类类型。

然后可以使用以下命令执行分层配置:

radosgw-admin zonegroup placement modify --rgw-zonegroup={zone-group-name} \
                                           --placement-id={placement-id} \
                                           --storage-class={storage-class-name} \
                                           --tier-config={key}={val}[,{key}={val}]

配置中的 key 指定要更新的配置变量,val 指定其新值。

例如

radosgw-admin zonegroup placement modify --rgw-zonegroup default \
                                           --placement-id default-placement \
                                           --storage-class CLOUDTIER \
                                           --tier-config=endpoint=http://XX.XX.XX.XX:YY,\
                                           access_key=<access_key>,secret=<secret>, \
                                           multipart_sync_threshold=44432, \
                                           multipart_min_part_size=44432, \
                                           retain_head_object=true

可以使用句点访问嵌套的分层配置值。此表示法类似于使用 jq 等工具访问 JSON 中的嵌套字段的方式。请注意,句点分隔符 (.) 的使用特定于 --tier-config 中的键访问,不应与 Ceph RGW realm/zonegroup/zone 的模式混淆。例如:

radosgw-admin zonegroup placement modify --rgw-zonegroup={zone-group-name} \
                                           --placement-id={placement-id} \
                                           --storage-class={storage-class-name} \
                                           --tier-config=acls.source_id=${source-id}, \
                                           acls.dest_id=${dest-id}

可以通过指定用方括号括起来的特定条目来访问配置数组条目,并且可以使用空数组 [] 添加新的数组条目。例如,创建新的 acl 数组条目:

radosgw-admin zonegroup placement modify --rgw-zonegroup={zone-group-name} \
                                           --placement-id={placement-id} \
                                           --storage-class={storage-class-name} \
                                           --tier-config=acls[].source_id=${source-id}, \
                                           acls[${source-id}].dest_id=${dest-id}, \
                                           acls[${source-id}].type=email

可以通过提供 --tier-config-rm={key} 来删除条目。

例如

radosgw-admin zonegroup placement modify --rgw-zonegroup default \
                                           --placement-id default-placement \
                                           --storage-class CLOUDTIER \
                                           --tier-config-rm=acls.source_id=testid
radosgw-admin zonegroup placement modify --rgw-zonegroup default \
                                           --placement-id default-placement \
                                           --storage-class CLOUDTIER \
                                           --tier-config-rm=target_path

可以使用以下命令删除存储类:

radosgw-admin zonegroup placement rm --rgw-zonegroup={zone-group-name} \
                                       --placement-id={placement-id} \
                                       --storage-class={storage-class-name}

例如

radosgw-admin zonegroup placement rm --rgw-zonegroup default \
                                       --placement-id default-placement \
                                       --storage-class CLOUDTIER
[
    {
        "key": "default-placement",
        "val": {
            "name": "default-placement",
            "tags": [],
            "storage_classes": [
                "STANDARD"
            ]
        }
    }
]

对象修改和限制

配置后,云存储类可以像任何其他存储类一样用于定义存储桶生命周期 (LC) 规则。例如:

<LifecycleConfiguration>
  <Rule>
    ....
    <Transition>
      ....
      <StorageClass>CLOUDTIER</StorageClass>
    </Transition>
  </Rule>
</LifecycleConfiguration>

由于迁移是单向的,在配置 S3 生命周期规则时,云存储类应在对象迁移到的所有存储类中最后指定。随后的规则(如果有)在迁移到云端后不适用。

由于 API 限制,无法保留原始对象修改时间和 ETag,它们作为元数据属性存储在目标对象上,如下所示:

x-amz-meta-rgwx-source: rgw
x-amz-meta-rgwx-source-etag: ed076287532e86365e841e92bfc50d8c
x-amz-meta-rgwx-source-key: lc.txt
x-amz-meta-rgwx-source-mtime: 1608546349.757100363
x-amz-meta-rgwx-versioned-epoch: 0

为了允许云服务检测源并映射用户定义的 x-amz-meta- 属性,迁移的对象将添加两个新的附加属性:

  • x-rgw-cloud : true/false

    如果对象是从 RGW 迁移的,则默认为 true

  • x-rgw-cloud-keep-attrs : true / false

    如果设置为默认值 true,云服务应映射并存储所有 x-amz-meta-* 属性。如果不能,则操作应失败。

    如果设置为 false,云服务可以忽略此类属性,只存储正在发送的对象数据。

默认情况下,迁移后,源对象会被删除。但可以通过将配置选项 retain_head_object 设置为 true 来保留其元数据并更新值(包括 storage-classobject-size)。但是,对此类对象执行 GET 操作仍会因 InvalidObjectState 错误而失败。对原始源对象的任何其他操作将仅针对其元数据条目,保持迁移的对象完整无损。

例如

s3cmd info s3://bucket/lc.txt
s3://bucket/lc.txt (object):
   File size: 12
   Last mod:  Mon, 21 Dec 2020 10:25:56 GMT
   MIME type: text/plain
   Storage:   CLOUDTIER
   MD5 sum:   ed076287532e86365e841e92bfc50d8c
   SSE:       none
   Policy:    none
   CORS:      none
   ACL:       M. Tester: FULL_CONTROL
   x-amz-meta-s3cmd-attrs: atime:1608466266/ctime:1597606156/gid:0/gname:root/md5:ed076287532e86365e841e92bfc50d8c/mode:33188/mtime:1597605793/uid:0/uname:root
s3cmd get s3://bucket/lc.txt lc_restore.txt
download: 's3://bucket/lc.txt' -> 'lc_restore.txt'  [1 of 1]
ERROR: S3 error: 403 (InvalidObjectState)

为避免跨存储桶的对象名称冲突,源存储桶名称将前置到目标对象名称。如果对象是版本化的,则会附加对象的 versionid

以下是对象名称格式:

s3://<target_path>/<source_bucket_name>/<source_object_name>(-<source_object_version_id>)

版本化对象

对于版本化和锁定的对象,适用与 LifecycleExpiration 相似的语义,如下所述。

  • 如果对象是当前的,迁移到云端后,它将变为非当前,并创建删除标记。

  • 如果对象是非当前的且已锁定,则跳过其迁移。

恢复对象

现在可以恢复迁移到云端的对象。有关更多信息,请参阅从云端恢复对象

未来工作

  • 发送预签名重定向或读取通过迁移到云端的对象。

  • 支持迁移到其他云提供商(如 Azure)。

由 Ceph 基金会为您呈现

Ceph 文档是由非营利性 Ceph 基金会 资助和托管的社区资源。如果您希望支持这项工作和我们的其他努力,请考虑 立即加入