Ceph块存储之RBD
2017-02-05
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大小的块设备:
1rbd create --size 10240 foo_image
查看块设备镜像 #
查看块设备的命令是rbd info {pool-name}/{image-name}
:
1rbd info foo_image
将块设备映射到系统内核 #
块设备映射到操作系统的命令是rbd map {image-name} --pool {pool-name}
1rbd map foo_image --pool rbd
2
3rbd: sysfs write failed
4RBD image feature set mismatch. You can disable features unsupported by the kernel with "rbd feature disable".
5In some cases useful info is found in syslog - try "dmesg | tail" or so.
6rbd: map failed: (6) No such device or address
禁用当前系统内核不支持的feature:
1rbd info foo_image
2rbd image 'foo_image':
3 size 10240 MB in 2560 objects
4 order 22 (4096 kB objects)
5 block_name_prefix: rbd_data.1218c2ae8944a
6 format: 2
7 features: layering, exclusive-lock, object-map, fast-diff, deep-flatten
8 flags:
9
10
11rbd 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的前提条件。
重新映射:
1 rbd map foo_image --pool rbd
2/dev/rbd0
格式化块设备镜像 #
1mkfs.ext4 /dev/rbd0
取消块设备和内核映射 #
1rbd unmap foo_image --pool rbd
删除块设备镜像 #
删除RBD镜像的命令是rbd rm {pool-name}/{image-name}
1rbd rm rbd/foo_image
创建快照 #
1rbd create --size 10240 foo_image
2
3rbd snap create foo_image@foo_snap
列出创建的快照:
1rbd snap list rbd/foo_image
2SNAPID NAME SIZE
3 4 foo_snap 10240 MB
或者使用rbd ls {pool-name} -l
列出:
1rbd ls rbd -l
2NAME SIZE PARENT FMT PROT LOCK
3foo_image 10240M 2
4foo_image@foo_snap 10240M 2
查看快照的详细信息:
1rbd info rbd/foo_image@foo_snap
2rbd image 'foo_image':
3 size 10240 MB in 2560 objects
4 order 22 (4096 kB objects)
5 block_name_prefix: rbd_data.121b62ae8944a
6 format: 2
7 features: layering, exclusive-lock, object-map, fast-diff, deep-flatten
8 flags:
9 protected: False
克隆快照 #
快照必须处于被保护状态才能被克隆。
执行命令rbd snap protect {pool-name}/{image-name}@{snapshot-name}
将快照置成保护状态:
1rbd snap protect rbd/foo_image@foo_snap
查看快照状态:
1rbd info rbd/foo_image@foo_snap
2rbd image 'foo_image':
3 size 10240 MB in 2560 objects
4 order 22 (4096 kB objects)
5 block_name_prefix: rbd_data.121b62ae8944a
6 format: 2
7 features: layering, exclusive-lock, object-map, fast-diff, deep-flatten
8 flags:
9 protected: True
接下来使用命令rbd clone {pool-name}/{parent-image}@{snap-name} {pool-name}/{child-image-name}
克隆快照到另一个RBD pool的新image:
1rbd clone rbd/foo_image@foo_snap kube/bar_image
查看克隆的镜像:
1rbd ls kube -l
2NAME SIZE PARENT FMT PROT LOCK
3bar_image 10240M rbd/foo_image@foo_snap 2
前面提到过format为2的image支持分层,接下来我们看一下foo_image@foo_snap这个快照的children rbd children {pool-name}/{image-name}@{snapshot-name}
:
1rbd children rbd/foo_image@foo_snap
2kube/bar_image
从输出可以看出kube/bar_image基于rbd/foo_image@foo_snap。接下来我们使用rbd flatten {pool-name}/{image-name}
将kube/bar_image压平:
1rbd flatten kube/bar_image
再次查看kube/bar_image已经没有PARENT了:
1rbd ls kube -l
2NAME SIZE PARENT FMT PROT LOCK
3bar_image 10240M 2
导入导出RBD image #
RBD image的导出和导入常用于RBD块设备的简单的备份与恢复。
导出RBD image rbd export {pool-name}/{image-name} {file}
1rbd export rbd/foo_image /tmp/foo_image_export
导入RBD image rbd import {file} {pool-name}/{image-name}
:
1rbd import /tmp/foo_image_export rbd/bar_image --image-format 2
1rbd ls rbd -l
2NAME SIZE PARENT FMT PROT LOCK
3bar_image 10240M 2
4foo_image 10240M 2
5foo_image@foo_snap 10240M 2 yes