ceph同时提供对象存储、块存储、文件存储三种接口,但本质上其实是对象存储,也就是说一个rbd image实际上包含了多个对象(默认情况下是image_size/4M),这里我们首先介绍一下如何查找一个对象的实际存储位置,然后介绍如何查找rbd image。
ceph中查找一个对象的位置
1、上传一个文件到pool(示例中叫做test)中
rados -p test put cirros cirros-0.3.2-x86_64-disk.img
2、查看pool中刚才上传的对象
rados -p test ls | grep cirros
3、 查看对象的位置信息
ceph osd map test cirros
输出结果:
osdmap e20062 pool 'test' (13) object 'cirros' -> pg 13.9576dc54 (13.54) -> up ([5,3], p5) acting ([5,3], p5)
这代表pool test中的cirros这个对象位于13.54这个pg中,并且位于osd5和osd3上(两个副本)。
4、进入到对应osd的存储目录,找到对应文件即可。
cd /var/lib/ceph/osd/ceph-3/current/13.54_head; ls
这个目录下存放了13.54这个pg中所有的object,可以根据指纹9576dc54来定位到具体的文件。
ceph中查找一个rbd image的存储位置
正如文章开头提到,一个rbd image其实包含了多个obejct,因此我们只需找到这个image包含了哪些object,然后按照上面的方法找出每个object的位置即可。
1、在pool test中创建一个image1
rbd create test/image1 --size 100 --image-format 2
2、查看这个image,找到指纹信息
rbd info test/image1
命令输出
rbd image 'image1':
size 102400 kB in 25 objects
order 22 (4096 kB objects)
block_name_prefix: rbd_data.4eed912ae8944a
format: 2
features: layering, exclusive
指纹就是4eed912ae8944a
3、根据指纹找到这个image的object
rados -p test ls | grep 4eed912ae8944a
这个命令的输出就是这个image的所有object
4、按照上面的方法即可找到每个object对应的实际存储位置