注意
本文档适用于 Ceph 的开发版本。
池放置和存储类
放置目标
版本 Jewel 新增。
放置目标控制哪些池与特定存储桶关联。存储桶的放置目标是在创建时选择的,不能修改。radosgw-admin bucket stats 命令将显示其 placement_rule。
区域组配置包含一个放置目标列表,其中包含一个名为 default-placement 的初始目标。然后,区域配置将每个区域组放置目标名称映射到其本地存储。此区域放置信息包括用于存储桶索引的 index_pool 名称、用于不完整多部分上传元数据的 data_extra_pool 名称,以及每个存储类的 data_pool 名称。
存储类
版本 Nautilus 新增。
存储类指定对象数据的位置。S3 存储桶生命周期 (LC) 规则可以自动执行对象在存储类之间的转换。
存储类是根据放置目标定义的。每个区域组放置目标都列出了其可用的存储类,其中包含一个名为 STANDARD 的初始类。区域配置负责为每个区域组的存储类提供一个 data_pool 池名称。
区域组/区域配置
放置配置是通过在区域组和区域上使用 radosgw-admin 命令执行的。
可以使用以下命令查询区域组放置配置:
radosgw-admin zonegroup get
{
"id": "ab01123f-e0df-4f29-9d71-b44888d67cd5",
"name": "default",
"api_name": "default",
...
"placement_targets": [
{
"name": "default-placement",
"tags": [],
"storage_classes": [
"STANDARD"
]
}
],
"default_placement": "default-placement",
...
}
可以使用以下命令查询区域放置配置:
radosgw-admin zone get
{
"id": "557cdcee-3aae-4e9e-85c7-2f86f5eddb1f",
"name": "default",
"domain_root": "default.rgw.meta:root",
...
"placement_pools": [
{
"key": "default-placement",
"val": {
"index_pool": "default.rgw.buckets.index",
"storage_classes": {
"STANDARD": {
"data_pool": "default.rgw.buckets.data"
}
},
"data_extra_pool": "default.rgw.buckets.non-ec",
"index_type": 0,
"inline_data": true
}
}
],
...
}
注意
如果您之前没有进行任何多站点配置,则会为您创建一个 default 区域和区域组,并且对区域/区域组的更改在 Ceph Object Gateways 重新启动之前不会生效。如果您已为多站点创建了一个 realm,则在通过 radosgw-admin period update --commit 提交更改后,区域/区域组更改将生效。
添加放置目标
要创建名为 temporary 的新放置目标,请将其添加到区域组中
radosgw-admin zonegroup placement add --rgw-zonegroup default \
--placement-id temporary
然后为该目标提供区域放置信息
radosgw-admin zone placement add --rgw-zone default \
--placement-id temporary \
--data-pool default.rgw.temporary.data \
--index-pool default.rgw.temporary.index \
--data-extra-pool default.rgw.temporary.non-ec
注意
在默认放置目标设置下,RGW 将对象的第一块数据存储在 RADOS HEAD 对象中,以及 XATTR 元数据。可以在 zone placement add 或 zone placement modify 命令中传递 --placement-inline-data=false 标志,以更改此行为,使其适用于存储在该目标上的新对象。当数据内联存储(默认)时,它可能对读/写工作负载提供优势,因为对象数据的第一块可以与对象元数据一起在单个 librados 调用中检索/存储。另一方面,不内联存储数据的目标可以为 RGW 客户端删除请求提供性能优势,当 BlueStore DB 位于比存储桶数据更快的存储上时,因为它消除了在处理客户端请求时同步访问较慢设备的需要。在这种情况下,与已删除对象关联的数据将由垃圾回收在后台异步删除。请注意,仅在写入默认存储类时才执行内联。在写入非默认存储类时,从不执行内联。
添加存储类
要将名为 STANDARD_IA 的新存储类添加到 default-placement 目标,请首先将其添加到区域组
radosgw-admin zonegroup placement add --rgw-zonegroup default \
--placement-id default-placement \
--storage-class STANDARD_IA
然后为该存储类提供区域放置信息
radosgw-admin zone placement add --rgw-zone default \
--placement-id default-placement \
--storage-class STANDARD_IA \
--data-pool default.rgw.glacier.data \
--compression lz4
自定义放置
默认放置
默认情况下,新存储桶将使用区域组的 default_placement 目标。可以使用以下命令更改此区域组设置:
radosgw-admin zonegroup placement default --rgw-zonegroup default \
--placement-id new-placement
用户放置
Ceph Object Gateway 用户可以通过在用户信息中设置非空的 default_placement 字段来覆盖区域组的默认放置目标。同样,default_storage_class 可以覆盖默认应用于对象的 STANDARD 存储类。
radosgw-admin user info --uid testid
{
...
"default_placement": "",
"default_storage_class": "",
"placement_tags": [],
...
}
如果区域组的放置目标包含任何 tags,则用户将无法使用该放置目标创建存储桶,除非其用户信息中的 placement_tags 字段包含至少一个匹配的标签。这对于限制对某些类型存储的访问非常有用。
radosgw-admin 命令可以直接修改这些字段,使用
radosgw-admin user modify --uid <user-id> \
--placement-id <default-placement-id> \
--storage-class <default-storage-class> \
--tags <tag1,tag2>
S3 存储桶放置
使用 S3 协议创建存储桶时,可以提供放置目标作为 LocationConstraint 的一部分,以覆盖来自用户和区域组的默认放置目标。
通常,LocationConstraint 必须与区域组的 api_name 匹配
<LocationConstraint>default</LocationConstraint>
自定义放置目标可以添加到 api_name 后面,后跟一个冒号
<LocationConstraint>default:new-placement</LocationConstraint>
Swift 存储桶放置
使用 Swift 协议创建存储桶时,可以在 HTTP 标头 X-Storage-Policy 中提供放置目标
X-Storage-Policy: new-placement
使用存储类
所有放置目标都有一个 STANDARD 存储类,默认应用于新对象。用户可以使用其 default_storage_class 覆盖此默认设置。
要在非默认存储类中创建对象,请在请求中使用 HTTP 标头提供该存储类名称。S3 协议使用 X-Amz-Storage-Class 标头,而 Swift 协议使用 X-Object-Storage-Class 标头。
然后可以使用 S3 对象生命周期管理,使用 Transition 操作在存储类之间移动对象数据。
使用 AWS S3 SDK(例如 boto3)时,存储类名称必须与 AWS S3 提供的名称匹配,否则 SDK 将删除请求并引发异常。此外,某些 S3 客户端和库在使用了名为或前缀为 GLACIER 的存储类时,会期望 AWS 特定的行为,因此在访问 Ceph RGW 服务时会失败。出于这个原因,我们建议在 Ceph 中使用其他存储类名称,包括 INTELLIGENT-TIERING、STANDARD_IA、REDUCED_REDUNDANCY 和 ONEZONE_IA。像 CHEAPNDEEP 这样的自定义存储类名称被 Ceph 接受,但某些客户端和库可能不接受。