OpenStack虚拟机快照和增量备份实现方法


Posted in Servers onApril 04, 2022

1 快照的概念

一般对快照的理解就是能够将系统还原到某个瞬间,这就是快照的作用。
快照针对要保存的数据分为内存快照和磁盘快照,内存快照就是保存当前内存的数据,磁盘快照就是保存硬盘的数据。
快照针对保存方式又分为内部快照和外部快照。
内部快照:是指快照信息和虚拟机存在同一个qcow2镜像中,使用单个的 qcow2 的文件来保存快照和快照之后的改动。这种快照是 libvirt 的默认行为,现在的支持很完善(创建、回滚和删除),但是只能针对 qcow2 格式的磁盘镜像文件,而且其过程较慢等。
外部快照:是指做快照时原虚拟机的disk将变为readonly的模板镜像,然后会新建一个qcow2文件来记录与原模板镜像的差异数据,外部快照的结果是形成一个qcow2文件链:original <- snap1 <- snap2 <- snap3

2 主流libvirt快照实现介绍

2.1 libvirt的内部快照操作

以下是利用libvirt的virsh工具来创建一些内置快照:
创建虚拟机快照:

virsh snapshot-create-as --name test001 --description 'abc' instance-00000001

列出虚拟机的快照:

virsh snapshot-list instance-00000001

查看某个快照信息:

virsh snapshot-dumpxml instance-00000001 test001

回滚到某个快照:

virsh snapshot-revert instance-00000001 test001

删除某个快照:

virsh snapshot-delete instance-00000001 test001

其实这些其实现的本质是在镜像内做一些标记,内存状态数据则保存到某一个磁盘镜像文件内,使用以下命令可以看到在该镜像做的标记:

qemu-img info /var/lib/nova/instances/87985777-f83d-4fff-9723-025c2b889895/disk

2.2 libvirt的外部快照操作

可以使用 “--memspec” 和 “--diskspec” 参数来给内存和磁盘外部快照。这时候,在获取内存状态之前需要 Pause 虚机,就会产生服务的 downtime。
比如:virsh snapshot-create-as instance-00000001 livesnap2 --memspec /home/livesnap2mem,snapshot=external --diskspec vda,snapshot=external
virsh snapshot-dumpxml instance-00000001 livesnap2可以看到具体外置存放位置信息
但是libvirt现在还不支持回滚和删除外置快照,如下
virsh snapshot-revert instance-00000001 livesnap2
error: unsupported configuration: revert to external snapshot not supported yet

3 OpenStack原生虚拟机快照和备份

OpenStack中对虚拟机的快照其实是生成一个完整的镜像,保存在glance服务中,并且可以利用这个快照镜像生成新的虚拟机,与原本的虚拟机并没有什么关系。而比较主流的快照实现应该是有快照链的,且包含内存快照和磁盘快照。
OpenStack中的备份其实跟快照没啥区别,调用的都是同一个生成镜像的接口,更多的备份是cinder对磁盘的备份,没有对整个虚拟机进行备份的接口。

4 使用ceph实现OpenStack虚拟机快照功能

(1)首先是配置OpenStack的存储环境是Ceph存储,因为我们要借助ceph的一些特性来实现快照


(2)从上面我们可以知道做快照,主要是对磁盘做快照和对内存数据进行保存,如果是ceph环境,那么OpenStack虚拟机的根磁盘和磁盘在ceph下就是一个块设备,比如根磁盘一般就是保存在vms池中,其路径是vms/<instance_id>_disk,而磁盘一般就是保存在volumes池中,其路径是volumes/volume-<volume_id>;对于块设备,ceph可以使用rbd命令来对块设备做快照,比如我们对虚拟机根磁盘做快照:

rbd snap create vms/<instance_id>_disk@<snapshot_name>

snapshot_name是快照名
回滚时则执行:

rbd snap rollback vms/<instance_id>_disk@<snapshot_name>

这其实可以理解为是块设备的内部快照方式

