rbd块存储使用
rbd(Rados Block Device),是构建在rados集群之上的为客户端提供块设备的存储中间层,rbd可以为kvm、vmware等虚拟化技术和云平台(例如openstack、k8s)提供高性能和无限可扩展的存储后端。rbd块设备类似磁盘可以被挂载,rbd基于存储集群中多个osd进行条带化,支持存储空间简配和动态扩容等特性,并能够借助于rados存储集群实现快照、多副本和一致性。
文章目录
官方文档:https://docs.ceph.com/en/quincy/rbd/
rbd(Rados Block Device) ,是构建在rados集群之上的为客户端提供块设备的存储中间层,rbd可以为kvm、vmware等虚拟化技术和云平台(例如openstack、k8s)提供高性能和无限可扩展的存储后端。rbd块设备类似磁盘可以被挂载,rbd基于存储集群中多个osd进行条带化,支持存储空间简配和动态扩容等特性,并能够借助于rados存储集群实现快照、多副本和一致性。
条带化技术就是一种自动的将IO负载均衡到多个物理磁盘上的技术,条带化技术就是将一块连续的数据分成很多小部分并把它们分别存储到不同的磁盘上去,这就使多个进程能同时访问数据的多个不同部分而不会造成磁盘冲突,而且在需要对这种数据进行顺序访问的时候可以获得最大程度上的IO并行能力,从而获得非常好的性能。
rbd存储池
使用rbd时必须要先创建存储池,在存储池上启用rbd并完成初始化。
ceph osd pool create rbd-pool1 32 32 #创建存储池
ceph osd pool application enable rbd-pool1 rbd #存储池启用rbd
rbd pool init -p rbd-pool1 #对存储池进行初始化
镜像管理
rbd存储池并不能直接用于块设备,而是需要事先在存储池中创建image,然后把image作为块设备使用,rbd命令用于管理image。
创建镜像
rbd help create #查看创建image的帮助信息
rbd create -p rbd-pool1 --image data-image1 --size 5G #在rbd-pool1中创建一个5G的image,名为data-imag1
查看镜像
#查看pool中所有image
rbd ls -p rbd-pool1
#查看pool中指定image的相信信息
rbd info data-image1 -p rbd-pool1 #也可以简写为rbd info rbd-pool1/data-image1
#也可以指定输出格式,支持json、xml
rbd info rbd-pool1/data-image1 --format json --pretty-format
image详细信息中一些属性含义如下:
size:表示image大小和image包含的对象数量
order:表示对象大小,有效值为12-25,分别对应4k-32M之间
id:表示镜像id
snapshot_count:image快照次数
block_name_prefix:属于此image的对象的名称前缀
format:镜像格式,支持v1和v2,默认v2
features:image启用的特性
*—_time:image的创建时间、访问时间和修改时间
删除镜像
注意: 拥有快照的image是不能删除的,必须先删除其所有快照
rbd remove data-image2 -p rbd-pool1 #删除存储池rbd-pool1中的image data-image2
镜像回收站功能
直接删除的镜像数据无法恢复,另一种方式是先将镜像移动到回收站,后期确认删除的时候再从回收站删除即可。使用rbd trash命令来管理回收站中的镜像
将镜像移动到回收站
rbd help trash move #查看帮助
rbd trash move -p rbd-pool1 --image data-image2 #将data-image2移动到回收站
查看回收站中的镜像
rbd trash list -p rbd-pool1 #查看回收站中属于rbd-pool1存储池的镜像
从回收站还原镜像
rbd help trash restore
rbd trash restore -p rbd-pool1 --image data-image4 122a3d73d9f1c #将回收站中id为122a3d73d9f1c的镜像还原为rbd-pool1存储池中的data-image4
从回收站中删除镜像
rbd help trash remove
rbd trash remove -p rbd-pool1 122a3d73d9f1c #删除回收站中属于rbd-pool1存储池的镜像122a3d73d9f1c
镜像特性管理
目前image支持的特性如下:
- layering:支持镜像分层快照特性,用于快照写时复制,可以对image创建快照并保护,然后从快照克隆新的image,父子image之间采用cow技术,共享对象数据
- striping:支持条带化v2,类似raid0,只不过在ceph环境中数据被分散到不同的对象中,可改善顺序读写较多的场景
- exclusive-lock:支持独占锁,限制一个image只能被一个客户端使用
- object-map:支持object位图,用于加速导入导出及统计已用空间等,此特性开启的时候,会记录image所有对象的一个位图,用以标记对象是否真的存在,在一些场景下可以加速io,依赖exclusive-lock特性
- fast-diff:支持快速计算镜像与快照间数据差异对比,依赖object-map特性
- deep-flatten:支持快照扁平化操作,用于快照管理时解决依赖关系
- journaling:支持记录image的修改操作到日志,该特性可以通过记录日志并通过日志恢复数据,但会增加磁盘IO使用,依赖exclusive-lock特性
- data-pool:是否支持将image的数据对象存储于纠删码存储池, 主要用于将image的元数据与数据放置于不同的存储池
目前默认开启的特性包括:layering、exclusive-lock、object-map、fast-diff、deep-flatten
可以通过 rbd feature管理image的特性
创建image时指定要启用的特性
rbd create --image data-image2 --image-feature layering --size 4G -p rbd-pool1 #创建一个image,只启用layering特性
启用特性(针对已存在的image添加特性)
rbd feature enable #查看帮助
rbd feature enable rbd-pool1/data-image2 exclusive-lock #在data-image2上启用exclusive-lock特性
需要注意:
- 由于某些特性间存在依赖关系,所以启用一个特性前,必须要先启用它依赖的特性。例如,启用object-map特性前,必须先启用exclusive-lock,否则会报错
- 如果image不存在deep-flatten特性,它是不可添加的,只能在创建image时启用
禁用特性(针对已存在的image移除特性)
rbd help feature disable #查看帮助
rbd feature disable rbd-pool1/data-image2 journaling #禁用data-image2 journaling特性
需要注意:
- 和启用特性类似,由于某些特性间存在依赖关系,所以禁用用一个特性前,必须要先禁用依赖它的特性。例如,启用exclusive-lock特性前,必须先禁用object-map,否则会报错
- 如果image已存在deep-flatten特性,它可以被移除
客户端使用RBD
客户端访问RBD块设备的方式有两种:
- 通过内核模块rbd.ko把RBD块设备映射为节点本地的磁盘
- 另一种是通过librbd库提供的接口访问RBD块设备,它支持多种编程语言。qemu就是使用此类接口
下面以第一种方式为例,使用内核模块挂载RBD块设备使用
客户端想要挂载使用RBD块设备,需要先安装ceph客户端包ceph-common
apt -y install ceph-common
创建账户并授权
ceph auth get-or-create client.rbduser mon 'allow r' osd 'allow rwx pool=rbd-pool1' -o ceph.client.rbduser.keyring
ceph auth get client.rbduser
将ceph配置文件和keyring文件分发至客户端
scp ceph.client.rbduser.keyring /etc/ceph/ceph.conf root@192.168.211.15:/etc/ceph/
#客户端执行ceph命令验证
ceph --user rbduser -s
创建一个image
rbd --user rbduser create --image data-image3 --size 5G -p rbd-pool1
客户端挂载image
rbd --user rbduser map rbd-pool1/data-image3 #挂载rbd-pool1存储池的data-image3到本机
rbd showmapped #查看rbd挂载记录
lsblk
客户端格式化rbd块设备,写入数据测试
mkfs.xfs /dev/rbd0
mkdir /data
mount /dev/rbd0 /data/
echo "12345 test rbd" > /data/rbd-testfile
cat /data/rbd-testfile
rbd块设备扩容
如果使用过程中image空间不足,可以使用rbd resize对image进行扩容
rbd help resize #查看帮助
rbd resize --size 10G rbd-pool1/data-image3 #将data-image3扩容为10G
#扩容完成后,客户端查看已经显示为新的size。如果客户端未识别可以使用下面的命令重新识别磁盘大小
xfs_growfs /dev/rbd0 #针对xfs文件系统
resize3fs /dev/rdb0 #针对ext4文件系统
客户端查看,磁盘大小已更新
配置开机自动挂载(ubuntu20.04为例)
vim /etc/rc.local
#################
#!/bin/sh
rbd --user rbduser map rbd-pool1/data-image3
mount /dev/rbd0 /data/
#################
chmod +x /etc/rc.local
客户端卸载rbd块设备
umount /data #先把rbd设备从挂载的目录卸载
rbd --user rbduser unmap rbd-pool1/data-image3 #然后卸载rbd块设备
rbd showmapped #查看rbd映射记录验证
镜像快照和克隆
快照管理
rbd支持image快照,快照可以保存image历史状态,可以通过快照实现数据快速备份/恢复。另外ceph还支持快照分层机制,从而可以实现快速克隆VM映像
可以使用rbd snap命令管理镜像快照
创建快照
rbd help snap create #查看帮助
rbd snap create -p rbd-pool1 --image data-image3 --snap data-image3-snap1 #为data-iamge3创建一个名为data-image3-snap1的快照
查看快照
rbd snap ls rbd-pool1/data-image3 #查看data-image3的所有快照
还原快照
#先在客户端卸载rbd设备,否则会报错
umount /data
rbd --user rbduser unmap rbd-pool1/data-image3
#然后执行回滚
rbd help snap rollback #查看帮助
rbd snap rollback -p rbd-pool1 --image data-image3 --snap data-image3-snap1
限制快照数量
rbd snap limit set -p rbd-pool1 --image data-image3 --limit 10 #限制快照数量最多为10个
rbd snap limit clear -p rbd-pool1 --image data-image3 #取消限制
注意:快照数量过多,必然会导致image上原有数据第一次修改时的IO压力过大
删除快照
rbd help snap rm #查看帮助
rbd snap rm -p rbd-pool1 --image data-image3 --snap data-image3-snap1 #删除data-image3的快照data-image3-snap1
rbd snap purge -p rbd-pool1 --image data-image3 #删除镜像所有快照
克隆镜像
ceph支持在一个快照的基础上创建一个或多个COW或COR类型的克隆镜像,这种机制提供了一种极速创建image的机制。
用户可以创建一个基础image并为其创建一个只读快照,而后在此快照的基础上创建任意个克隆镜像进行读写操作,甚至能够进行多级克隆。例如openstack对接ceph rbd时,就可以利用此特性快速批量创建卷启动的虚拟机。
通过克隆创建的image功能上和直接创建的image几乎完全相同,同样支持读写、克隆和扩缩容等功能。唯一不同之处是克隆的image引用了一个上游的只读快照,而且此快照必须置于保护模式。
在rbd上使用分层克隆的方法很简单,首先创建一个image,对image创建一个快照并置于保护模式,然后克隆此快照即可。另外,克隆镜像支持跨存储池进行。
创建一个image data-image5
rbd create --size 11G -p rbd-pool1 --image data-image5
rbd ls -p rbd-pool1
为data-image5创建快照snap1,并置于保护模式
rbd snap create --image data-image5 -p rbd-pool1 --snap snap1
rbd snap protect --image data-image5 -p rbd-pool1 --snap snap1
快照置于保护模式是无法被删除的,如下图所示:
从data-image5的快照克隆一个镜像data-image6
rbd clone -p rbd-pool1 --image data-image5 --snap snap1 --dest-pool rbd-pool1 --dest data-image
查看克隆镜像的详情,其中的parent属性指定了克隆镜像所依赖的上游快照,如上图所示。
查看快照的子项
rbd children -p rbd-pool1 --image data-image5 --snap snap1
展平克隆的image(flatten)
- 如果需要删除快照,必须先接触克隆的image对快照的依赖关系,需要进行image展平操作,将信息从快照复制到克隆image。
- 展平操作需要的时间由image的数据量决定
- 要删除拥有克隆子项的快照,必须先展平其子image
rbd flatten -p rbd-pool1 --image data-image6 #对data-image6执行展平操作
执行flatten后,查看image详细信息,已经不存在对快照的依赖关系,如上图所示。
删除原始快照
rbd snap unprotect --image data-image5 -p rbd-pool1 --snap snap1 #取消保护
rbd snap rm --image data-image5 -p rbd-pool1 --snap snap1 #删除快照
更多推荐
所有评论(0)