作者: 李航(滴滴基础平台技术专家)
编辑: 小君君(才云)
Ceph RBD 是 Ceph 的 RADOS 块设备。RBD 块存储是最稳定且最常用的存储类型,它类似磁盘可以被挂载。RBD 块设备具有快照、多副本、克隆和一致性等特点,数据以条带化的方式存储在 Ceph 集群的多个 OSD 中。本文的作者是滴滴基础平台技术专家李航,在这篇文章中,他将对 3 种 Ceph RBD 灾备方案展开介绍,并从它们的实现原理、操作命令、性能优缺等方面进行全面分析,为大家在生产中选择最佳灾备方案提供建议。
通过本文你将了解到:
-
业内灾备方案
-
Snapshot
-
Ceph BackUp
-
RBD Mirroring
-
方案对比
-
总结
业内灾备方案
1. Snapshot
1.1 介绍
Cluster A&B 是独立的 Ceph 集群,通过 RBD 的 Snapshot 机制,在 Cluster A 端,针对 image 定期通过 RBD 创建 image 的 snap,然后通过 rbd export-diff
、 rbd import-diff
命令将 image 备份到 Cluster B 中。
1.2 原理
异步备份,基于 RBD 的 snapshot
机制。
1.3 命令和步骤
把 Cluster A 的 pool rbd 下面的 image testimage 异步备份到 Cluster B 的 pool rbd 下相同的 image 上:
-
在 Cluster A/B 上创建 rbd/testimage;
rbd create -p rbd --size 10240 testimage
-
在准备备份 image 前,暂停 Cluster A 端对 testimage 的 IO 操作,然后创建一个 Snapshot;
rbd snap create <snap-name>
-
导出 Cluster A 端的 testimage 数据,不指定 from-snap;
rbd export-diff <image-name> <path>
-
copy 上一步中导出的文件到 Cluster B 中,并导入数据到 testimage 中。
rbd import-diff <path> <image-name>
后续需要周期性地暂停 Cluster A 端的 testimage 的 IO,然后创建 snapshot,通过 rbd export-diff <image-name> [--from-snap <snap-name>] <path>
命令导出 incremental diff。
工程师们可以将差异数据文件 copy 到 Cluster B 上,然后通过命令 rbd import-diff <path> <image-name>
导入。通过该操作,在 rbd export-diff
时,就可以使导出的数据在 take snapshot 之后出现。
1.4 优缺点
优点:
-
当前 Ceph 版本就支持 RBD Snapshot 的功能;
-
命令简介方便,通过定制执行脚本就能实现 RBD 块设备的跨区备份。
缺点:
-
每次同步前都需要在源端 take Snapshot;
-
持续的 Snapshots 可能导致 image 的读写性能下降;
-
还要考虑后续删除不用的 Snapshots;
-
Snapshot 只能保证 IO 的一致性,并不能保证使用 RBD 块设备的系统一致性。
注:Snapshot 可以在每次操作时,暂停 image 的 IO,但是它需要利用 sync IO 数据来保证 RBD 块设备上的系统一致性,同时需要虚拟机支持 qemu-guest-agent。
1.5 参考文献
https://ceph.com/dev-notes/incremental-snapshots-with-rbd/
https://www.rapide.nl/blog/item/ceph_-_rbd_replication.html
http://wiki.libvirt.org/page/Qemu_guest_agent
http://www.zphj1987.com/2016/06/22/rbd
http://ju.outofmemory.cn/entry/243899
2. Ceph BackUp
2.1 介绍
Teralytics 是一家国外的大数据公司,Ceph BackUp 是他们开源的 Ceph 备份工具。 这个软件基于 Python 实现,可以说作者的实现逻辑是很清晰的,并且提供了配置文件的方式,且容易上手(也可以集成到自己的平台中去) 。
软件包含以下功能:
-
支持存储池和多 image 的只对;
-
支持自定义备份目标路径;
-
配置文件支持;
-
支持备份窗口设置;
-
支持压缩选项 ;
-
支持增量和全量备份的配置。
2.2 原理
异步备份,基于 RBD 的 Snapshot 机制。
2.3 命令和步骤
2.3.1 全量备份配置
上面的配置文件已写好,直接执行备份命令:
cephbackup Starting backup for pool rbd Full ceph backup Images to backup: rbd/zp Backup folder: /tmp/ Compression: True Check mode: False Taking full backup of images: zp rbd image 'zp': size 40960 MB in 10240 objects order 22 (4096 kB objects) block_name_prefix: rbd_data.25496b8b4567 format: 2 features: layering flags: Exporting image zp to /tmp/rbd/zp/zp_UTC20170119T092933.full Compress mode activated # rbd export rbd/zp /tmp/rbd/zp/zp_UTC20170119T092933.full Exporting image: 100% complete...done. # tar Scvfz /tmp/rbd/zp/zp_UTC20170119T092933.full.tar.gz /tmp/rbd/zp/zp_UTC20170119T092933.full tar: Removing leading `/' from member names
如果压缩的比较松散,且文件较为稀疏,那么用户就需要等待很长时间;如果文件压缩的效果很好,那么 dd 生成的文件就可以压缩的很小。
检查备份生成的文件:
ll /tmp/rbd/zp/zp_UTC20170119T092933.full* -rw-r--r-- 1 root root 42949672960 Jan 19 17:29 /tmp/rbd/zp/zp_UTC20170119T092933.full -rw-r--r-- 1 root root 0 Jan 19 17:29 /tmp/rbd/zp/zp_UTC20170119T092933.full.tar.gz
2.3.2 全量备份的还原
rbd import /tmp/rbd/zp/zp_UTC20170119T092933.full zpbk
检查数据,没有问题!
2.3.3 增量备份配置
写下增量配置的文件,修改备份模式选项:
[rbd] window size = 7 window unit = day destination directory = /tmp/ images = zp compress = yes ceph config = /etc/ceph/ceph.conf backup mode = incremental check mode = no
进行多次增量备份后,显示如下:
[root@lab8106 ~]#ll /tmp/rbd/zpbk/ total 146452 -rw-r--r-- 1 root root 42949672960 Jan 19 18:04 zpbk@UTC20170119T100339.full -rw-r--r-- 1 root root 66150 Jan 19 18:05 zpbk@UTC20170119T100546.diff_from_UTC20170119T100339 -rw-r--r-- 1 root root 68 Jan 19 18:05 zpbk@UTC20170119T100550.diff_from_UTC20170119T100546 -rw-r--r-- 1 root root 68 Jan 19 18:06 zpbk@UTC20170119T100606.diff_from_UTC20170119T100550 -rw-r--r-- 1 root root 68 Jan 19 18:06 zpbk@UTC20170119T100638.diff_from_UTC20170119T100606
2.3.4 增量备份的还原
分成多个步骤进行:
1、进行全量的恢复 # rbd import config@UTC20161130T170848.full dest_image 2、重新创建基础快照 # rbd snap create dest_image@UTC20161130T170848 3、还原增量的快照(多次执行) # rbd import-diff config@UTC20161130T170929.diff_from_UTC20161130T170848 dest_image
本测试用例还原步骤如下:
rbd import zpbk@UTC20170119T100339.full zpnew rbd snap create zpnew@UTC20170119T100339 rbd import-diff zpbk@UTC20170119T100546.diff_from_UTC20170119T100339 zpnew rbd import-diff zpbk@UTC20170119T100550.diff_from_UTC20170119T100546 zpnew rbd import-diff zpbk@UTC20170119T100606.diff_from_UTC20170119T100550 zpnew rbd import-diff zpbk@UTC20170119T100638.diff_from_UTC20170119T100606 zpnew
检查数据,没有问题!
3. RBD Mirroring
3.1 介绍
Ceph 新的 RBD-Mirror 功能支持配置两个 Ceph Cluster 之间的 RBD 同步。
3.2 原理
利用 Journal 日志进行异步备份,Ceph 自带 RBD-Mirror 功能 。
3.3 命令和步骤
详见:RBD-Mirror[1]
3.4 优缺点
优点:
-
Ceph 新的功能,不需要额外开发;
-
同步的粒度比较小,为一个块设备的 transaction;
-
保证了 Crash consistency;
-
可配置 pool 的备份,也可单独指定 image 备份。
缺点:
-
需要在线升级 Ceph 到 Jewel v10.2.2 以上;
-
Image Journal 日志性能影响较为严重。
方案对比
总结
结合业内各大公司的灾备方案,以及社区相关的技术文档。 个人建议用快照的方式, 简单、便捷、风险较低、易实现。 并且国内云厂商也普遍利用快照的方式实现灾备方案,而后加上自己的策略进行包装。 RBD-Mirror 功能还是比较新,虽然官方文档也对一些措施进行了优化,但是效果不佳,期待他们下个版本的优化结果。
作者简介:
李航,滴滴基础平台技术专家,主要负责分布式 Ceph 系统,具有多年底层开发经验,先后在 58 同城、汽车之家、优酷土豆集团工作。在高性能 Nginx 开发和分布式缓存 redis cluster 有着丰富的经验。个人主要关注的技术领域:高性能 Nginx 开发、分布式缓存、分布式存储。
--
参考文献:
1.https: //www.jianshu.com/p/24e1412273ad? utm_campaign=haruki&utm_content=note&utm_medium=reader_share&utm_source=weixin
2.https: //ceph.com/dev-notes/incremental-snapshots-with-rbd/
3.https: //www.rapide.nl/blog/item/ceph_-_rbd_replication.html
4.http: //wiki.libvirt.org/page/Qemu_guest_agent
5.http: //www.zphj1987.com/2016/06/22/rbd
6.http://ju.outofmemory.cn/entry/243899
推荐阅读:
在看点一下
写留言
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
猜你喜欢:本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。