Ceph介绍之RBD实现原理

RBD是Ceph提供的块设备,本文将简要介绍一下其实现原理。

Ceph官方文档告诉我们Ceph本质上也是对象存储。而且了解到,Ceph的块存储其实在客户端也会被分为若干个对象进行处理。也即,对于Ceph集群,存储数据的格式就行对象。如下图所示,从镜像(块存储的呈现形式)的信息可以看出,块存储的组成及属性。

图 1 RBD镜像属性

创建存储池的镜像之后,在存储池中会有相关的对象数据。其中两个对象与该镜像相关。如下图所示为包含两个镜像的存储池,查看该存储池包含三个对象(格式2的镜像与此不同)。

图2 镜像与Ceph对象关系

其中,rbd_directory对象为镜像文件夹对象,包含该存储池包含的对象名称列表。而imagename.rbd对象为与镜像名称对应的对象,里面包含对象的属性信息。如图3是从对象img_test.rbd导出的数据。对比图1和3可以看出两者的对应关系,这里不再赘述。

图3 文件夹对象导出数据

在《条带》相关章节提及了关于块存储的三个参数order、stripe_unit和stripe_count。三者确定的数据的写入与排布方式。默认情况order是22,也即对象大小为4MB,strip_unit大小与对象大小一致,strip_count为1。因此,对于顺序写数据的操作,每写入4MB的数据,都会有一个对象来存储数据。以此类推。

于是,本文进行实际测试,将镜像img_test挂载,并向其中顺序写入4MB的数据,可以看到在存储池zsn_2下面多了一个对象。

图4 RBD数据与对象关系

再次写入数据,并且将写入数据的位置定位在偏移为40MB的位置。写完数据之后,查看存储池对象列表多了一个对象,并且对象名称的后两位是0a,也即十进制的10。

图5 RBD数据与对象关系

图6


综上所述,可以得到如下结论:

1) 块设备在Ceph集群中的最终存储形式是对象,对象名称与LBA关联。

2) 块设备的元数据比较简单,存储在存储池中的一个对象中,其内容包括对象名称前缀、order、stripe_unit和stripe_count等,通过这些参数,已经写入数据的LBA,可以很容易的计算出对象名称及偏移。

3) 默认配置下(格式1)的镜像无法实现OSD的负载均衡,需要使用格式2的镜像。

对于格式2的存储池,其元数据在对象属性中,而不是本文的对象内容中,其RBD的放置方式相同,可以参考本文的方法进一步分析。


猜你喜欢

转载自blog.csdn.net/shuningzhang/article/details/50081731