注意

本文档适用于 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)
  \=========/ \=========/ \=========/ \=========/ \=========/

由 Ceph 基金会带给您

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