注意

本文档适用于 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 addzone 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-TIERINGSTANDARD_IAREDUCED_REDUNDANCYONEZONE_IA。像 CHEAPNDEEP 这样的自定义存储类名称被 Ceph 接受,但某些客户端和库可能不接受。

由 Ceph 基金会为您呈现

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