昨天我們對Ceph的基本框架有了一個簡單的理解, 今天我們針對其中一個模塊RBD,也就是塊設備進行單獨的分析。
RBD簡介
Ceph可以同時提供對象存儲RADOSGW、塊存儲RBD、文件系統存儲Ceph FS。 RBD即RADOS Block Device的簡稱,RBD塊存儲是最穩定且最常用的存儲類型。RBD塊設備類似磁盤可以被掛載。 RBD塊設備具有快照、多副本、克隆和一致性等特性,數據以條帶化的方式存儲在Ceph集群的多個OSD中。
注意:塊是一個有序字節,普通的塊大小為512字節。基于塊的存儲是最常見的存儲方式,例如硬盤。
RBD相關命令和操作
RBD的使用實際上就是對RBD image的使用,RBD image是由多個對象條帶化存儲到后端的塊設備。
創建塊設備鏡像
創建塊設備鏡像命令是rbd create --size {megabytes} {pool-name}/{image-name},如果pool_name不指定,則默認的pool是rbd。 下面的命令將創建一個10GB大小的塊設備:
rbd create --size 10240 foo_image
查看塊設備鏡像
查看塊設備的命令是rbd info {pool-name}/{image-name}:
rbd info foo_image
將塊設備映射到系統內核
塊設備映射到操作系統的命令是rbd map {image-name} --pool {pool-name}
1 2 3 4 5 6
rbd map foo_image --pool rbd rbd: sysfs write failed RBD image feature set mismatch. You can disable features unsupported by the kernel with "rbd feature disable". In some cases useful info is found in syslog - try "dmesg | tail" or so. rbd: map failed: (6) No such device or address
禁用當前系統內核不支持的feature:
1 2 3 4 5 6 7 8 9 10 11
rbd info foo_image rbd image 'foo_image': size 10240 MB in 2560 objects order 22 (4096 kB objects) block_name_prefix: rbd_data.1218c2ae8944a format: 2 features: layering, exclusive-lock, object-map, fast-diff, deep-flatten flags: rbd feature disable foo_image exclusive-lock, object-map, fast-diff, deep-flatten --pool rbd
注意:注意到上面的rbd info顯示的RBD鏡像的format為2,Format 2的RBD鏡像支持RBD分層,是實現Copy-On-Write的前提條件。
重新映射:
rbd map foo_image --pool rbd /dev/rbd0
格式化塊設備鏡像
mkfs.ext4 /dev/rbd0
取消塊設備和內核映射
rbd unmap foo_image --pool rbd
刪除塊設備鏡像
刪除RBD鏡像的命令是rbd rm {pool-name}/{image-name}
rbd rm rbd/foo_image
創建快照
1 2 3
rbd create --size 10240 foo_image rbd snap create foo_image@foo_snap
列出創建的快照:
1 2 3
rbd snap list rbd/foo_image SNAPID NAME SIZE 4 foo_snap 10240 MB
或者使用rbd ls {pool-name} -l列出:
1 2 3 4
rbd ls rbd -l NAME SIZE PARENT FMT PROT LOCK foo_image 10240M 2 foo_image@foo_snap 10240M 2
查看快照的詳細信息:
1 2 3 4 5 6 7 8 9
rbd info rbd/foo_image@foo_snap rbd image 'foo_image': size 10240 MB in 2560 objects order 22 (4096 kB objects) block_name_prefix: rbd_data.121b62ae8944a format: 2 features: layering, exclusive-lock, object-map, fast-diff, deep-flatten flags: protected: False
克隆快照
快照必須處于被保護狀態才能被克隆。
執行命令rbd snap protect {pool-name}/{image-name}@{snapshot-name}將快照置成保護狀態:
rbd snap protect rbd/foo_image@foo_snap
查看快照狀態:
1 2 3 4 5 6 7 8 9
rbd info rbd/foo_image@foo_snap rbd image 'foo_image': size 10240 MB in 2560 objects order 22 (4096 kB objects) block_name_prefix: rbd_data.121b62ae8944a format: 2 features: layering, exclusive-lock, object-map, fast-diff, deep-flatten flags: protected: True
接下來使用命令rbd clone {pool-name}/{parent-image}@{snap-name} {pool-name}/{child-image-name}克隆快照到另一個RBD pool的新image:
rbd clone rbd/foo_image@foo_snap kube/bar_image
查看克隆的鏡像:
1 2 3
rbd ls kube -l NAME SIZE PARENT FMT PROT LOCK bar_image 10240M rbd/foo_image@foo_snap 2
前面提到過format為2的image支持分層,接下來我們看一下foo_image@foo_snap這個快照的children rbd children {pool-name}/{image-name}@{snapshot-name}:
1 2
rbd children rbd/foo_image@foo_snap kube/bar_image
從輸出可以看出kube/bar_image基于rbd/foo_image@foo_snap。接下來我們使用rbd flatten {pool-name}/{image-name}將kube/bar_image壓平:
1
rbd flatten kube/bar_image
再次查看kube/bar_image已經沒有PARENT了:
1 2 3
rbd ls kube -l NAME SIZE PARENT FMT PROT LOCK bar_image 10240M 2
導入導出RBD image
RBD image的導出和導入常用于RBD塊設備的簡單的備份與恢復。
導出RBD image rbd export {pool-name}/{image-name} {file}
1
rbd export rbd/foo_image /tmp/foo_image_export
導入RBD image rbd import {file} {pool-name}/{image-name}:
1
rbd import /tmp/foo_image_export rbd/bar_image --image-format 2
1 2 3 4 5
rbd ls rbd -l NAME SIZE PARENT FMT PROT LOCK bar_image 10240M 2 foo_image 10240M 2 foo_image@foo_snap 10240M 2 yes