Ceph支持一个非常好的特性,以COW(写时复制)的方式从RBD快照创建克隆,在Ceph中被称为快照分层。分层特性允许用户创建多个CEPH RBD克隆实例。这些特性应用于OpenStack等云平台中

,使用快照形式保护ceph RBD 镜像,快照是只读的,但COW克隆是完全可以写 ,可以多次来孵化实例,对云平台来说是非常有用的。


    Ceph RBD镜像有format-1  和 format-2两种类型,RBD支持这两种类型,但是分层特性COW克隆特性只支持format-2镜像,默认RBD创建的镜像是format-1。


ceph snap几个主要命令

ceph snap create (snap add)      Create a snapshot.

    snap list (snap ls)         Dump list of p_w_picpath snapshots.

    snap protect                Prevent a snapshot from being deleted.

    snap purge                  Deletes all snapshots.

    snap remove (snap rm)       Deletes a snapshot.

    snap rename                 Rename a snapshot.

    snap rollback (snap revert) Rollback p_w_picpath to snapshot.

    snap unprotect              Allow a snapshot to be deleted.


一、创建RBD镜像实例:

1、在pool1上创建一个RBD镜像,不使用-p 默认在rbd存储池上创建

[root@node2 ~]# rbd create rbd1 -p pool1 --size 5G --p_w_picpath-format 1

rbd: p_w_picpath format 1 is deprecated


查看创建结果,使用-p指定存储池

[root@node2 ~]# rbd list -p pool1

rbd1

[root@node2 ~]# rbd info --p_w_picpath pool1/rbd1

rbd p_w_picpath 'rbd1':

    size 5120 MB in 1280 objects

    order 22 (4096 kB objects)

    block_name_prefix: rb.0.15d23.238e1f29

    format: 1


2、映射块设备

[root@node2 ~]# rbd map --p_w_picpath pool1/rbd1

/dev/rbd3


 查看映射的块设备

[root@node2 ~]# rbd showmapped

id pool  p_w_picpath         snap device   

0  rbd   block-device1 -    /dev/rbd0

1  rbd   block-device3 -    /dev/rbd1

2  rbd   block-device4 -    /dev/rbd2

3  pool1 rbd1          -    /dev/rbd3


3、挂载文件系统使用

[root@node2 ~]# mkfs.xfs /dev/rbd3

meta-data=/dev/rbd3              isize=256    agcount=9, agsize=162816 blks

         =                       sectsz=512   attr=2, projid32bit=1

         =                       crc=0        finobt=0

data     =                       bsize=4096   blocks=1310720, imaxpct=25

         =                       sunit=1024   swidth=1024 blks

naming   =version 2              bsize=4096   ascii-ci=0 ftype=0

log      =internal log           bsize=4096   blocks=2560, version=2

         =                       sectsz=512   sunit=8 blks, lazy-count=1

realtime =none                   extsz=4096   blocks=0, rtextents=0


[root@node2 ~]# mkdir /mnt/rbd3

[root@node2 ~]# mount /dev/rbd3 /mnt/rbd3

[root@node2 ~]# mount | grep rbd3

/dev/rbd3 on /mnt/rbd3 type xfs (rw,relatime,attr2,inode64,sunit=8192,swidth=8192,noquota)

[root@node2 ~]# touch /mnt/rbd3/test

[root@node2 ~]# ls /mnt/rbd3/

test


4、创建快照

[root@node2 ~]# rbd snap create pool1/rbd1@snapshot1

[root@node2 ~]# rbd snap ls pool1/rbd1

SNAPID NAME         SIZE

     4 snapshot1 5120 MB


5、在rbd3目录下创建文件test1

[root@node2 ~]# touch /mnt/rbd3/test1

[root@node2 ~]# ls /mnt/rbd3/

test  test1


6、恢复rbd1的快照

[root@node2 ~]# rbd snap rollback pool1/rbd1@snapshot1

Rolling back to snapshot: 100% complete...done.

语法:rbd snap rollback /@ 


7、重新挂载文件系统,发现已经恢复到之前的状态了

[root@node2 ~]# umount /mnt/rbd3

[root@node2 ~]# mount /dev/rbd3 /mnt/rbd3/

[root@node2 ~]# ls /mnt/rbd3/

test

[root@node2 ~]#


8、不再使用镜像时可以删除掉镜像

[root@node2 ~]# rbd snap rm pool1/rbd1@snapshot1

[root@node2 ~]# rbd snap ls pool1/rbd1

语法:rbd snap rm /@


9、删除多个快照

[root@node2 ~]# rbd snap purge pool1/rbd1

语法:rbd snap purge /


二、使用RBD克隆

创建rbd2,类型为format2的RBD镜像

[root@node2 ~]# rbd create rbd2 --size 10240 --p_w_picpath-format 2

[root@node2 ~]# rbd info --p_w_picpath rbd2

rbd p_w_picpath 'rbd2':

    size 10240 MB in 2560 objects

    order 22 (4096 kB objects)

    block_name_prefix: rbd_data.15821238e1f29

    format: 2

    features: layering, exclusive-lock, object-map, fast-diff, deep-flatten

    flags:


创建RBD镜像快照

[root@node2 ~]# rbd snap create rbd/rbd2@snapshot1

[root@node2 ~]# rbd snap ls rbd/rbd2

SNAPID NAME          SIZE

     7 snapshot1 10240 MB


创建COW镜像前先要保护这个快照,这是非常重要的一步

[root@node2 ~]# rbd snap protect rbd/rbd2@snapshot1

通过快照创建一个克隆的RBD镜像


[root@node2 ~]# rbd clone rbd/rbd2@snapshot1 rbd/clone_rbd2

[root@node2 ~]# rbd info --p_w_picpath rbd/clone_rbd2

rbd p_w_picpath 'clone_rbd2':

    size 10240 MB in 2560 objects

    order 22 (4096 kB objects)

    block_name_prefix: rbd_data.15c1b3d1b58ba

    format: 2

    features: layering, exclusive-lock, object-map, fast-diff, deep-flatten

    flags:

    parent: rbd/rbd2@snapshot1

    overlap: 10240 MB


创建克隆好了一个依赖于父镜像快照的RBD镜像后,为了让这个克隆的RBD镜像独立于父镜像,我们需要将父镜像的信息合并flattern到子镜像,一旦合并完成,RBD镜像和它的父镜像就不会存在任何关系了。

使用flatten合并

[root@node2 ~]# rbd flatten rbd/clone_rbd2

Image flatten: 100% complete...done.


合并完成后,查看这个镜像信息,发现父镜像/快照名字不存大了

[root@node2 ~]# rbd info --p_w_picpath clone_rbd2

rbd p_w_picpath 'clone_rbd2':

    size 10240 MB in 2560 objects

    order 22 (4096 kB objects)

    block_name_prefix: rbd_data.15c1b3d1b58ba

    format: 2

    features: layering, exclusive-lock, object-map, fast-diff, deep-flatten

    flags:

[root@node2 ~]#


如果你不再使用父镜像,可以先移除它的保护状态,再删除它

[root@node2 ~]# rbd snap unprotect rbd/rbd2@snapshot1

[root@node2 ~]# rbd snap rm rbd/rbd2@snapshot1