从数据删除看备份的重要性

概述

所谓,“常在河边走,哪有不湿鞋”。在一个实际的环境中,由于种种原因,可能发生数据被删除的情况。比如,云平台中的数据库、虚拟机、数据卷、镜像或底层存储被删除等,如果数据没有进行备份,则是灾难性的后果。

在笔者的工作中,经历过2次在生产环境云平台上,客户虚拟机数据被删除的情况,一次是研发部门开发的代码逻辑判断错误导致,另一次是运维同事人为误操作。因此,觉得有必要调研整理下数据备份相关的小文,以此共勉。

在一个由OpenStack+Ceph架构组成的云平台环境中,有N种数据备份方案。如OpenStack有自带的Karbor、Freezer云服务,Ceph也有相关的备份方案,也有其他商业的备份方案等。实际上,OpenStack云平台本身也提供了一些较好易用的备份功能,比如虚拟机快照/备份、数据卷快照/备份,在使用时也倡导通过将数据卷挂载给虚拟机,从而将数据写入到云盘中,间接的实现数据容灾备份。

但,如果删除的是底层存储数据,上层的备份操作基本都将报废。那么有什么好的备份方案吗。这里,我们阐述下Ceph相关的备份方案。

方案1 Snapshot

原理

异步备份,基于RBD的snapshot机制。
image

介绍

在此方案下,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/testimage

1
rbd create -p rbd --size 10240 testimage

2)在准备备份image前,暂停Cluster A端对testimage的IO操作,然后创建个snapshot

1
rbd snap create <snap-name>

3)导出Cluster A端的testimage数据,不指定from-snap

1
rbd export-diff <image-name> <path>

4)copy上一步中导出的文件到Cluster B,并导入数据到testimage

1
rbd import-diff <path> <image-name>

后续需周期性的暂停Cluster A端的testimage的IO,然后创建snapshot,通过 rbd export-diff [–from-snap ] 命令导出incremental diff,之后把差异数据文件copy到Cluster B上,然后通过命令rbd import-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功能
image

介绍

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
2
# rbd export rbd/zp /tmp/rbd/zp/zp_UTC20170119T092933.full
Exporting image: 100% complete...done.
1
2
# tar scvfz /tmp/rbd/zp/zp_UTC20170119T092933.full.tar.gz /tmp/rbd/zp/zp_UTC20170119T092933.full
tar: Removing leading `/' from member names

压缩如果打开了,正好文件也是稀疏文件的话,需要等很久,压缩的效果很好,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/

0%