Ceph RBD:条带(stripe)详解

引言

条带的概念

基本概念

条带(stripe)是把连续的一段数据按照一定size切分成多个数据块,这些数据块可以存储在指定数量的磁盘中。主要有如下两个概念:

  • 条带大小(stripe_unit):即每个数据块的大小,如设置为1M,那么5M的数据就可以切分成5个1M的数据块。
  • 条带宽度(stripe_num):即连续的数据可以存储在多少个磁盘中,如设置为6,那么12M的数据就可以存储在6个磁盘中。

条带数据如何分布?

如果stripe_unit设置为1M,stripe_num设置为6,那么10M的数据是如何存储的呢?

  • 首先将10M的数据按照stripe_unit拆分成10段,uint0-uint9,每一段数据1M。
  • 将10段数据依次循环存放到stripe_num设置的6块盘中。
disk0disk1disk2disk3disk4disk5
uint0(1M)uint1(1M)uint2(1M)uint3(1M)uint4(1M)uint5(1M)
uint6(1M)uint7(1M)uint8(1M)uint9(1M)

为什么要有条带?

  • 优势:将数据拆分写入不同的磁盘,自动实现负载均衡,防止单盘出现的性能瓶颈。
  • 劣势:数据存储在不同的磁盘上,读取时需要进行数据的合并,stripe_unit如果设置过小,数据合并和磁盘IOPS瓶颈也会产生。

Ceph RBD如何使用条带?

Ceph RADOS层本身是无条带概念的,需要RBD进行控制。RBD将RADOS对象看作是磁盘,其他概念与前文介绍相同。如果stripe_unit设置为1M,stripe_num设置为6,每个RADOS对象可以存储4M数据,那么40M的是按照如下存储的。

radosobj0radosobj1radosobj2radosobj3radosobj4radosobj5
uint0(1M)uint1(1M)uint2(1M)uint3(1M)uint4(1M)uint5(1M)
uint6(1M)uint7(1M)uint8(1M)uint9(1M)uint10(1M)uint11(1M)
uint12(1M)uint13(1M)uint14(1M)uint15(1M)uint16(1M)uint17(1M)
uint18(1M)uint19(1M)uint20(1M)uint21(1M)uint22(1M)uint23(1M)
radosobj6radosobj7radosobj8radosobj9radosobj10radosobj11
uint24(1M)uint25(1M)uint26(1M)uint27(1M)uint28(1M)uint29(1M)
uint30(1M)uint31(1M)uint32(1M)uint33(1M)uint34(1M)uint35(1M)
uint36(1M)uint37(1M)uint38(1M)uint39(1M)--
------

条带观察实践

创建rbd image,stripe_unit为1M,stripe_count为5

创建一个stripe_unit为1M,stripe_count为5的image。

[root@111]rbd create blockpool0/vol_2 --stripe-unit 1M --stripe-count 5 --size 50M

查询image状态

查询image状态。

[root@111]# rbd info blockpool0/vol_2
rbd image 'vol_2':
        size 50 MiB in 15 objects
        order 22 (4 MiB objects)
        snapshot_count: 0
        id: 35ca368138143
        block_name_prefix: rbd_data.35ca368138143
        format: 2
        features: layering, striping, exclusive-lock, object-map, fast-diff, deep-flatten
        op_features: 
        flags: 
        create_timestamp: Fri Jun 24 18:54:33 2022
        access_timestamp: Fri Jun 24 18:54:33 2022
        modify_timestamp: Fri Jun 24 18:54:33 2022
        stripe unit: 1 MiB
        stripe count: 5

条带的元数据保存在header对象中。

[root@111]# rados listomapvals rbd_header.35ca368138143 -p blockpool0
access_timestamp
value (8 bytes) :
00000000  e9 97 b5 62 2e f5 95 18                           |...b....|
00000008

create_timestamp
value (8 bytes) :
00000000  e9 97 b5 62 2e f5 95 18                           |...b....|
00000008

features
value (8 bytes) :
00000000  3f 00 00 00 00 00 00 00                           |?.......|
00000008

