文章目录
引言
条带的概念
基本概念
条带(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块盘中。
disk0 | disk1 | disk2 | disk3 | disk4 | disk5 |
---|---|---|---|---|---|
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的是按照如下存储的。
radosobj0 | radosobj1 | radosobj2 | radosobj3 | radosobj4 | radosobj5 |
---|---|---|---|---|---|
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) |
radosobj6 | radosobj7 | radosobj8 | radosobj9 | radosobj10 | radosobj11 |
---|---|---|---|---|---|
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) | - | - |
- | - | - | - | - | - |