使用 RBD 的增量快照
虽然 Ceph 有着广泛的应用场景,但我们目前看到的最常见应用是作为 OpenStack、CloudStack、Eucalyptus 和 OpenNebula 管理的公有和私有云的数据存储块设备。 这意味着我们经常会收到关于地理复制、备份和灾难恢复(或这些主题之间的一些组合)等问题的咨询。 虽然一个功能完善、强大的地理复制解决方案目前正在制定中,但已经有许多不同的方法在尝试中(例如,Sebastien Han 的 使用 DRBD 的设置 或即将推出的 使用 RGW)。
然而,由于云管理的主要重点之一是镜像的操作,因此灾难恢复和通用备份的解决方案通常可以非常简单。 增量快照可以很好地满足这些以及其他角色。 因此,我想与大家分享一些来自 RBD 开发人员 Josh Durgin 的想法,以供那些可能错过了他在几周前 OpenStack Developer Summit 上的 精彩演讲 的人参考。
为了灾难恢复的目的,想法是可以在不同的地理位置运行两个同时的 Ceph 集群,并且每次不必复制新的快照,而是简单地生成并传输一个 delta。 命令如下所示
rbd export-diff --from-snap snap1 pool/image@snap2 pool_image_snap1_to_snap2.diff
这将创建一个简单的二进制文件,其中存储以下信息
- 原始快照名称(如果适用)
- 结束快照名称
- 结束快照时镜像的大小
- 快照之间的差异
此文件的格式可以在 RBD 文档 中看到。
导出差异后,您可以简单地将文件备份到某个离线位置,或将差异导入到远程 Ceph 集群上的现有镜像中。
rbd import-diff /path/to/diff backup_image
这将把差异内容写入备份镜像并创建一个与原始结束快照同名的快照。 如果已存在具有此名称的快照,则导入将失败且不执行任何操作。 由于重写相同的数据是幂等的,因此在导入差异的过程中被中断是安全的。
这些命令也可以使用 stdin 和 stdout,因此您可以执行类似的操作
rbd export-diff --from-snap snap1 pool/image@snap2 - | ssh user@second_cluster rbd import-diff - pool2/image
您可以通过以下方式查看更改的 extent(以纯文本、json 或 xml 格式)
rbd diff --from-snap snap1 pool/image@snap2 --format plain
但是,当前实现中存在一些限制。
- 无法保证您正在将差异导入到正确的状态的镜像上(即与导出差异的镜像和快照相同的镜像和快照)。
- 无法检查差异文件以查看它们引用了哪些快照,因此您必须依赖文件名包含该信息。
虽然实现仍然相对简单,但您可以看出这对于管理云镜像以及任何 Ceph 块设备都可能非常有用。 此功能随最近的 ‘cuttlefish’ 稳定版本发布,但如果您有任何问题或增强请求,请告诉我们。
要了解有关未来 Ceph 版本中即将推出的一些新功能,您可以查看 Inktank 计划贡献的当前 已发布的路线图。 此外,如果您错过了虚拟 Ceph Developer Summit,则已发布视频以供查看。 同时,如果您有任何问题、意见或任何对事业有益的事情,请随时访问我们的 irc 频道或向其中一个 邮件列表发送说明。
scuttlemonkey 结束
