Ceph支持为块设备快照创建许多写时复制COW克隆。快照分层使Ceph块设备客户端能够非常快速的创建映射。
例如,我们创建一个块设备镜像,其中写入一个Linux,然后对镜像进行快照、保护快照并创建写时克隆。快照是只读的,写入将写入到新的位置,进行快速克隆。
- 完整克隆
- 快速克隆 (快速克隆使用的就是写时复制)
每个克隆镜像子级存储是对父级镜像的引用,子级会读取父级别的数据:
COW克隆和Ceph块设备完全相同,可以进行读取、写入和调整镜像大小。克隆镜像没用特殊限制。但是,写时复制克隆是指快照,因此必须在克隆快照之前对其保护。
Ceph目前只支持format 2镜像的克隆,内核rbd create --image-format 2
还不支持。rbd因此必须使用QEMU/KVM
或者librbd
直接访问版本中的克隆。
RBD分层概念
Ceph块设备分层是一个简单的过程,首先我们必须创建镜像的快照,并且需要保护快照,保护完成就可以开始克隆快照
克隆的镜像有对父快照的引用,包括池ID、镜像ID和快照ID。
镜像模板
: 块设备分层的一个常见用例是创建一个主镜像和一个用做克隆模板的快照。扩展模板
: 提供比基础镜像更多的信息,例如用户可以克隆镜像并按照其他软件,然后对扩展镜像进行快照,该扩展镜像本身可以更新就像基本镜像一样。模板池
: 使用块设备分层的一个方法是创建一个pool,其中包含充当模板的主镜像以及这些模板的快照。然后可以将只读权限扩展到用户,以便可以直接克隆快照,但是无法在pool中写入和执行。镜像迁移/恢复
: 使用块设备分层的一个方法是将数据从一个pool迁移或者恢复到另一个pool中。
RBD快照保护
如果用户不小心删除了父快照,所有的克隆都会中断。为了防止克隆的镜像丢失,必须保护快照才可以进行克隆。
# 为了演示数据,创建一个新的镜像,大小为10G
# rbd create kubernetes/ceph-temp.img --size 10G
# rbd -p kubernetes ls
ceph-temp.img
...
下面为镜像制作一个快照
# rbd snap create kubernetes/ceph-temp.img@temp # 创建名称为temp的快照
# rbd snap ls kubernetes/ceph-temp.img # 查看一下快照
SNAPID NAME SIZE PROTECTED TIMESTAMP
8 temp 10 GiB Thu Mar 10 15:03:39 2022
制作完快照后,我们将快照保护起来
# rbd snap protect kubernetes/ceph-temp.img@temp # 通过protect保护
# rbd snap rm kubernetes/ceph-temp.img@temp # 这里我们就可以看到,已经无法删除了
Removing snap: 0% complete...failed.
rbd: snapshot 'temp' is protected from removal.
2022-03-10 15:06:10.564 7f39f6a09c80 -1 librbd::Operations: snapshot is protected
取消保护,如果我们想取消保护,可以通过unproject
参数
# rbd snap unprotect kubernetes/ceph-temp.img@temp
RBD克隆快照
这会我们的父镜像已经制作好了,开始克隆子镜像
克隆可以选择pool,可以和父镜像不在一个pool中
# rbd clone kubernetes/ceph-temp.img@temp kubernetes/ceph-test-01.img
# rbd clone kubernetes/ceph-temp.img@temp kubernetes/ceph-test-02.img
# rbd clone kubernetes/ceph-temp.img@temp kubernetes/ceph-test-03.img
查看克隆后的镜像
# rbd -p kubernetes ls
ceph-temp.img
ceph-test-01.img #这里就是我们刚刚克隆完毕的
ceph-test-02.img
ceph-test-03.img
挂载测试,因为里面没有数据实际上挂载的都一样
# rbd device map kubernetes/ceph-test-01.img #将rbd文件映射到本地
/dev/rbd1
# mkdir /mnnt # 创建挂载目录
# mkfs.ext4 /dev/rbd1 # 因为我们是新建的镜像,需要做格式化操作,我们可以将格式化后的状态在做一个快照,在重新保护起来使用
# mount /dev/rbd1 /mnnt
# ls /mnnt/
lost+found
RBD取消父级依赖
使用flatten取消依赖关系,此时我们在删除temp模板镜像,下面的ceph-test-03
就不受影响。
使用children查看当前快照下面创建的镜像:
# rbd children kubernetes/ceph-temp.img@temp
kubernetes/ceph-test-01.img
kubernetes/ceph-test-02.img
kubernetes/ceph-test-03.img
执行flatten取消父级依赖,默认就会修改为完整克隆
# rbd flatten kubernetes/ceph-test-03.img
Image flatten: 100% complete...done.