(3)对于内存数据,我们可以使用libvirt的save接口将内存状态数据保存到一个文件中,为了保存到块设备中,我们可以这样做:
<1>新建一个块设备(这里假设在snapshots池中创建1G大小的名为test的块设备):

rbd create --size 1024 snapshos/test

<2>将块设备map到物理主机中

rbd map snapshos/test
/dev/rbd0

可以看到会输出一个磁盘设备符,使用lsblk命令则能看到该设备

<3>格式化该设备并挂载到某个目录下

mkfs.xfs /dev/rbd0
mkdir test_dir
mount /dev/rbd0 test_dir

然后我们就可以向save接口传入test_dir目录下的一个文件名,其会将内存状态数据保存到该文件中,接着umount掉该块设备:

umount -f /dev/rbd0
rbd unmap /dev/rbd0

这样内存数据也一样保存到块设备中了,要使用时再挂载该块设备访问即可,回滚内存对应的是向libvirt的restore接口传入该内存数据文件

注意点:
(1)libvirt的save接口调用保存完内存状态数据后,虚拟机会关闭,这时可以执行restore接口虚拟机回滚回去
(2)回滚虚拟机时,先将该虚拟机的vm_state状态置为ACTIVE,否则回滚会不成功

5 使用ceph实现OpenStack虚拟机增量备份功能

这里说两个备份名词,全量备份和增量备份。
全量备份:保存的是整个虚拟机的完整的数据
增量备份:保存的只是跟上一次相比有改动的数据
需要先做一次全量备份后,后续才能做增量备份

5.1 创建备份

这里以虚拟机的根磁盘 vms/<instance_id>_disk为例子做增量备份的操作演示:
(1)做一次全量备份
先对该块设备做一次快照:

rbd snap create vms/<instance_id>_disk@time1

然后导出差异数据:

rbd export-diff vms/<instance_id>_disk@time1 time1_diff_file

(2)再做一次增量备份
先对该块设备做一次快照:

rbd snap create vms/<instance_id>_disk@time2

导出time1到time2之间这段时间该磁盘的差异数据:

rbd export-diff vms/<instance_id>_disk@time2 --from-snap vms/<instance_id>_disk@time1 time2_diff_file

5.2 恢复备份

(1)如果该磁盘还存在,则直接用rbd snap rollback回滚就可以了,比如要回滚到time1这个时间点:

rbd snap rollback vms/<instance_id>_disk@time1

(2)该磁盘已经被删掉了,要恢复该磁盘到time2的时间点:
<1>创建一个块设备(大小跟删除的那块一样大小,这里以1G为例子)

rbd create --size 1024 vms/restore_disk

<2>导入差异数据,注意这里的导入顺序,先恢复到time1,再恢复到time2

rbd import-diff time1_diff_file vms/restore_disk
rbd import-diff time2_diff_file vms/restore_disk

这时这块块设备就恢复回time2的状态了

友情经验点:
(1)上面的操作都是自己创建一个块设备然后进行回滚,那怎么把这块给到OpenStack的虚拟机使用呢?在OpenStack中添加一个磁盘是先调用api.cinder.volume_create接口创建一个卷,然后调用api.nova.instance_volume_attach将该卷连接到虚拟机中,其实我们只要将它创建的块设备替换成我们的就可以了,比如它生成的是volumes/volume-123,我们自己回滚好的是volumes/restore_disk,则先删掉它的块设备,然后重命名我们的块设备:

rbd rm volumes/volume-123
rbd rename volumes/restore_disk volumes/volume-123

(2)同理,如果我们要从备份文件中恢复到一个新的虚拟机,那么就先创建一个虚拟机,然后将它的根磁盘替换为我们恢复过数据的根磁盘,然后接着是替换硬盘,这样我们便从备份文件中恢复到一个新的虚拟机了

