注意
本文档适用于 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.1
或default.7593.4`。<zone>.<instance_id>.<bucket_id>
。但是一旦生成,标记就不会再解析,因此其格式可以在未来自由更改。
由 Ceph 基金会带给您
Ceph 文档是一个社区资源,由非盈利的 Ceph 基金会资助和托管Ceph Foundation. 如果您想支持这一点和我们的其他工作,请考虑加入现在加入.