OpenStack虚拟机快照和增量备份实现⽅法
⽬录
1 快照的概念2 主流libvirt快照实现介绍2.1 libvirt的内部快照操作2.2 libvirt的外部快照操作3 OpenStack原⽣虚拟机快照和备份4 使⽤ceph实现OpenStack虚拟机快照功能5 使⽤ceph实现OpenStack虚拟机增量备份功能5.1 创建备份5.2 恢复备份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-025c2b85/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/_disk,⽽磁盘⼀般就是保存在volumes池中,其路径是volumes/volume-;对于块设备,ceph可以使⽤rbd命令来对块设备做快照,⽐如我们对虚拟机根磁盘做快照:rbd snap create vms/_disk@snapshot_name是快照名回滚时则执⾏:
rbd snap rollback vms/_disk@这其实可以理解为是块设备的内部快照⽅式
(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/rbd0mkdir test_dir
mount /dev/rbd0 test_dir
然后我们就可以向save接⼝传⼊test_dir⽬录下的⼀个⽂件名,其会将内存状态数据保存到该⽂件中,接着umount掉该块设备:
umount -f /dev/rbd0rbd unmap /dev/rbd0
这样内存数据也⼀样保存到块设备中了,要使⽤时再挂载该块设备访问即可,回滚内存对应的是向libvirt的restore接⼝传⼊该内存数据⽂件
注意点:
(1)libvirt的save接⼝调⽤保存完内存状态数据后,虚拟机会关闭,这时可以执⾏restore接⼝虚拟机回滚回去(2)回滚虚拟机时,先将该虚拟机的vm_state状态置为ACTIVE,否则回滚会不成功
5 使⽤ceph实现OpenStack虚拟机增量备份功能
这⾥说两个备份名词,全量备份和增量备份。全量备份:保存的是整个虚拟机的完整的数据
增量备份:保存的只是跟上⼀次相⽐有改动的数据需要先做⼀次全量备份后,后续才能做增量备份
5.1 创建备份
这⾥以虚拟机的根磁盘 vms/_disk为例⼦做增量备份的操作演⽰:(1)做⼀次全量备份先对该块设备做⼀次快照:
rbd snap create vms/_disk@time1然后导出差异数据:
rbd export-diff vms/_disk@time1 time1_diff_file(2)再做⼀次增量备份先对该块设备做⼀次快照:
rbd snap create vms/_disk@time2导出time1到time2之间这段时间该磁盘的差异数据:
rbd export-diff vms/_disk@time2 --from-snap vms/_disk@time1 time2_diff_file5.2 恢复备份
(1)如果该磁盘还存在,则直接⽤rbd snap rollback回滚就可以了,⽐如要回滚到time1这个时间点:
rbd snap rollback vms/_disk@time1(2)该磁盘已经被删掉了,要恢复该磁盘到time2的时间点:
<1>创建⼀个块设备(⼤⼩跟删除的那块⼀样⼤⼩,这⾥以1G为例⼦)
rbd create --size 1024 vms/restore_disk
<2>导⼊差异数据,注意这⾥的导⼊顺序,先恢复到time1,再恢复到time2
rbd import-diff time1_diff_file vms/restore_diskrbd 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快照和增量备份内容请搜索以前的⽂章或继续浏览下⾯的相关⽂章希望⼤家以后多多⽀持!