关于Ceph的snapshot和clone

之前一直对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。

snapshot

每个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的所有数据都拷贝到子镜像,这也会增大子镜像的存储空间。

此条目发表在Common分类目录,贴了, 标签。将固定链接加入收藏夹。

关于Ceph的snapshot和clone》有一条回应

  1. soneedu说:

    挺不错的笔记;顶一下 我在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的读取和支持了。

评论已关闭。