到此这篇关于OpenStack虚拟机快照和增量备份实现的文章就介绍到这了,更多相关OpenStack快照和增量备份内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Servers 相关文章推荐
nginx proxy_cache 缓存配置详解
Mar 31 Servers
Nginx 根据URL带的参数转发的实现
Apr 01 Servers
nginx限制并发连接请求数的方法
Apr 01 Servers
JVM上高性能数据格式库包Apache Arrow入门和架构详解(Gkatziouras)
May 26 Servers
Apache Hudi的多版本清理服务彻底讲解
Mar 31 Servers
Apache Pulsar结合Hudi构建Lakehouse方案分析
Mar 31 Servers
Docker 镜像介绍以及commit相关操作
Apr 13 Servers
Windows Server 2012配置DNS服务器的方法
Apr 29 Servers
Linux中一对多配置日志服务器的详细步骤
Jul 23 Servers
zabbix如何添加监控主机和自定义监控项
Aug 14 Servers
windows server2012 R2下安装PaddleOCR服务的的详细步骤
Sep 23 Servers
keepalived + nginx 实现高可用方案
Dec 24 Servers
使用Docker容器部署rocketmq单机的全过程
Apr 03 #Servers
教你使用Jenkins集成Harbor自动发布镜像
tomcat的catalina.out日志按自定义时间格式进行分割的操作方法
Apr 02 #Servers
为Centos安装指定版本的Docker
Apr 01 #Servers
Dashboard管理Kubernetes集群与API访问配置
Kubernetes中Deployment的升级与回滚
Apr 01 #Servers
了解Kubernetes中的Service和Endpoint
You might like
PHP使用xmllint命令处理xml与html的方法
2014/12/15 PHP
Thinkphp3.2.3分页使用实例解析
2016/07/28 PHP
Yii框架弹出窗口组件CJuiDialog用法分析
2017/01/07 PHP
js实现运行代码需要刷新的解决方法
2007/08/18 Javascript
JavaScript入门教程(12) js对象化编程
2009/01/31 Javascript
javascript onmouseout 解决办法
2010/07/17 Javascript
Ubuntu 11.10 安装Node.js的方法
2011/11/30 Javascript
jQuery事件之键盘事件(ctrl+Enter回车键提交表单等)
2014/05/11 Javascript
jQuery操作DOM之获取表单控件的值
2015/01/23 Javascript
jquery使用remove()方法删除指定class子元素
2015/03/26 Javascript
纯javascript制作日历控件
2015/07/17 Javascript
Jquery实现瀑布流布局(备有详细注释)
2015/07/31 Javascript
基于jQuery日历插件制作日历
2016/03/11 Javascript
详解浏览器渲染页面过程
2017/02/09 Javascript
微信小程序开发之从相册获取图片 使用相机拍照 本地图片上传
2017/04/18 Javascript
angularJS的radio实现单项二选一的使用方法
2018/02/28 Javascript
Vue中的混入的使用(vue mixins)
2018/06/01 Javascript
JavaScript中.min.js和.js文件的区别讲解
2019/02/13 Javascript
layer.prompt输入层的例子
2019/09/24 Javascript
js实现自定义右键菜单
2020/05/18 Javascript
如何使用gpu.js改善JavaScript的性能
2020/12/01 Javascript
Python的消息队列包SnakeMQ使用初探
2016/06/29 Python
Python 'takes exactly 1 argument (2 given)' Python error
2016/12/13 Python
基于Python打造账号共享浏览器功能
2019/05/30 Python
解决django的template中如果无法引用MEDIA_URL问题
2020/04/07 Python
windows10在visual studio2019下配置使用openCV4.3.0
2020/07/14 Python
详细分析Python collections工具库
2020/07/16 Python
Win10环境中如何实现python2和python3并存
2020/07/20 Python
python 实现超级玛丽游戏
2020/11/25 Python
CSS+jQuery+PHP+MySQL实现的在线答题功能
2015/04/25 HTML / CSS
美国流行背包品牌:JanSport(杰斯伯)
2018/03/02 全球购物
三年级上册科学教学计划
2015/01/21 职场文书
学生不参加考试检讨书
2015/02/19 职场文书
付款证明格式范文
2015/06/19 职场文书
读《教育心理学》心得体会
2016/01/22 职场文书
Java实现多文件上传功能
2021/06/30 Java/Android