概述
所谓,“常在河边走,哪有不湿鞋”。在一个实际的环境中,由于种种原因,可能发生数据被删除的情况。比如,云平台中的数据库、虚拟机、数据卷、镜像或底层存储被删除等,如果数据没有进行备份,则是灾难性的后果。
在笔者的工作中,经历过2次在生产环境云平台上,客户虚拟机数据被删除的情况,一次是研发部门开发的代码逻辑判断错误导致,另一次是运维同事人为误操作。因此,觉得有必要调研整理下数据备份相关的小文,以此共勉。
在一个由OpenStack+Ceph架构组成的云平台环境中,有N种数据备份方案。如OpenStack有自带的Karbor、Freezer云服务,Ceph也有相关的备份方案,也有其他商业的备份方案等。实际上,OpenStack云平台本身也提供了一些较好易用的备份功能,比如虚拟机快照/备份、数据卷快照/备份,在使用时也倡导通过将数据卷挂载给虚拟机,从而将数据写入到云盘中,间接的实现数据容灾备份。
但,如果删除的是底层存储数据,上层的备份操作基本都将报废。那么有什么好的备份方案吗。这里,我们阐述下Ceph相关的备份方案。
方案1 Snapshot
原理
异步备份,基于RBD的snapshot机制。
介绍
在此方案下,Cluster A & B是独立的Ceph集群,通过RBD的snapshot机制,在Cluster A端,针对image定期通过rbd创建image的快照,然后通过rbd export-diff, rbd import-diff命令来完成image备份到Cluster B。
命令和步骤
把 Cluster A 的 pool 中的testimage 异步备份到 Cluster B 的 pool 中。
1)在Cluster A/B上创建rbd/testimage1
rbd create -p rbd --size 10240 testimage
2)在准备备份image前,暂停Cluster A端对testimage的IO操作,然后创建个snapshot1
rbd snap create <snap-name>
3)导出Cluster A端的testimage数据,不指定from-snap1
rbd export-diff <image-name> <path>
4)copy上一步中导出的文件到Cluster B,并导入数据到testimage1
rbd import-diff <path> <image-name>
后续需周期性的暂停Cluster A端的testimage的IO,然后创建snapshot,通过 rbd export-diff
【注】:也可不暂停Cluster A端的IO,直接take snapshot;这样并不会引起image的数据不一致,只是有可能会使rbd export-diff导出的数据在take snapshot之后。
此方案优缺点
优点:
- 命令简单,通过定制执行脚本就能实现rbd块设备的跨区备份
缺点:
- 每次同步前都需要在源端take snapshot或暂停IO操作
- 持续的snapshots可能导致image的读写性能下降
- 还要考虑后续删除不用的snapshots
- snapshot只能保证IO的一致性,并不能保证使用rbd块设备上的系统一致性;
方案2 RBD Mirroring
原理
异步备份,Ceph新的rbd mirror功能
介绍
Ceph新的rbd mirror功能支持配置两个Ceph Cluster之间的rbd同步。
在此方案下,Master Cluster使用性能较高的存储设备,提供给OpenStack的Glance、Cinder(cinder-volume、cinder-backup)和Nova服务使用;而Backup Cluster则使用容量空间大且廉价的存储设备(如SATA盘)来备份Ceph数据。不同的Ceph Cluster集群,可以根据实际需要,选择是否跨物理机房备份。
优点:
- Ceph新的功能,不需要额外开发
- 同步的粒度比较小,为一个块设备的transaction
- 保证了Crash consistency
- 可配置pool的备份,也可单独指定image备份
- 同步备份,不同机房的Ceph集群,底层存储的跨机房容灾
方案3 ceph备份软件ceph-backup
介绍
ceph-backup是一个用来备份ceph RBD块设备的开源软件,提供了两种模式。
- 增量:在给定备份时间窗口内基于rbd快照的增量备份
- 完全:完整映像导出时不包含快照
编译安装1
2
3 git clone https://github.com/teralytics/ceph-backup.git
cd ceph-backup
python setup.py install
安装过程中会下载一些东西,注意要有网络,需要等待一会
准备配置文件1
2 mkdir /etc/cephbackup/
cp ceph-backup.cfg /etc/cephbackup/cephbackup.conf
我的配置文件如下,备份rbd存储的zp的镜像,支持多image,images后面用逗号隔开就可以1
2
3
4
5
6
7
8
9
10# cat /etc/cephbackup/cephbackup.conf
[rbd]
window size = 7
window unit = days
destination directory = /tmp/
images = zp
compress = yes
ceph config = /etc/ceph/ceph.conf
backup mode = full
check mode = no
开始备份
全量备份配置
上面的配置文件已经写好了,直接执行备份命令就可以了1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18# 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
1 | # rbd export rbd/zp /tmp/rbd/zp/zp_UTC20170119T092933.full |
1 | # tar scvfz /tmp/rbd/zp/zp_UTC20170119T092933.full.tar.gz /tmp/rbd/zp/zp_UTC20170119T092933.full |
压缩如果打开了,正好文件也是稀疏文件的话,需要等很久,压缩的效果很好,dd生成的文件可以压缩到很小
检查备份生成的文件1
2
3# 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
全量备份的还原1
# rbd import /tmp/rbd/zp/zp_UTC20170119T092933.full zpbk
检查数据,没有问题
增量备份配置
写下增量配置的文件,修改下备份模式的选项1
2
3
4
5
6
7
8
9[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
执行多次进行增量备份以后是这样的1
2
3
4
5
6
7# 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
增量备份的还原
分成多个步骤进行
1、进行全量的恢复1
# rbd import config@UTC20161130T170848.full dest_image
2、重新创建基础快照1
# rbd snap create dest_image@UTC20161130T170848
3、还原增量的快照1
# rbd import-diff config@UTC20161130T170929.diff_from_UTC20161130T170848 dest_image
总结
综合评估,以上三种方案的优缺点,推荐使用“方案二RBD Mirroring”。
参考链接
http://www.yangguanjun.com/2017/02/22/rbd-data-replication/
https://ceph.com/planet/ceph%E7%9A%84rbd%E5%A4%87%E4%BB%BD%E8%BD%AF%E4%BB%B6ceph-backup/