快照

快照是特定时间点图像状态的只读副本。Ceph块设备的高级功能之一是,您可以创建图像的快照以保留图像状态的历史记录。建议在拍摄映像快照之前停止I/O。

创建快照
#语法:
rbd snap create {pool-name}/{image-name}@{snap-name}

#举例:
[ceph@ceph06 ~]$ rbd create --size 1024 images/bar
[ceph@ceph06 ~]$ rbd ls images
bar
[ceph@ceph06 ~]$ rbd snap create images/bar@bar-sna01
列出快照
#语法:
rbd snap ls {pool-name}/{image-name}

#举例:
[ceph@ceph06 ~]$ rbd snap ls images/bar
SNAPID NAME      SIZE  PROTECTED TIMESTAMP
     4 bar-sna01 1 GiB           Tue May 12 05:36:28 2020
回滚快照
#语法:
rbd snap rollback {pool-name}/{image-name}@{snap-name}

#举例:
[ceph@ceph06 ~]$ rbd snap rollback images/bar@bar-sna01
Rolling back to snapshot: 100% complete...done.
删除快照
#语法:
rbd snap rm {pool-name}/{image-name}@{snap-name}

#举例:
[ceph@ceph06 ~]$ rbd snap rm images/bar@bar-sna01
Removing snap: 100% complete...done.
清除快照
#语法:
rbd snap purge {pool-name}/{image-name}             #删除镜像的所有快照

#举例:
[ceph@ceph06 ~]$ rbd snap create images/bar@bar-`date "+%Y-%m-%d-"`  
[ceph@ceph06 ~]$ rbd snap create images/bar@bar-`date "+%Y-%m-%d-02"`
[ceph@ceph06 ~]$ rbd snap ls images/bar
SNAPID NAME              SIZE  PROTECTED TIMESTAMP
    12 bar-2020-05-12-   1 GiB           Tue May 12 05:46:26 2020 
    13 bar-2020-05-12-02 1 GiB           Tue May 12 05:46:35 2020 
[ceph@ceph06 ~]$ rbd snap purge images/bar
Removing all snapshots: 100% complete...done.
[ceph@ceph06 ~]$ rbd snap ls images/bar
[ceph@ceph06 ~]$

分层

Ceph支持创建块设备快照的许多写时复制(COW)克隆的功能。快照分层使Ceph块设备客户端可以非常快速地创建图像。例如,您可以创建一个写入了Linux VM的块设备映像。然后,对映像进行快照,保护快照,并根据需要创建尽可能多的写时复制克隆。快照是只读的,因此克隆快照可以简化语义,从而可以快速创建克隆。

每个克隆的映像(子级)都存储对其父映像的引用,这使克隆的映像可以打开父快照并读取它。

快照的COW克隆的行为与任何其他Ceph块设备映像完全相同。您可以读取,写入,克隆和调整克隆图像的大小。克隆图像没有特殊限制。但是,快照的写时复制克隆引用快照,因此在克隆快照之前必须保护快照。

注意:Ceph仅支持克隆格式为format 2的镜像,从内核3.10开始,内核客户端支持克隆的映像。rbd create –image-format 2(n版的rbd默认就是format 2)

Ceph块设备分层是一个简单的过程。您必须有一个镜像。您必须创建镜像的快照。您必须保护快照。完成这些步骤后,即可开始克隆快照,如下图:

  • 映像模板:块设备分层的一个常见用例是创建一个主映像和一个快照,以用作克隆的模板。例如,用户可以为Linux发行版(例如Ubuntu 12.04)创建映像,并为其创建快照。周期性地,用户可更新映像,并创建新的快照(例如,,, 随后)。随着映像的更新,用户可以克隆任何快照。

  • 扩展模板:一个更高级的用例包括扩展一个模板映像,该模板映像提供的信息比基本图像更多。例如,用户可以克隆映像(例如,VM模板)并安装其他软件(例如,数据库,内容管理系统,分析系统等),然后快照扩展的映像,该映像本身可以被更新就像基本映像一样

  • 映像迁移/恢复:使用块设备分层的一种方法是将数据从一个池迁移或恢复到另一个池。

保护快照
#语法:
rbd snap protect {pool-name}/{image-name}@{snapshot-name}

#举例:
[ceph@ceph06 ~]$ rbd snap create images/bar@bar-`date "+%Y-%m-%d"`       #创建一个映像
[ceph@ceph06 ~]$ rbd snap protect images/bar@bar-2020-05-12
克隆快照

