rados:ceph存储集群。
librados:在rados之上,提供key/value存取接口。
radosgw:基于librados提供s3/swift接口。
rbd:基于librados提供块设备接口。
cephfs:基于内核提供分布式文件系统接口。
1、镜像(image)的相关操作。
2、Block(对应于ceph集群的object)的存取。block存取较简单直观,下面主要介绍image相关操作实现。
a、image的创建:创建image就是,就是向rados中写入一些key/value对,记录image的元数据。例如以下命令创建image :rbd create foo --size 10240 --order 22 --pool rbd,则记录的元信息如下:
Key(oid) |
Value |
备注 |
rbd_id.foo |
1d3e74b0dc51 |
记录image name到image id的映射 image id是用rand()函数,按一定规则生成 |
rbd_header. 1d3e74b0dc51 |
size : 10240 order : 22 object_prefix: rbd_data. 1d3e74b0dc51 snap_seq: 0 |
记录元信息 Order是用来计算block size,如order为22,block size为1<<22 = 4M |
rbd_directory |
…… name_foo: id_1d3e74b0dc51 Id_1d3e74b0dc51: name_foo |
rbd_directory中记录了所有image的name和id的双向映射关系 |
b、image的扩容:
Image的更新就比较简单了,就是更新如上的元数据。
比如resize操作,就是修改rbd_header. 1d3e74b0dc51的size属性。
c、image的snapshot:
rbd snap create --snap foo.snap1 --image foo
元数据修改情况如下:
Key(oid) |
Value |
备注 |
rbd_header. 1d3e74b0dc51 |
…… snap_seq: 1 snapshot_0000000000000001: foo.snap1 … |
修改snap_seq编号 添加snapshot信息 |
先回顾下oid对应文件名的命名规则:
每个object的文件名格式为:objectname_key_head(snap_num)_hash_namespace_poolid
对于rbd操作,objectname的生成规则大致为:用读写块设备的偏移除以block size得到64位表示的block序号,转换为16进制字符表示,再用object_prefix作为前缀,即组成了objectname。
举例:
假设偏移为13M,13M/4M + 1 = 4,用64位16进制字符表示为0000000000000004,则objectname为rbd_data. 1d3e74b0dc51. 0000000000000004
带snapshot的image的写流程如下:
原文:http://www.cnblogs.com/chris-cp/p/5213984.html