如何(正确)备份实时 QEMU/KVM VM?

如何(正确)备份实时 QEMU/KVM VM?

我目前正在设计一种 KVM VM 备份解决方案,作为传统备份的附加措施。

不幸的是,到目前为止我遇到的所有现有解决方案(2013 年 8 月)都是:

  • 不能确保持续的虚拟机备份(丢失 RAM 状态、创建脏映像或其他事情),
  • 或需要冗长的停机时间(备份时完全关闭虚拟机)。

我知道 QEMU/libvirt 具有拍摄快照的功能,但是它还无法使用,因为:

  • 图像内部快照为您提供不断变化的图像文件,从而可能导致备份不干净(假设使用 qcow2 镜像)。
  • 还不能将当前活动的外部快照合并到原始背景图像中(“块提交”)。

出于上述原因,我现在正在实现一个脚本:

  1. 保存虚拟机的状态并停止它
  2. 设置虚拟机磁盘映像和状态所在的设备映射器快照
  3. 恢复虚拟机
  4. 挂载步骤 2 的快照。
  5. 备份虚拟机的磁盘和状态(为方便而配置)
  6. 合并回快照。

如果我做对了,这将在几秒钟内(如果有的话,因为 1-3 很快,可能是亚秒)完成虚拟机的一致备份。当然,在恢复时,虚拟机将方式但至少给我了有序关机/重启的选项。

我是否遗漏了此解决方案的某些内容?或者确实有人已经实现了此解决方案?

答案1

https://libvirt.org/kbase/live_full_disk_backup.html

以下版本可以实现此目的:QEMU 2.1(及以上版本)、libvirt-1.2.9(及以上版本)。

$ virsh domblklist vm1
Target     Source
------------------------------------------------
vda        /export/images/base.img 

$ virsh snapshot-create-as --domain vm1 --name guest-state1 \
--diskspec vda,file=/export/images/overlay1.qcow2 \
--disk-only --atomic --quiesce

$ rsync -avhW --progress /export/images/base.img \
/export/images/copy.img

$ virsh blockcommit vm1 vda --active --verbose --pivot

如果您没有 QEmu Guest Agent,您可以省略 --quiesce 选项,在这种情况下,当您从备份恢复时,它看起来就像系统已经崩溃,但无论如何应该是好的,因为里面的操作系统应该刷新所需的数据并保持其文件系统的一致性。

答案2

停止虚拟机不会刷新正在进行的 IO,您应该使用qemu-ga它来使虚拟机静止。

由于 QEMU 引入了块迁移,您可以尝试使用它将虚拟机迁移到备份映像中,从而保存内存状态和磁盘

相关内容