modify_timestamp
value (8 bytes) :
00000000  e9 97 b5 62 2e f5 95 18                           |...b....|
00000008

object_prefix
value (26 bytes) :
00000000  16 00 00 00 72 62 64 5f  64 61 74 61 2e 33 35 63  |....rbd_data.35c|
00000010  61 33 36 38 31 33 38 31  34 33                    |a368138143|
0000001a

order
value (1 bytes) :
00000000  16                                                |.|
00000001

size
value (8 bytes) :
00000000  00 00 20 03 00 00 00 00                           |.. .....|
00000008

snap_seq
value (8 bytes) :
00000000  00 00 00 00 00 00 00 00                           |........|
00000008

stripe_count
value (8 bytes) :
00000000  05 00 00 00 00 00 00 00                           |........|
00000008

stripe_unit
value (8 bytes) :
00000000  00 00 10 00 00 00 00 00                           |........|
00000008

写入25M数据,查询对象size

查询每一个data对象,发现每一个对象写入1M数据。

[root@111]# rados -p blockpool0 ls | grep 35ca368138143
rbd_data.35ca368138143.0000000000000003
rbd_header.35ca368138143
rbd_data.35ca368138143.0000000000000006
rbd_data.35ca368138143.0000000000000005
rbd_data.35ca368138143.0000000000000000
rbd_data.35ca368138143.0000000000000001
rbd_object_map.35ca368138143
rbd_data.35ca368138143.0000000000000004
rbd_data.35ca368138143.0000000000000002
rbd_data.35ca368138143.0000000000000009
rbd_data.35ca368138143.0000000000000008
rbd_data.35ca368138143.0000000000000007

[root@111]# rados -p blockpool0 stat2 rbd_data.35ca368138143.0000000000000000
blockpool0/rbd_data.35ca368138143.0000000000000000 mtime 2022-06-24 19:44:39.951527, size 4194304
[root@111]# rados -p blockpool0 stat2 rbd_data.35ca368138143.0000000000000001
blockpool0/rbd_data.35ca368138143.0000000000000001 mtime 2022-06-24 19:44:39.976697, size 4194304
[root@111]# rados -p blockpool0 stat2 rbd_data.35ca368138143.0000000000000002
blockpool0/rbd_data.35ca368138143.0000000000000002 mtime 2022-06-24 19:44:40.001234, size 4194304
[root@111]# rados -p blockpool0 stat2 rbd_data.35ca368138143.0000000000000003
blockpool0/rbd_data.35ca368138143.0000000000000003 mtime 2022-06-24 19:44:40.024567, size 4194304
[root@111]# rados -p blockpool0 stat2 rbd_data.35ca368138143.0000000000000004
blockpool0/rbd_data.35ca368138143.0000000000000004 mtime 2022-06-24 19:44:40.047441, size 4194304
[root@111]# rados -p blockpool0 stat2 rbd_data.35ca368138143.0000000000000005
blockpool0/rbd_data.35ca368138143.0000000000000005 mtime 2022-06-24 19:44:40.074516, size 1048576
[root@111]# rados -p blockpool0 stat2 rbd_data.35ca368138143.0000000000000006
blockpool0/rbd_data.35ca368138143.0000000000000006 mtime 2022-06-24 19:44:40.099117, size 1048576
[root@111]# rados -p blockpool0 stat2 rbd_data.35ca368138143.0000000000000007
blockpool0/rbd_data.35ca368138143.0000000000000007 mtime 2022-06-24 19:44:40.126181, size 1048576
[root@111]# rados -p blockpool0 stat2 rbd_data.35ca368138143.0000000000000008
blockpool0/rbd_data.35ca368138143.0000000000000008 mtime 2022-06-24 19:44:40.149522, size 1048576
[root@111]# rados -p blockpool0 stat2 rbd_data.35ca368138143.0000000000000009
blockpool0/rbd_data.35ca368138143.0000000000000009 mtime 2022-06-24 19:44:40.175659, size 1048576

参考文献

https://docs.ceph.com/en/quincy/man/8/rbd/

  • 4
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值