注意
本文档适用于 Ceph 的开发版本。
云迁移
此功能使得 S3 对象能够作为对象生命周期的一部分,通过存储类迁移到远程云服务。迁移是单向的:数据不能从远程区域迁移回来。此功能的目的是实现数据向多个云提供商的迁移。支持与 AWS (S3) 兼容的云提供商。
我们使用分层类型为 cloud-s3 或 cloud-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结构包含type、source_id和dest_id。这些定义了对每个对象执行的 ACL 突变。ACL 突变使得将源用户 ID 转换为目标用户 ID 成为可能。type(id | email | uri)ACL 类型:
id定义用户 ID,email通过电子邮件定义用户,uri通过uri定义用户(组)。source_id(字符串)源区域中的用户 ID。
dest_id(字符串)目标上的用户 ID。
target_path(字符串)定义如何构建目标路径的字符串。目标路径指定了一个前缀,源存储桶名称/对象名称将附加到该前缀。如果未指定,则创建的
target_path为rgwx-${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-s3 或 cloud-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-class 和 object-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)。