Ceph 存储集群可以从RBD的快照中创建写时复制 (COW 副本),这就是 Ceph 的快照分层。 Ceph 的这个分层特性允许客户端创建 Ceph RBD 的多个即时副本, 这个特性对云平台和虚拟化平台非常有 ,例如 OpenStack 、CloudStack 和Qemu/ KVM 这些平台通常'以快照的形式保护含有 OS/VM 镜像的Ceph RBD 镜像 ,然后通过不断复制这个快照来创建新的虚拟机 /实例 ,快照是只读的,但是 COW 副本则是完全可写的; Ceph 的这个特性为云平台带来巨大的灵活性,并且对于云平台非常有用,下图显示了 RADOS 块设备、 RBD 快照和COW 快照副本之间的关系。

每一个复制的镜像(子镜像)都包含它的父快照的引用,用于读取镜像数据。 因此,父快照在用于复 制之前应该处于被保护状态。当有数据写入COW 复制的镜像时,它会为自己存储新的数据引用。 COW 复制的镜像与 RBD是一 样的。

它们都非常灵活,类似于 RBD ,也就是说,它们可写, 可调整容量,可以创建新的快照,将来还可以复制。

RBD 镜像的类型定义了它所支持的特性,在Ceph 中,有两种 类型的RBD 镜像:format-l和 form t-2, format-l和 format-2 类型的 RBD 镜像 都支持快 照特性。然而,分层特性( 也就是 COW 特性)只有 format-2 类型 RBD 镜像支持, RBD 镜像 默认类型是format-l。

(1)首先创建一个format2类型的RBD镜像,然后创建快照,保护快照,最后使用该快照创建一个COW副本。

[root@node140 /]# rbd create rbd_copy1 --size 10240 --image-format 2
[root@node140 /]# rbd ls 
rbd_copy1

(2)创建该镜像的快照

[root@node140 /]# rbd snap create rbd/rbd_copy1@snap_for_clone
[root@node140 /]# rbd snap ls rbd/rbd_copy1
SNAPID NAME           SIZE   PROTECTED TIMESTAMP                
     8 snap_for_clone 10 GiB           Wed Aug 28 17:27:10 2019 

(3)要创建COW副本,先要将快照置于保护状态,这个步骤很重要,我们应该保护该快照,因为如果删除该快照,所有连接到它的COW副本都将被销毁。 [root@node140 /]# rbd snap protect rbd/rbd_copy1@snap_for_clone

(4)复制快照需要父存储池,RBD镜像及快照的名称。 [root@node140 /]# rbd clone rbd/rbd_copy1@snap_for_clone rbd/rbd_copy2

(5)创建副本速度非常快,创建完成后,查看新镜像的信息,发现他的父池、镜像,以及快照的信息都会显示出来。

[root@node140 /]# rbd --pool rbd --image rbd_copy2 info 
rbd image 'rbd_copy2':
	size 10 GiB in 2560 objects
	order 22 (4 MiB objects)
	snapshot_count: 0
	id: 1735e1f84c868
	block_name_prefix: rbd_data.1735e1f84c868
	format: 2
	features: layering, exclusive-lock, object-map, fast-diff, deep-flatten
	op_features: 
	flags: 
	create_timestamp: Wed Aug 28 17:33:38 2019
	access_timestamp: Wed Aug 28 17:33:38 2019
	modify_timestamp: Wed Aug 28 17:33:38 2019
	parent: rbd/rbd_copy1@snap_for_clone   ##依赖父镜像
	overlap: 10 GiB

(6)到这里已经克隆了一个RBD镜像,基于其父镜像的快照,但现在不是独立的,还依赖于父镜像,要不依赖于父镜像,需要扁平化该镜像,其中会从父镜像的快照中复制数据到子镜像中。扁平化过程所需要的时间域镜像中的数据大小相同,扁平化过后无任何依赖,完全独立。

[root@node140 /]# rbd flatten rbd/rbd_copy2
Image flatten: 100% complete...done.
[root@node140 /]# rbd --pool rbd --image rbd_copy2 info 
rbd image 'rbd_copy2':
	size 10 GiB in 2560 objects
	order 22 (4 MiB objects)
	snapshot_count: 0
	id: 1735e1f84c868
	block_name_prefix: rbd_data.1735e1f84c868
	format: 2
	features: layering, exclusive-lock, object-map, fast-diff, deep-flatten
	op_features: 
	flags: 
	create_timestamp: Wed Aug 28 17:33:38 2019
	access_timestamp: Wed Aug 28 17:33:38 2019
	modify_timestamp: Wed Aug 28 17:33:38 2019

(7)如果要删除父镜像快照,先去保护,然后删除

[root@node140 /]# rbd snap unprotect rbd/rbd_copy1@snap_for_clone
[root@node140 /]# rbd snap rm rbd/rbd_copy1@snap_for_clone
Removing snap: 100% complete...done.

注释:引用《ceph分布式存储学习指南》进行学习和实践