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优化的六点方法
Mar 31 Servers
详解Apache SkyWalking 告警配置指南
Apr 22 Servers
tomcat的catalina.out日志按自定义时间格式进行分割的操作方法
Apr 02 Servers
Nginx动静分离配置实现与说明
Apr 07 Servers
Docker下安装Oracle19c
Apr 13 Servers
nginx 配置缓存
May 11 Servers
在容器中使用nginx搭建上传下载服务器
May 11 Servers
聊聊配置 Nginx 访问与错误日志的问题
May 25 Servers
win sever 2022如何占用操作主机角色
Jun 25 Servers
云服务器部署 Web 项目的实现步骤
Jun 28 Servers
Docker容器harbor私有仓库部署和管理
Aug 05 Servers
Tomcat安装使用及部署Web项目的3种方法汇总
Aug 14 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源码之 ext/mysql扩展部分
2009/07/17 PHP
PHP基础知识回顾
2012/08/16 PHP
php实现自动获取生成文章主题关键词功能的深入分析
2013/06/03 PHP
Laravel 5.4向IoC容器中添加自定义类的方法示例
2017/08/15 PHP
PHP实现基于PDO扩展连接PostgreSQL对象关系数据库示例
2018/03/31 PHP
php解决约瑟夫环算法实例分析
2019/09/30 PHP
JS 类型转换常见方法小结
2010/05/31 Javascript
window.location.hash 使用说明
2010/11/08 Javascript
node.js中的fs.fsync方法使用说明
2014/12/15 Javascript
jQuery.uploadify文件上传组件实例讲解
2016/09/23 Javascript
JS判断输入的字符串是否是数字的方法(正则表达式)
2016/11/29 Javascript
js事件冒泡与事件捕获详解
2017/02/20 Javascript
jQuery的时间datetime控件在AngularJs中的使用实例(分享)
2017/08/17 jQuery
layui-table对返回的数据进行转变显示的实例
2019/09/04 Javascript
Layui带搜索的下拉框的使用以及动态数据绑定方法
2019/09/28 Javascript
[01:09]DOTAPLUS——DOTA2的新时代
2018/04/04 DOTA
使用简单工厂模式来进行Python的设计模式编程
2016/03/01 Python
Python实现将Excel转换为json的方法示例
2017/08/05 Python
python遍历序列enumerate函数浅析
2017/10/17 Python
python实现石头剪刀布小游戏
2021/01/20 Python
在win10和linux上分别安装Python虚拟环境的方法步骤
2019/05/09 Python
Python数据可视化 pyecharts实现各种统计图表过程详解
2019/08/15 Python
python调用c++返回带成员指针的类指针实例
2019/12/12 Python
在tensorflow中实现去除不足一个batch的数据
2020/01/20 Python
在 Linux/Mac 下为Python函数添加超时时间的方法
2020/02/20 Python
Scrapy实现模拟登录的示例代码
2021/02/21 Python
Python tkinter实现日期选择器
2021/02/22 Python
使用css3实现的windows8开机加载动画
2014/12/09 HTML / CSS
webapp字号大小跟随系统字号大小缩放的示例代码
2018/12/26 HTML / CSS
澳大利亚办公室装修:JasonL Office Furniture
2019/06/25 全球购物
Stokke美国官方网店:高级儿童家具、推车、汽车座椅和配件
2020/06/06 全球购物
如何写你的创业计划书
2014/01/07 职场文书
辞职信格式范文
2015/05/13 职场文书
金榜题名主持词
2015/07/02 职场文书
关于开学的感想
2015/08/10 职场文书
入团申请书格式
2019/06/20 职场文书