K8S 存储的那点事儿:3 种 Ceph RBD 灾备方案对比
技术
作者:李航
译者:小君君
2019-04-20 03:35

Ceph RBD 是 Ceph 的 RADOS 块设备。RBD 块存储是最稳定且最常用的存储类型,它类似磁盘可以被挂载。RBD 块设备具有快照、多副本、克隆和一致性等特点,数据以条带化的方式存储在 Ceph 集群的多个 OSD 中。本文的作者是滴滴基础平台技术专家李航,在这篇文章中,他将对 3 种 Ceph RBD 灾备方案展开介绍,并从它们的实现原理、操作命令、性能优缺等方面进行全面分析,为大家在生产中选择最佳灾备方案提供建议。 

通过本文你将了解到:

  • 业内灾备方案
  • Snapshot
  • Ceph BackUp
  • RBD Mirroring
  • 方案对比
  • 总结

业内灾备方案 

Snapshot 

1.1 介绍
Cluster A&B 是独立的 Ceph 集群,通过 RBD 的 Snapshot 机制,在 Cluster A 端,针对 image 定期通过 RBD 创建 image 的 snap,然后通过rbd export-diffrbd 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 生成的文件就可以压缩的很小。 

 如果压缩的比较松散,且文件较为稀疏,那么用户就需要等待很长时间;如果文件压缩的效果很好,那么 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 开发、分布式缓存、分布式存储。 



216 comCount 0