Ceph 支持一个非常好的特性,即以COW(写时复制)的方式从RDB 快照创建克隆(clone),在Ceph> 中这也被称为快照分层(Snapshot Layering)。分层特性允许客户端创建多个Ceph RBD> 克隆实例。这个特性对OpenStack、CloudsStack、Qemu/KVM> 等云平台和虚拟化平台都提供了非常有用的帮助。这些平台通常以快照的形式来保护Ceph RBD> 镜像。然后,这些快照被多次用来孵化实例。快照是只读的,但COW> 克隆是完全可写的;Ceph的这一特性提供了更强大的灵活性,这对云平台来说非常有用。
创建块
rbd create (pool_name)/(rbd_name) --size xxxxxMB
如果不指定pool_name, 块默认创建在rbd中。下图在pool2中创建disk1
根据block id查看对应objects
[root@node1 cstrbd1]# rados ls -p pool2 |grep rbd_data.aca2904292e3
rbd_data.aca2904292e3.000000000000000c
rbd_data.aca2904292e3.00000000000000e0
rbd_data.aca2904292e3.000000000000000b
rbd_data.aca2904292e3.0000000000000016
rbd_data.aca2904292e3.0000000000000040
rbd_data.aca2904292e3.0000000000000060
rbd_data.aca2904292e3.000000000000001c
rbd_data.aca2904292e3.0000000000000009
查看object状态和pg以及osd (三副本存储池,落到0,1,2三个osd)
[root@node1 cstrbd1]# rados -p pool2 stat rbd_data.aca2904292e3.000000000000001a
pool2/rbd_data.aca2904292e3.000000000000001a mtime 2021-08-23T15:17:14.000000+0800, size 4194304
[root@node1 cstrbd1]# ceph osd map pool2 rbd_data.aca2904292e3.000000000000001a
osdmap e69 pool 'pool2' (3) object 'rbd_data.aca2904292e3.000000000000001a' -> pg 3.811558bf (3.1f) -> up ([0,1,2], p0) acting ([0,1,2], p0)
映射块
将img映射到主机(/dev/rbd0)
rbd map pool2/disk1
映射完成后可以通过fdisk -l查看
TIPS:
rbd unmap pool2/disk1
取消映射
挂载与使用
格式化文件系统,这里使用XFS文件系统
mkfs.xfs -f /dev/rbd0
挂载到指定目录使用,挂载完成可以通过df -h查看挂载点等信息
mount /dev/rbd0 /root/cst
dd if=/dev/zero of=/root/cst/file bs=100M count=1 oflag=direct
在目录中写入100M的文件
通过以下命令可以查看存储池和img的使用量,数据被写入到ceph的osd中:
[root@node1 cstrbd1]# rados df
POOL_NAME USED OBJECTS CLONES COPIES MISSING_ON_PRIMARY UNFOUND DEGRADED RD_OPS RD WR_OPS WR USED COMPR UNDER COMPR
device_health_metrics 0 B 0 0 0 0 0 0 0 0 B 0 0 B 0 B 0 B
pool2 983 MiB 174 64 522 0 0 0 130643 378 MiB 855 341 MiB 0 B 0 B
total_objects 174
total_used 2.1 GiB
total_avail 28 GiB
total_space 30 GiB
[root@node1 cstrbd1]# rbd du pool2/disk1
NAME PROVISIONED USED
disk1@snap1 1 GiB 136 MiB
disk1@snap2 1 GiB 136 MiB
disk1 1 GiB 160 MiB
<TOTAL> 1 GiB 432 MiB
创建快照
创建快照
rbd snap create --snap snap1 pool2/disk1
快照还原
ceph不支持在线还原,需要进行umount和unmap操作后才能进行还原
验证快照还原:
- img中随意写入新数据
- 卸载img:unmount /dev/rbd0 /root/cst/
- 取消映射: rbd unmap /dev/rbd0
- 快照还原:rbd snap rollback pool2/disk1@snap1
还原完成后重新映射和挂载,查看数据,正常来说可以看到第一步中写入的数据已经不在了。
另外我们通过查看img已用量信息发现,img的快照实际上是与img在一起的,作为img的使用量(回忆以前openstack针对cinder的quota,snapshot也是不占用配额的,且snapshot与源volume强关联)
[root@node1 cstrbd1]# rbd du pool2/diskclone1
NAME PROVISIONED USED
diskclone1@snap2-1 1 GiB 136 MiB
diskclone1@snap2-2 1 GiB 136 MiB
diskclone1 1 GiB 40 MiB
<TOTAL> 1 GiB 312 MiB
模板与克隆
Ceph RBD 镜像有两种类型:format-1 和format-2。RBD 快照支持这两种类型,即format-1 镜像和format-2 镜像。然而,分层特性(COW 克隆特性)只支持format-2类型的RBD镜像。默认的RBD镜像类型为format-1。
(没了解过为什么。format有1,2两种,没研究具体差别)
克隆之前需要对快照进行保护。
rbd snap protect pool2/disk1@snap1
从受保护的快照克隆新的img。
rbd clone pool2/disk1@snap1 pool2/diskclone1
克隆出来的img查看详情,可以发现多了一个parent参数:
且可以看到不写入新数据的情况下,该img的使用量是0:
这也是克隆之前要protect快照的原因,也就是所谓的快照分层,这个新的img依赖于快照,如果不对快照做保护,删除快照后这些img都无法正常使用了。
rbd flatten pool2/newclone2
通过flatten可以将克隆出来的img进行独立(拍平),也就是将父img中的数据写入(随着数据量的增长耗时越长),独立后就可以对快照解除保护进行删除操作,因为不再依赖于快照中的数据。
克隆出来的img包含了父块的文件以及文件系统,map之后不用再做文件系统,直接挂载即可;
但是挂载中遇到了问题,克隆出来的img无法再挂载:
[root@node1 cstrbd1]# mount /dev/rbd1 /root/cstrbd2
mount: /root/cstrbd2: wrong fs type, bad option, bad superblock on /dev/rbd1, missing codepage or helper program, or other error.
克隆出来的img和源img,做map生成的块的uuid始终是相同的(这里很奇怪,后面再去看看源码这块的处理逻辑)
想要挂载所有的这些块设备,就需要重新生成uuid烧录到对应的dev:
[root@node1 ~]# uuidgen
2dbffbb6-7c2f-4e3b-ae0b-7f0dda1b8008
[root@node1 ~]# xfs_admin -U 2dbffbb6-7c2f-4e3b-ae0b-7f0dda1b8008 /dev/rbd5
Clearing log and setting UUID
writing all SBs
new UUID = 2dbffbb6-7c2f-4e3b-ae0b-7f0dda1b8008