一、概述
采用Ceph分布式文件系统作为Openstack后端存储已经成为一种主流的存储对接方案,Nova、Glance、Cinder都将Ceph rbd作为默认存储。虚拟机、云硬盘及其快照的备份都可以根据rbd特性进行快捷的备份操作,实践中根据实际的情况制定适合的备份策略。备份策略的制定可考虑以下因素:
- 备份目标;
- 备份数据的保有量;
- 备份频率
制定好备份策略后,据此配置好备份脚本及程序,定时备份生产环境中虚拟机等重要数据的备份。
二、备份操作
2.1 全量备份
(1)直接导出虚拟机镜像的方式
虚拟机、云硬盘及其快照的备份时全部类似,都无需关机,直接从Ceph统一存储rbd上导出相关镜像即可。
1 |
qemu-img convert -f raw -O qcow2 rbd:vms/$VM_UUID_disk $NAME`eval date +%Y-%m-%d_%H:%M:%S`.qcow2 |
这种方式适用于虚拟机当前状态的制作镜像并备份,非常方便,不会在Openstack平台和Ceph系统上留下痕迹,适合跨云的镜像快速迁移。
恢复虚拟机只能通过Openstack镜像上传,然后在Openstack中创建虚拟机的方式进行间接恢复。
(2)利用rbd导出的方式
先给当前虚拟机创建快照并导出全量数据。
1 2 |
# rbd -p vms snap create $VM_UUID_disk@20170213-00:00:00 # rbd export-diff vms/$VM_UUID@20170213-00:00:00 centos7.2_disk@20170213-00:00:00 |
例如这里导出一个虚拟机的快照数据到本地,:
1 2 3 4 |
# rbd export-diff vms/fa8db954-46c7-40bd-80b5-02321f77e116_disk@20170213-00:00:00 centos7.2_disk@20170213-00:00:00 Exporting image: 100% complete...done. # ll -h centos7.2_disk@20170213-00\:00\:00 -rw-r--r-- 1 root root 7.2G Sep 21 13:39 centos7.2_disk@20170213-00:00:00 |
这种方式是从Ceph存储端做备份,先给当前虚拟机rbd存储打个快照,然后全量导出。
这种方式的恢复也完全在Ceph侧操作,通过rbd import方式恢复即可。
1 2 |
# rbd import centos7.2_disk@20170213-00:00:00 vms/fa8db954-46c7-40bd-80b5-02321f77e116_disk Importing image: 100% complete...done. |
rbd import会创建一个新的镜像,并从指定的文件中导入数据,当前前提是vms/fa8db954-46c7-40bd-80b5-02321f77e116_disk不存在,否则提示文件已经存在。
2.2 增量备份
Cinder volume采用rbd作为存储后端,支持增量备份,增量备份的实现完全依赖ceph处理差量文件的特性,可以将某个rbd image不同时刻的状态进行比较,并且将其差量导出成文件。增量备份方案是将虚拟机、云硬盘和快照将这个差量文件导入到指定的备份镜像中。
增量备份的实际执行需要首先做一个基础快照,然后导出这个快照的数据,然后从当前时间点开始,按照指定的时间间隔(如每天晚上)做一个快照,然后将时间间隔内的数据导出为备份的增量数据。但建议定期做一个全量快照,一方面防止中间的增量快照遗漏,另一方面定期清理快照,本地数据做复制的时候做一下数据的压缩,来减少数据量的传输。
备份步骤:
首先创建当前时间点快照,并查看快照:
1 2 3 4 |
# rbd -p vms snap create fa8db954-46c7-40bd-80b5-02321f77e116_disk@20170213-00:00:00 # rbd -p vms snap ls fa8db954-46c7-40bd-80b5-02321f77e116_disk SNAPID NAME SIZE 4 20170213-00:00:00 40960 MB |
创建下一次时间点快照,假设时间间隔一天:
1 2 3 4 5 |
# rbd -p vms snap create fa8db954-46c7-40bd-80b5-02321f77e116_disk@20170214-00:00:00 # rbd -p vms snap ls fa8db954-46c7-40bd-80b5-02321f77e116_disk SNAPID NAME SIZE 4 20170213-00:00:00 40960 MB 5 20170214-00:00:00 40960 MB |
导出当前这次时间点的增量数据,差量数据为20170213-00:00:00到20170214-00:00:00的新增数据:
1 2 3 4 5 |
# rbd export-diff vms/fa8db954-46c7-40bd-80b5-02321f77e116_disk@20170214-00:00:00 --from-snap 20170213-00:00:00 centos7.2_disk@20170213-00:00:00_20170214-00:00:00 Exporting image: 100% complete...done. # ll -h centos7.2_disk* -rw-r--r-- 1 root root 7.2G Sep 21 13:39 centos7.2_disk@20170213-00:00:00 -rw-r--r-- 1 root root 197K Sep 21 14:01 centos7.2_disk@20170213-00:00:00_20170214-00:00:00 |
不难看相较于全量,增量备份数据量还是比较小的(镜像变动不大情况下)。
对于增量备份的恢复,需要第一个基础快照导入(全量),然后按顺序导入增量的快照,最后恢复到最后一次增量备份的快照。
1 2 3 4 |
# rbd import-diff centos7.2_disk@20170213-00:00:00 vms/fa8db954-46c7-40bd-80b5-02321f77e116_disk Importing image diff: 100% complete...done. # rbd import-diff centos7.2_disk@20170213-00:00:00_20170214-00:00:00 vms/fa8db954-46c7-40bd-80b5-02321f77e116_disk Importing image diff: 100% complete...done. |
导入镜像的增量数据到当前的镜像上,因为增量是相对于的,执行前会验证前一个时间点数据是否存在,不存在就会报错而无法执行。
三、备份策略
现在假设我们针对特定的虚拟机,周天做一次全量备份,周一到周六做一次增量备份,为节省存储空间,压缩备份数据并删除一个月前的备份数据。一个简单的备份脚本vm_backup.sh如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 |
#!/bin/sh # # A simple script for virtual machine backup backup_path=/var/lib/backups/vm_image vmid=bf67ecac-9e0d-46ca-978d-f3372b537705_disk vmname=cirros yesterday=`date -d '1 days ago' +%Y%m%d` today=`date +%Y%m%d` weekday=`date +%w` pre_file_name=$backup_path/$vmname"_"$vmid@$yesterday cur_snap_name=$vmid@$today cur_file_name=$backup_path/$vmname"_"$vmid@$yesterday ## export backup data rbd snap create vms/$cur_snap_name if [[ "$weekday" == "0" ]];then # delete the older data than 35 days find $backup_path/*.gz -ctime +35 -type f -delete # delete the older snaps in ceph for line in $(rbd -p vms snap ls $vmid|grep MB|awk '{print $2}') do echo $line #timespan=$(($(date +%s -d '$today')-$(date +%s -d '$dt'))); lastReserveTime=`date -d '35 days ago' +%s` thisSnapTime=`date +%s -d "$line"` timespan=`expr $lastReserveTime - $thisSnapTime` if [[ $timespan -gt 0 ]];then echo "Delete snap:$line" rbd -p vms snap rm $vmid@$line fi done echo "$today:Full Backup" rbd export-diff vms/$cur_snap_name $cur_file_name echo yes | gzip $cur_file_name else echo "$today:Incremental Backup" rbd export-diff vms/$cur_snap_name --from-snap $yesterday $pre_file_name"_"$today echo yes | gzip $pre_file_name"_"$today fi |
脚本比较简单,其中还需要考虑中间备份出错时如何处理的情况,这个功能最后能做到DevOps平台上,数据库中保存状态,连上监控告警的功能就健壮多了,最后需要价格定时任务,每天晚上备份,如下:
1 2 |
# crontab -l 0 0 * * * /bin/sh /var/lib/backups/vm_backup.sh |
其实,基于Ceph Rbd的备份软件已经有了,磨神博客已有了详细介绍,不想重复造轮子的同学,请移步磨神的《ceph的rbd备份软件ceph-backup》。
四、参考文档
http://docs.ceph.com/docs/master/man/8/rbd/
code
more code
~~~~