要克隆快照,请指定您需要指定父池,映像和快照。以及子池和映像名称。在克隆快照之前,必须保护快照。

#语法:
rbd clone {pool-name}/{parent-image}@{snap-name} {pool-name}/{child-image-name}

#举例:
[ceph@ceph06 ~]$ rbd clone images/bar@bar-2020-05-12 rbd/new-bar
列出快照子级
#语法:
rbd children {pool-name}/{image-name}@{snapshot-name}

#举例:
[ceph@ceph06 ~]$ rbd children images/bar@bar-2020-05-12
rbd/new-bar
取消保护快照
#语法:
rbd snap unprotect {pool-name}/{image-name}@{snapshot-name}

#举例:
[ceph@ceph06 ~]$ rbd snap unprotect images/bar@bar-2020-05-12
flatten克隆的映像

克隆的映像保留对父快照的引用。当从子克隆删除对父快照的引用时,可以父镜像的信息合并flattern到子镜像中。flatten克隆所需的时间随快照的大小而增加。要删除快照,必须先flatten子映像。

#语法:
rbd flatten {pool-name}/{image-name}

#举例:
[ceph@ceph06 ~]$ rbd info new-bar
rbd image 'new-bar':
        size 1 GiB in 256 objects
        order 22 (4 MiB objects)
        snapshot_count: 0
        id: 2d43b3e9e477e
        block_name_prefix: rbd_data.2d43b3e9e477e
        format: 2
        features: layering, exclusive-lock, object-map, fast-diff, deep-flatten
        op_features: 
        flags: 
        create_timestamp: Tue May 12 07:05:32 2020
        access_timestamp: Tue May 12 07:05:32 2020
        modify_timestamp: Tue May 12 07:05:32 2020
        parent: images/bar@bar-2020-05-12                 #info时这里可以看到对父映像快照的依赖
        overlap: 1 GiB
[ceph@ceph06 ~]$ rbd flatten rbd/new-bar                  #flatten后,删除父镜像都不影响克隆过来的镜像了
Image flatten: 100% complete...done.
[ceph@ceph06 ~]$ rbd info new-bar
rbd image 'new-bar':
        size 1 GiB in 256 objects
        order 22 (4 MiB objects)
        snapshot_count: 0
        id: 2d43b3e9e477e
        block_name_prefix: rbd_data.2d43b3e9e477e
        format: 2
        features: layering, exclusive-lock, object-map, fast-diff, deep-flatten
        op_features:
        flags:
        create_timestamp: Tue May 12 07:05:32 2020
        access_timestamp: Tue May 12 07:05:32 2020
        modify_timestamp: Tue May 12 07:05:32 2020

实时迁移

RBD映像可以在同一群集内的不同池之间或不同映像格式和布局之间实时迁移。启动后,源映像将被深度复制到目标映像,提取所有快照历史记录,并有选择地保留到源映像的父级的任何链接。

使用新的目标映像时,此复制过程可以在后台安全地运行。当前需要在准备迁移之前暂时停止使用源映像。这有助于确保使用该映像的客户端已更新为指向新的目标映像。(注:映像实时迁移需要Ceph Nautilus版本或更高版本)

准备迁移
#语法:
rbd migration prepare migration_source [migration_target]

#举例,这里把rbd池内的foo-new映像迁移至images池内并更改映像名为foo:
[ceph@ceph06 ~]$ rbd ls
foo-new
new-bar
[ceph@ceph06 ~]$ rbd ls images
[ceph@ceph06 ~]$ rbd migration prepare foo-new images/foo              #准备迁移
[ceph@ceph06 ~]$ rbd status images/foo                                 #显示实时迁移的当前状态
Watchers: none
Migration:
        source: rbd/foo-new (2d1fe6de70f1f)
        destination: images/foo (2d5ac9df41554)
        state: prepared
[ceph@ceph06 ~]$ rbd info foo-new           #rbd池内是找不到源映像,因为源映像将被移至RBD回收站,以避免在迁移过程中错误使用
rbd: error opening image foo-new: (2) No such file or directory
[ceph@ceph06 ~]$ rbd trash ls --all
2d1fe6de70f1f foo-new
执行迁移

准备实时迁移后,必须将源图像中的图像块复制到目标图像中

#语法:
rbd migration execute migration_target

#举例:
[ceph@ceph06 ~]$ rbd migration execute images/foo     #执行迁移
Image migration: 100% complete...done.
[ceph@ceph06 ~]$ rbd status images/foo
Watchers: none
Migration:
        source: rbd/foo-new (2d1fe6de70f1f)
        destination: images/foo (2d5ac9df41554)
        state: executed
