Ceph官方文檔告訴咱們Ceph本質上也是對象存儲。並且瞭解到,Ceph的塊存儲其實在客戶端也會被分爲若干個對象進行處理。函數
一. 實驗和步驟
$ ceph osd pool create test_pool 256 256
$ rados -p test_pool ls
結果爲空:證實create pool之後,沒有object產生。code
$ rbd create test_pool/test_image --size 1024
$ rbd info test_pool/test_image rbd image 'test_image': size 1024 MB in 256 objects order 22 (4096 kB objects) block_name_prefix: rbd_data.100f74b0dc51 format: 2 features: layering, exclusive-lock, object-map, fast-diff, deep-flatten flags:
裏面比較重要的一個字段:
block_name_prefix: rbd_data.100f74b0dc51
這個字段將做爲該image每一個object的前綴。orm
$ rados -p test_pool ls rbd_directory rbd_object_map.100f74b0dc51 rbd_id.test_image rbd_header.100f74b0dc51
$rbd-nbd map test_pool/test_image /dev/nbd0
$ dd if=/dev/zero of=/dev/nbd0 bs=4M count=1 seek=0 $ rados -p test_pool ls rbd_data.100f74b0dc51.0000000000000000 rbd_directory rbd_object_map.100f74b0dc51 rbd_id.test_image rbd_header.100f74b0dc51
$ dd if=/dev/zero of=/dev/nbd0 bs=4M count=1 seek=10 $ rados -p test_pool ls rbd_directory rbd_object_map.100f74b0dc51 rbd_id.test_image rbd_header.100f74b0dc51 rbd_data.100f74b0dc51.000000000000000a
二. 原理解釋
建立卷: 使用Rados API建立一個Header Object,將這個卷的元數據如id, size, snaps, name, seq等信息寫入。而後將自身(id)註冊到一個」RBD_DIRECTORY」的Object裏。 記錄元數據信息:
1)
key: rbd_id.test_image
value: 100f74b0dc51
備註:image name到image id的映射。image id是用rand()函數,按必定規則生成。 這個object文件的大小爲16 byte。對象
key: rbd_header.100f74b0dc51
value: size : 10240
order : 22
object_prefix: rbd_data.100f74b0dc51
snap_seq: 0
備註:記錄元信息Order是用來計算block size,如order爲22,block size爲1<<22 = 4M 該object的大小爲0。文檔
key: rbd_directory
value: ……
name_test_image: id_100f74b0dc51
Id_100f74b0dc51: name_test_image
備註:rbd_directory中記錄了全部image的name和id的雙向映射關係。 該object的大小爲0。get
根據image id取得image name的方法:ast
$ rados -p test_pool getomapval rbd_directory id_100f74b0dc51 value (14 bytes) : 00000000 0a 00 00 00 74 65 73 74 5f 69 6d 61 67 65 |....test_image| 0000000e
三. Object的數據文件form
root@ubu-machine:/etc/ceph/osd.0/current# ls 0.0_head 0.18_head 0.20_head 0.29_head 0.31_head 0.3a_head 0.6_head 0.f_head 1.17_head 1.1_head 1.28_head 1.30_head 1.39_head 1.5_head 1.e_head 0.0_TEMP 0.18_TEMP 0.20_TEMP 0.29_TEMP 0.31_TEMP 0.3a_TEMP 0.6_TEMP 0.f_TEMP 1.17_TEMP 1.1_TEMP 1.28_TEMP 1.30_TEMP 1.39_TEMP 1.5_TEMP 1.e_TEMP 0.10_head 0.19_head 0.21_head 0.2a_head 0.32_head 0.3b_head 0.7_head 1.0_head 1.18_head 1.20_head 1.29_head 1.31_head 1.3a_head 1.6_head 1.f_head
其中0.0_head,存儲0.0這個PG的object。test
root@ubu-machine:/etc/ceph/osd.0/current/1.1c_head# ll -h total 4.1M drwxr-xr-x 2 root root 4.0K 3月 15 21:54 ./ drwxr-xr-x 260 root root 8.0K 3月 15 21:52 ../ -rw-r--r-- 1 root root 0 3月 15 21:52 __head_0000001C__1 -rw-r--r-- 1 root root 4.0M 3月 15 21:54 rbd\udata.100f6b8b4567.0000000000000009__head_6E33BC5C__1 -rw-r--r-- 1 root root 0 3月 15 21:54 rbd\udirectory__head_30A98C1C__1