注意
本文档适用于 Ceph 的开发版本。
文件分条
以下文本描述了 Ceph 文件系统客户端的文件是如何存储在 RADOS 中的对象中的。
ceph_file_layout
Ceph 将给定文件的数据分布(分条)到多个底层对象中。文件数据到这些对象的映射方式由 ceph_file_layout 结构定义。数据分布是一种修改过的 RAID 0,其中数据以(每个文件)固定大小分条到一组对象中,达到该大小后,另一组对象将保存文件数据。第二组也最多保存固定量的数据,然后使用另一组,依此类推。
定义一些术语将有助于解释文件数据在 Ceph 对象中的布局方式。
- 文件
一段连续数据的集合,从 Ceph 客户端的角度命名(即,使用 Ceph 存储的 Linux 系统上的文件)。文件的数据被划分为固定大小的“分条单元”,存储在 Ceph“对象”中。
- 分条单元
用于文件 RAID 0 分布的数据块大小(以字节为单位)。文件的所有分条单元大小相等。最后一个分条单元通常是不完整的——即它表示文件末尾的数据以及超出固定分条单元大小的未使用“空间”。
- 分条计数
构成文件数据的 RAID 0“分条”的连续分条单元数。
- 分条
文件数据的连续范围,以固定大小的“分条单元”块,RAID 0 分条到“分条计数”个对象中。
- object
Ceph 存储维护的数据集合。对象用于保存 Ceph 客户端文件的部分。
- 对象集
一组对象,它们共同代表文件的连续部分。
ceph_file_layout 结构中的三个字段定义了这种映射
u32 fl_stripe_unit;
u32 fl_stripe_count;
u32 fl_object_size;
(它们实际上以其磁盘格式 __le32 维护。)
前两个字段的作用应从上述定义中清楚。
第三个字段是用于支持文件数据的对象的最大大小(以字节为单位)。对象大小是分条单元的倍数。
文件的数据被分块为分条单元,连续的分条单元存储在对象集中的对象上。对象集中的对象数量与分条计数相同。存储文件数据的对象不会超过文件指定的对象大小,因此在经过固定数量的完整分条后,将使用新的对象集来存储后续的文件数据。
请注意,默认情况下,Ceph 使用简单的分条策略,其中 object_size 等于 stripe_unit 且 stripe_count 为 1。这只是将一个 stripe_unit 放入每个对象中。
这是一个更复杂的例子
file size = 1 trillion = 1000000000000 bytes
fl_stripe_unit = 64KB = 65536 bytes
fl_stripe_count = 5 stripe units per stripe
fl_object_size = 64GB = 68719476736 bytes
这意味着
file stripe size = 64KB * 5 = 320KB = 327680 bytes
each object holds 64GB / 64KB = 1048576 stripe units
file object set size = 64GB * 5 = 320GB = 343597383680 bytes
(also 1048576 stripe units * 327680 bytes per stripe unit)
因此,文件的 1 万亿字节可以分为完整的对象集,然后是完整的分条,然后是完整的分条单元,最后是一个不完整的分条单元。
- 1 trillion bytes / 320GB per object set = 2 complete object sets
(with 312805232640 bytes remaining)
- 312805232640 bytes / 320KB per stripe = 954605 complete stripes
(with 266240 bytes remaining)
- 266240 bytes / 64KB per stripe unit = 4 complete stripe units
(with 4096 bytes remaining)
- and the final incomplete stripe unit holds those 4096 bytes.
下面的 ASCII 艺术试图捕捉这一点
_________ _________ _________ _________ _________
/object 0\ /object 1\ /object 2\ /object 3\ /object 4\
+=========+ +=========+ +=========+ +=========+ +=========+
| stripe | | stripe | | stripe | | stripe | | stripe |
o | unit | | unit | | unit | | unit | | unit | stripe 0
b | 0 | | 1 | | 2 | | 3 | | 4 |
j |---------| |---------| |---------| |---------| |---------|
e | stripe | | stripe | | stripe | | stripe | | stripe |
c | unit | | unit | | unit | | unit | | unit | stripe 1
t | 5 | | 6 | | 7 | | 8 | | 9 |
|---------| |---------| |---------| |---------| |---------|
s | . | | . | | . | | . | | . |
e . . . . .
t | . | | . | | . | | . | | . |
|---------| |---------| |---------| |---------| |---------|
0 | stripe | | stripe | | stripe | | stripe | | stripe | stripe
| unit | | unit | | unit | | unit | | unit | 1048575
| 5242875 | | 5242876 | | 5242877 | | 5242878 | | 5242879 |
\=========/ \=========/ \=========/ \=========/ \=========/
_________ _________ _________ _________ _________
/object 5\ /object 6\ /object 7\ /object 8\ /object 9\
+=========+ +=========+ +=========+ +=========+ +=========+
| stripe | | stripe | | stripe | | stripe | | stripe | stripe
o | unit | | unit | | unit | | unit | | unit | 1048576
b | 5242880 | | 5242881 | | 5242882 | | 5242883 | | 5242884 |
j |---------| |---------| |---------| |---------| |---------|
e | stripe | | stripe | | stripe | | stripe | | stripe | stripe
c | unit | | unit | | unit | | unit | | unit | 1048577
t | 5242885 | | 5242886 | | 5242887 | | 5242888 | | 5242889 |
|---------| |---------| |---------| |---------| |---------|
s | . | | . | | . | | . | | . |
e . . . . .
t | . | | . | | . | | . | | . |
|---------| |---------| |---------| |---------| |---------|
1 | stripe | | stripe | | stripe | | stripe | | stripe | stripe
| unit | | unit | | unit | | unit | | unit | 2097151
| 10485755| | 10485756| | 10485757| | 10485758| | 10485759|
\=========/ \=========/ \=========/ \=========/ \=========/
_________ _________ _________ _________ _________
/object 10\ /object 11\ /object 12\ /object 13\ /object 14\
+=========+ +=========+ +=========+ +=========+ +=========+
| stripe | | stripe | | stripe | | stripe | | stripe | stripe
o | unit | | unit | | unit | | unit | | unit | 2097152
b | 10485760| | 10485761| | 10485762| | 10485763| | 10485764|
j |---------| |---------| |---------| |---------| |---------|
e | stripe | | stripe | | stripe | | stripe | | stripe | stripe
c | unit | | unit | | unit | | unit | | unit | 2097153
t | 10485765| | 10485766| | 10485767| | 10485768| | 10485769|
|---------| |---------| |---------| |---------| |---------|
s | . | | . | | . | | . | | . |
e . . . . .
t | . | | . | | . | | . | | . |
|---------| |---------| |---------| |---------| |---------|
2 | stripe | | stripe | | stripe | | stripe | | stripe | stripe
| unit | | unit | | unit | | unit | | unit | 3051756
| 15258780| | 15258781| | 15258782| | 15258783| | 15258784|
|---------| |---------| |---------| |---------| |---------|
| stripe | | stripe | | stripe | | stripe | | (partial| (partial
| unit | | unit | | unit | | unit | | stripe | stripe
| 15258785| | 15258786| | 15258787| | 15258788| | unit) | 3051757)
\=========/ \=========/ \=========/ \=========/ \=========/