之前一直对snapshot和clone概念不清,看了ceph这个文档,才了解其中端倪。简言之,snapshot是特定时间镜像(这里镜像是指ceph的image)的静态拷贝,而clone是对snapshot的copy on write的再拷贝。通常snapshot只读,clone可以正常读写。Ceph通过rbd命令直接支持snapshot,也通过snapshot layering技术,支持对snapshot的clone。
(一)snapshot
在snapshot之前,原始镜像需停止I/O动作,以保证数据一致性。然后执行rbd命令。由于rbd命令要带一堆固定参数,因此我做了个别名:
alias myrbd='rbd -m 172.17.6.176 -k /home/ceph/my-cluster/ceph.client.admin.keyring -c /home/ceph/my-cluster/ceph.conf'
假设已经有一个镜像名为foo,位于–pool rbd里,那么创建foo的snapshot:
myrbd snap create rbd/foo@snapfoo
后面的snapfoo是snapshot的名字,可以是任何名。
查看某个镜像的全部snapshots:
myrbd snap ls rbd@/foo
回滚一个snapshot:
myrbd snap rollback rbd/foo@snapfoo
请注意:这个过程很慢,如果镜像大,那么过程很久。推荐的做法是clone某个版本的snapshot,而不是rollback.
删除一个snapshot:
myrbd snap rm rbd/foo@snapfoo
删除某个镜像的全部snapshots:
myrbd snap purge rbd/foo
(二)clone
snapshot layering允许ceph的块设备客户端快速创建镜像。例如,对于一个已有镜像(比如某个运行了linux VM的块设备),先snapshot这个镜像,再保护好这个snapshot,再对它创建许多copy-on-write的clone。
每个clone的镜像(child)存储到父镜像(snapshot)的引用,允许子镜像从父镜像读取数据。clone的镜像跟其他正常的块设备镜像使用形式一样,你可以读写、resize它,对clone镜像没有特别限制。不过对父镜像,在使用之前你必须先保护它。
Note: Ceph only supports cloning for format 2 images (i.e., created with rbd create –format 2), and is not yet supported by the kernel rbd module. So you MUST use QEMU/KVM or librbd directly to access clones in the current release.
请注意上述陈述,只有COW2格式的image才支持clone,而ceph客户端自带的rbd内核模块并不支持COW2,必须用QEMU/KVM或librbd来访问ceph。
如果只用rbd,如下操作是成功的:
myrbd create bar --size 1024 --image-format 2
但这个镜像无法map:
sudo myrbd map bar --pool rbd rbd: add failed: (6) No such device or address
所以,需使用QEMU/KVM或librbd创建image并map好,再调用rbd snap create创建snapshot,然后保护这个snapshot:
myrbd snap protect rbd/bar@barsnap
bar是COW2格式的镜像名,barsnap是snapshot名字。
clone这个snapshot:
myrbd clone rbd/bar@barsnap rbd/bar-cloned-1
因为是copy on write,这个过程非常快。新生成的镜像是bar-cloned-1.
可以在一个pool里只包含配置模板snapshots,在另一个pool里包含生产用的clones.
列举某个snapshot有多少个clones:
myrbd snap children rbd/bar@barsnap
删除某个子镜像指向父镜像的引用:
myrbd flatten rbd/bar-cloned-1
这样把父snapshot的所有数据都拷贝到子镜像,这也会增大子镜像的存储空间。
挺不错的笔记;顶一下 我在Debian7.5, kernel 3.14, Firefly0.80.4下测试
root@ceph-admin:~# rbd -p pool-A create testimagev2 –size=1024 –image-format=2
root@ceph-admin:~# rados ls -p pool-A
rbd_header.15482ae8944a
rbd_directory
rbd_id.testimagev2
root@ceph-admin:~# rbd map testimagev2 -p pool-A
可直接map format 2的image。
是不是说明 kernel 3.14 已经支持了内核的rbd模块,已经支持了format 2的读取和支持了。