提交迁移

实时迁移完成将所有数据块从源映像深度复制到目标后,即可提交迁移:

#语法
rbd migration commit migration_target

#举例:
[ceph@ceph06 ~]$ rbd migration commit images/foo             #提交迁移
Commit image migration: 100% complete...done.
#注:如果migration_source映像是一个或多个克隆的父映像,则 在确保所有后代克隆映像均未使用后,需要指定–force选项。
[ceph@ceph06 ~]$ rbd trash ls --all      #进行实时迁移将删除源图像和目标图像之间的交叉链接,并删除源图像
[ceph@ceph06 ~]$

中止迁移

如果要还原准备或执行步骤,请运行rbd migration abort 命令以还原迁移过程,下面通过一个例子说明:

[ceph@ceph06 ~]$ rbd ls
new-bar
[ceph@ceph06 ~]$ rbd migration prepare new-bar bar
[ceph@ceph06 ~]$ rbd trash ls --all
2d43b3e9e477e new-bar
[ceph@ceph06 ~]$ rbd migration execute bar
Image migration: 100% complete...done.
[ceph@ceph06 ~]$ rbd trash ls --all
2d43b3e9e477e new-bar
[ceph@ceph06 ~]$ rbd ls
bar
[ceph@ceph06 ~]$ rbd migration abort bar         #终止迁移
Abort image migration: 100% complete...done.
[ceph@ceph06 ~]$ rbd trash ls --all              #映像从回收站还原到原映像所在的池内
[ceph@ceph06 ~]$ rbd ls
new-bar

RBD持久缓存

共享的只读父映像缓存

从父母那里克隆的RBD图像通常只修改图像的一小部分。例如,在VDI工作负载中,虚拟机是从相同的基本映像克隆的,最初只是主机名和IP地址不同。在引导阶段,所有这些VM将从RADOS群集重新读取部分重复的父映像数据。如果我们有父映像的本地缓存,这将有助于加快一台主机上的读取过程,并将客户端保存到群集网络流量中。RBD共享只读父映像缓存需要显式启用在 ceph.conf。该ceph-immutable-object-cache守护程序负责将父内容缓存在本地磁盘上,以后将通过本地缓存为该数据提供读操作。
启用RBD共享只读父映像缓存,需要在ceph.conf文件的[client] 部分中添加以下Ceph设置
rbd parent cache enabled = true

该ceph-immutable-object-cache守护程序负责其本地缓存目录中的高速缓存父图像内容。为了获得更好的性能,建议使用SSD作为基础存储。

守护程序的关键组件是:

基于域套接字的IPC:守护程序在启动时将侦听本地域套接字,并等待来自librbd客户端的连接。

基于LRU的升级/降级策略:守护程序将维护每个缓存文件上缓存命中的内存中统计信息。如果容量达到配置的阈值,它将降级冷缓存。

基于文件的缓存存储:守护程序将维护一个基于文件的简单缓存存储。升级时,将从DOS群集中获取RADOS对象,并将其存储在本地缓存目录中。

打开每个克隆的rbd映像时,librbd将尝试通过其域套接字连接到缓存守护程序。如果连接成功, librbd则在后续读取时将自动检查守护程序。如果存在未缓存的读取,则守护程序会将RADOS对象提升为本地缓存目录,因此将从本地文件提供对该对象的下一次读取。该守护程序还维护简单的LRU统计信息,因此,如果没有足够的容量,它将删除一些冷缓存文件。

以下是一些与以下设置对应的重要缓存选项:

  • immutable_object_cache_path 不可变对象缓存数据目录。

  • immutable_object_cache_max_size 不可变缓存的最大大小。

  • immutable_object_cache_watermark缓存的水印。如果容量达到此水印,则守护程序将根据LRU统计信息删除冷缓存。

ceph-immutable-object-cache守护程序应使用唯一的Ceph用户ID。要创建Ceph用户,请ceph指定 命令,用户名,监视器大小写和OSD大小写:auth get-or-create

ceph auth get-or-create client.ceph-immutable-object-cache.{unique id} mon 'allow r' osd 'profile rbd-read-only'

该ceph-immutable-object-cache守护进程可以通过管理systemd通过指定用户ID作为守护程序实例:

systemctl enable ceph-immutable-object-cache@immutable-object-cache.{unique id}

配置设置(librbd)

请参考:
https://docs.ceph.com/docs/master/rbd/rbd-config-ref/

文档更新时间: 2020-05-13 16:57   作者:子木