rbd對象探究
1. rbd鏡像的創(chuàng)建與使用
為了更直觀的感受rbd對象出刷,本文從創(chuàng)建rbd池開始,構(gòu)建了一個模擬的rbd使用環(huán)境艺晴,并以此探究rbd的對象庶艾。
首先是rbd池的創(chuàng)建與使用:
服務(wù)端:
1.創(chuàng)建rbd池
[root@node-1 ~]# ceph osd pool create rbd-pool 64 64 && rbd pool init rbd-pool
2.創(chuàng)建塊設(shè)備鏡像
[root@node-1 ~]# rbd create --size 1024 rbd-pool/rbd-pool-image-1
3.拷貝密鑰文件兽赁,或者創(chuàng)建新用戶状答,這里直接拷貝admin密鑰及配置
[root@node-1 ~]# scp –r /etc/ceph 192.168.159.132:/etc/
客戶端:
1.注意更新ceph yum源
2.安裝ceph-common
[root@192.168.159.132 ~]# yum install ceph-common –y
3.掛載塊設(shè)備鏡像
[root@192.168.159.132 ~]# rbd map rbd-pool/rbd-pool-image-1
4.格式化冷守,僅第一次掛載需要,塊設(shè)備名稱注意更改
[root@192.168.159.132 ~]# mkfs.xfs /rbd /dev/rbd0
5.掛載到目錄
[root@192.168.159.132 ~]# mkdir /mnt/rbd0 && mount /dev/rbd0 /mnt/rbd0
6.卸載
[root@192.168.159.132 ~]# umount /mnt/rbd0 && rbd unmap rbd-pool/rbd-pool-image-1
注意:在rbd map時可能會報錯惊科,因?yàn)閮?nèi)核特性不支持拍摇。
rbd: sysfs write failed
RBD image feature set mismatch. You can disable features unsupported by the kernel with "rbd feature disable rbd-pool/rbd-pool-image-1 object-map fast-diff deep-flatten".
In some cases useful info is found in syslog - try "dmesg | tail".
rbd: map failed: (6) No such device or address
這里根據(jù)提示關(guān)閉某些特性即可。
2. 當(dāng)我們創(chuàng)建鏡像時馆截,創(chuàng)建了什么授翻?
[root@node-1 ~]# rados -p rbd-pool ls
rbd_object_map.20cc292949764 # rbd特性信息
rbd_header.20cc292949764 #image元數(shù)據(jù)
rbd_directory # 記錄該rbd池中含有的image_name,id
rbd_info # rbd信息
rbd_id.rbd-pool-image-1 #此鏡像的id號
通過以上命令及其結(jié)果可以看出孙咪,相關(guān)含義在《Ceph設(shè)計(jì)原理與實(shí)現(xiàn)》一書中有詳細(xì)介紹,當(dāng)我們創(chuàng)建完鏡像后巡语,rbd-pool中多了幾個對象翎蹈。其含義可在src/include/rbd_types.h文檔中查看。
/* New-style rbd image 'foo' consists of objects
rbd_id.foo - id of image
rbd_header.<id> - image metadata
rbd_object_map.<id> - optional image object map
rbd_data.<id>.00000000
rbd_data.<id>.00000001
... - data
*/
目前rbd鏡像中還沒有文件男公,因此大部分對象是空的荤堪。通過“rados -p rbd-pool get <obj_name> <output_file_name>”命令可以導(dǎo)出對象。
經(jīng)過查看枢赔,發(fā)現(xiàn)rbd_id.rbd-pool-image-1保存了鏡像的id:20cc292949764澄阳。
rbd_info中保存了:overwrite validated。
rbd_object_map.20cc292949764中保存了:
{
"size": 256,
"bit_table": [
"0x00",
"0x00",
…
}//用于支持 object-map特性踏拜,具體作用在實(shí)踐中遇到再來補(bǔ)充碎赢。
這里給出查看rbd_object_map命令: ceph-dencoder import ./rbd_object_map.20cc292949764 type BitVector<2> decode dump_json。
3. 向rbd寫入一個文件后速梗,實(shí)際寫入的是什么肮塞?
在mkfs塊設(shè)備后,我們查看下rbd-pool中的對象姻锁。
[root@node-1 data]# rados -p rbd-pool ls
rbd_data.20e5ff0224ec0.00000000000000e0 #image對象信息
rbd_directory #rbd管理image對象信息
rbd_header.20e5ff0224ec0 #image元數(shù)據(jù)
rbd_data.20e5ff0224ec0.0000000000000060 #
rbd_info #rbd信息
rbd_data.20e5ff0224ec0.0000000000000001
rbd_data.20e5ff0224ec0.00000000000000ff
rbd_data.20e5ff0224ec0.0000000000000080
rbd_id.rbd-pool-image-1 #記錄image_name和image_id的映射關(guān)系
rbd_data.20e5ff0224ec0.00000000000000c0
rbd_data.20e5ff0224ec0.0000000000000082
rbd_data.20e5ff0224ec0.0000000000000020
rbd_data.20e5ff0224ec0.0000000000000040
rbd_data.20e5ff0224ec0.0000000000000081
rbd_data.20e5ff0224ec0.0000000000000000
rbd_data.20e5ff0224ec0.00000000000000a0
發(fā)現(xiàn)增加了12個rbd_data對象枕赵。rbd被xfs格式化以后會產(chǎn)生一些對象,這些對象是以16進(jìn)制名稱的方式存儲在后臺的位隶,也就是rbd大小一定的情況下對象數(shù)目是一定的拷窜,也就是名稱也是一定的。在后續(xù)的向文件中寫入操作的過程中涧黄,還會發(fā)現(xiàn)篮昧,對象依然是從rbd_data.*****00的對象開始寫入。這個實(shí)際和客戶端格式化的文件系統(tǒng)有關(guān)弓熏。在《從ceph對象中提取rbd中的指定文件》一文中可以得知:rbd存儲對象和文件系統(tǒng)的sectors是一一對應(yīng)的恋谭。
客戶端查看分區(qū)設(shè)備信息:
[root@localhost ~]# parted -s /dev/rbd0 unit s print
Model: 未知 (unknown)
Disk /dev/rbd0: 2097152s
Sector size (logical/physical): 512B/512B
Partition Table: loop
Disk Flags:
Number Start End Size File system 標(biāo)志
- 1 0s 2097151s 2097152s xfs*
上面結(jié)果中“Start”對應(yīng)的“0s”表示該分區(qū)設(shè)備從第0塊sector開始寫入,每塊sector大小512B挽鞠,共有2097152s 塊疚颊。
服務(wù)端查看鏡像信息:
[root@node-1 ~]# rbd info rbd-pool/rbd-pool-image-1
rbd image 'rbd-pool-image-1':
size 1 GiB in 256 objects #大小1GB狈孔,平均分配給256個對象
order 22 (4 MiB objects) # 每個對象大小4MB
snapshot_count: 0
id: 20e5ff0224ec0
block_name_prefix: rbd_data.20e5ff0224ec0
format: 2 # image 1 基本上不用
features: layering, exclusive-lock
op_features: # 該image支持的特性
flags:
create_timestamp: Wed May 26 16:42:36 2021
access_timestamp: Wed May 26 16:42:36 2021
modify_timestamp: Wed May 26 16:42:36 2021
上述結(jié)果可知鏡像對應(yīng)的塊設(shè)備大小1GB,平均分配到256個對象材义,每個4MB均抽。
簡單計(jì)算可以得出:sector數(shù)量 * 單個sector大小 = 鏡像大小
2097152 * 512 / 1024 / 1024 = 1024 MB = 1GB。
因此2097152個sector和image中的256個對象存在對應(yīng)關(guān)系其掂。已知sector從0塊開始寫入油挥,那么obj應(yīng)該也從0開始增長,寫滿4MB后款熬,換到新的obj深寥。
我在這里使用dd命令在客戶端寫入一個4MB對象,然后再去查看pool中對象信息贤牛。
這里我們在客戶端上掛載鏡像后惋鹅,向該目錄中寫入一個無意義對象。
[root@localhost mnt]# dd if=/dev/zero of=/mnt/rbd0/file1 count=1 bs=4MB
然后殉簸,觀察rbd-pool對象情況闰集。
[root@node-1 ~]# rados -p rbd-pool ls
rbd_data.20e5ff0224ec0.00000000000000e0
rbd_directory
rbd_header.20e5ff0224ec0
rbd_data.20e5ff0224ec0.0000000000000060
rbd_info
rbd_data.20e5ff0224ec0.0000000000000001
rbd_data.20e5ff0224ec0.00000000000000ff
rbd_data.20e5ff0224ec0.0000000000000080
rbd_id.rbd-pool-image-1
rbd_data.20e5ff0224ec0.00000000000000c0
rbd_data.20e5ff0224ec0.0000000000000082
rbd_data.20e5ff0224ec0.0000000000000020
rbd_data.20e5ff0224ec0.0000000000000040
rbd_data.20e5ff0224ec0.0000000000000081
rbd_data.20e5ff0224ec0.0000000000000000
rbd_data.20e5ff0224ec0.00000000000000a0
似乎沒有變化,但其實(shí)rbd_data.******00對象的大小增加了般卑,先按下不表武鲁,我們看下此時rbd_data.******00對象的大小。
[root@node-1 ~]# rados -p rbd-pool stat rbd_data.20e5ff0224ec0.0000000000000000
rbd-pool/rbd_data.20e5ff0224ec0.0000000000000000 mtime 2021-05-26 18:22:26.000000, size 4034560
經(jīng)查詢蝠检,rbd_data.******00對象大小為4034560B沐鼠。
我們再向客戶端掛載的文件目錄中寫入一個有意義的小對象。
[root@localhost rbd0]# vi hellorbd
hello rbd
然后蝇率,查看hellorbd文件在塊設(shè)備中的位置迟杂,順便也可以看下file1的位置。
[root@localhost rbd0]# xfs_bmap -lvp /mnt/rbd0/hellorbd
/mnt/rbd0/hellorbd:
- EXT: FILE-OFFSET BLOCK-RANGE AG AG-OFFSET TOTAL FLAGS*
0: [0..7]: 7880..7887 0 (7880..7887) 8 01111
[root@localhost rbd0]# xfs_bmap -lvp /mnt/rbd0/file1
/mnt/rbd0/file1:
- EXT: FILE-OFFSET BLOCK-RANGE AG AG-OFFSET TOTAL FLAGS*
0: [0..7815]: 64..7879 0 (64..7879) 7816 01111
可以看出hellorbd在sector中分布在[7880~7887]本慕,file1為[64~7879]排拷。hellorbd緊跟著file1,并且file1并非從0開始锅尘,而是從64開始监氢,說明前面的sector已經(jīng)被使用,這段64個sector(即 64 * 512 B)長度空間在格式化文件系統(tǒng)的時候已經(jīng)被占用了藤违。還有一點(diǎn)值得吐槽的是:dd命令中的4MB浪腐,實(shí)際寫入大小只有4000000B。
根據(jù)hellorbd的位置信息顿乒,可以計(jì)算出它存儲在在rbd-pool/rbd-pool-image-1中的對象的具體位置议街。
計(jì)算方法:
1.計(jì)算出hellorbd到rbd-pool對象的映射
sectors數(shù)量 / 對象數(shù)量 = 單個對象的sectors范圍
2097152/256 = 8192
根據(jù) hellorbd:[7880~7887],可以得出hellorbd在第0個對象中:rbd_data.******00璧榄。
2.計(jì)算出hellorbd在rbd_data對象中偏移量
(7880 - (0 * 8192))* 512B = 4030560
4034560特漩!還記得我們上文中在寫入file1之后吧雹,查看過rbd_data.******00對象的大小嗎?就是4034560涂身。
接下來使用rados命令和dd命令在服務(wù)端還原出rbdhello雄卷。
[root@node-1 ~]# rados -p rbd-pool get rbd_data.20e5ff0224ec0.0000000000000000 ./rbd_data.20e5ff0224ec0.0000000000000000
[root@node-1 ~]# dd if=rbd_data.20e5ff0224ec0.0000000000000000 of=hellorbd bs=512 count=8 skip=7880
- [root@node-1 ~]# cat hellorbd*
hello rbd
或者,
[root@node-1 ~]# dd if=rbd_data.20e5ff0224ec0.0000000000000000 of=hellorbd-1 bs=1 count=4096 skip=4034560
[root@node-1 ~]# cat hellorbd-1
hello rbd
可以得出蛤售,塊設(shè)備在rbd中被切割成一個個對象丁鹉,保存在rbd_data對象中,這樣使得rbd管理起塊設(shè)備的數(shù)據(jù)極為方便悴能,而且也達(dá)到到了瘦分配的特性揣钦。rbd_data中還保存著客戶端中這個設(shè)備的信息(文件系統(tǒng),大小等)漠酿,這個客戶端在掛載時拂盯,可以直接把image映射為一個塊設(shè)備,其所有讀寫操作的本質(zhì)都是rbd_data记靡。