注意

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

RADOS网关数据布局

虽然源代码是最终的指南,但本文件帮助用户和新开发者了解实现细节。

简介

Swift将用户对象收集到容器中,我们互换使用S3术语,所以我们说RGW的桶实现了Swift容器。

本文档不考虑RGW如何在这些结构上操作,encode()decode() methods for serialization.

概念视图

虽然RADOS只了解池和具有xattrs和omap[1]的对象,但从概念上讲,RGW维护三种类型的信息:元数据、桶索引和(有效负载)数据。

元数据

RGW存储多种类型的元数据。类型列表可以通过以下命令显示。截至2025年4月的类型如下所示:

$ bin/radosgw-admin metadata list
[
    "account",
    "bucket",
    "bucket.instance",
    "group",
    "otp",
    "roles",
    "topic",
    "user"
]

使用以下形式的命令检查元数据条目:

$ radosgw-admin metadata list
$ radosgw-admin metadata list bucket
$ radosgw-admin metadata list bucket.instance
$ radosgw-admin metadata list user

$ radosgw-admin metadata get bucket:<bucket>
$ radosgw-admin metadata get bucket.instance:<bucket>:<bucket_id>
$ radosgw-admin metadata get user:<user>   # get or set

上述命令示例中使用了变量;当发出命令时,你必须用你的特定值替换它们:

  • user: 存储用户信息

  • bucket: 存储桶名称和桶实例ID之间的映射

  • bucket.instance: 存储桶实例信息[2]

每个元数据条目都保存在一个单独的RADOS对象上。有关实现细节,请参见下文。

请注意,此元数据未索引。当列出元数据部分时,我们对包含池执行RADOSpgls操作。

桶索引

桶索引是一种不同的元数据,并单独保存。桶索引包含附加到RADOS对象的键值映射。默认情况下,每个桶是一个RADOS对象,但由于Hammer,可以将该映射分片到多个RADOS对象。映射本身保存在omap中,与每个RADOS对象相关联。

请注意,我们在桶索引中也保存其他信息,这些信息保存在其他键命名空间中。我们可以在那里保存桶索引日志,对于版本化对象,我们在其他键上保存更多信息。

数据

对象数据保存在一个或多个RADOS对象中,每个RGW对象对应一个对象。

对象查找路径

当访问S3/Swift对象时,REST API以三个参数的形式到达RGW:帐户信息(S3中的访问密钥或Swift中的帐户名称)、桶或容器名称,以及对象名称(或键)。目前,RGW仅使用帐户信息来确定用户ID并进行访问控制。

RGW中的用户ID是一个字符串,通常是来自用户凭证的实际用户名,而不是散列或映射的标识符。

当访问用户的数据时,用户记录从名为<user_id>在池default.rgw.meta的形式表示users.uid.

的池中。桶名称以命名空间default.rgw.meta的形式表示root。加载桶记录以获取所谓的标记,该标记用作桶ID。

S3/Swift对象位于名称类似于default.rgw.buckets.data的池中。<marker>_<key>,例如default.7593.4_image.png,其中标记是default.7593.4,键是image.png。由于这些连接的名称不会被解析,只会传递给RADOS,因此分隔符的选择不重要,也不会引起歧义。出于同样的原因,对象名称(键)中允许使用斜杠。

可以创建多个数据池,并使不同用户的桶默认创建在不同的RADOS池中,从而提供必要的扩展性。这些池的布局和命名由“策略”设置控制。[3]

一个RGW对象可能由多个RADOS对象组成,第一个是HEAD包含元数据(包括清单、ACL、内容类型、ETag和用户定义的元数据)的对象。元数据保存在xattrs中。HEAD` object may also inline up to :confval:`rgw_max_chunk_size` of object data, for efficiency and atomicity.  This enables a convenenient tiering strategy:  index pools are necessarily replicated (cannot be EC) and should be placed on fast SSD OSDs.  With a mix of small/hot RGW objects and larger, warm/cold RGW objects like video files, the larger objects will automatically be placed in the ``buckets.data池,可能是EC和/或较慢的存储,如HDD或QLC SSD。

清单描述了每个RGW对象如何在RADOS对象上布局。

桶和对象列表

属于给定用户的桶列在具有命名空间<user_id>.buckets(例如,foo.buckets) 的omap中。当列出桶、更新桶内容以及更新和检索桶统计信息(例如,用于配额)时,会访问这些对象。default.rgw.meta的形式表示users.uid的RADOS对象

请参阅用户可见的编码类cls_user_bucket_entry及其嵌套类cls_user_bucket以获取这些omap条目的值。

这些列表与池中名为.rgw.

的桶保持一致。属于给定桶的对象列在桶索引中,如上“桶索引”小节所述。索引对象的默认命名.dir.<marker>在池default.rgw.buckets.index.

Footnotes

中。

[2] 在Dumpling发布之前,“bucket.instance”元数据不存在,“bucket”元数据包含其信息。在旧安装中可能会遇到此类桶。

[3] 池名称随着Infernalis发布而更改。如果您查看的是旧设置,某些细节可能会有所不同。特别是,每个现在合并到default.root.meta池访问权限的用户。

附录:汇编

已知的池:

.rgw.root

区域、区域和全局信息记录,每个对象一个。

<zone>.rgw.control

notify.<N>

<zone>.rgw.meta

多个具有不同类型元数据的命名空间:

命名空间:root

<bucket>.bucket.meta.<bucket>:<marker># see put_bucket_instance_info()

租户用于区分桶,但不是桶实例。示例:

.bucket.meta.prodtx:test%25star:default.84099.6
.bucket.meta.testcont:default.4126.1
.bucket.meta.prodtx:testcont:default.84099.4
prodtx/testcont
prodtx/test%25star
testcont
命名空间:users.uid

包含 _both_ 每个用户信息(RGWUserInfo)在“<user>”对象中以及每个用户的桶列表在“<user>.buckets”对象的omap中。

prodtx$prodt
test2.buckets
prodtx$prodt.buckets
test2
命名空间:users.email

不重要

命名空间:users.keys

示例:47UA98JSTJZ9YAN3OS3O

这允许radosgw在身份验证期间通过访问密钥查找用户。

命名空间:users.swift

test:tester

<zone>.rgw.buckets.index

对象命名.dir.<marker>: 每个对象包含一个桶索引。如果索引分片,每个分片将在标记后附加分片索引。

<zone>.rgw.buckets.data

示例:default.7593.4__shadow_.488urDFerTYXavx4yAd-Op8mxehnvTI_1<marker>_<key>

一个标记的示例是default.16004.1default.7593.4`<zone>.<instance_id>.<bucket_id>。但是一旦生成,标记就不会再解析,因此其格式可以在未来自由更改。

由 Ceph 基金会带给您

Ceph 文档是一个社区资源,由非盈利的 Ceph 基金会资助和托管Ceph Foundation. 如果您想支持这一点和我们的其他工作,请考虑加入现在加入.