使用 QEMU 客体代理在镜像快照期间使文件系统静默

https://blueprints.launchpad.net/nova/+spec/quiesced-image-snapshots-with-qemu-guest-agent

当在 kvm 实例中安装 QEMU 客体代理时,我们可以通过 libvirt 在快照期间请求实例冻结文件系统,以使快照保持一致。

问题描述

目前,我们需要在快照活动实例的镜像之前手动使文件系统静默 (fsfreeze),以创建一致的备份。当启用 QEMU 客体代理时,这应该被自动执行。

(在 cinder 的 create-snapshot API 上的静默包含在另一个提案中 [1])

用例

有了此功能,用户可以在实例运行时创建具有一致文件系统状态的快照镜像(快照镜像启动时将不会运行 fsck)。

这将很有用,例如

  • 在安装或升级软件之前快速备份。

  • 自动每天夜间备份镜像。

项目优先级

提议的变更

当实例中启用 QEMU 客体代理时,Nova-compute libvirt 驱动程序将在拍摄镜像快照之前请求代理冻结文件系统(如果安装了 fsfreeze-hook,则包括应用程序)。

对于从卷启动的实例,Nova 将在静默实例后为每个附加的卷调用 Cinder 的 snapshot-create API。为了避免双重静默,Nova 应该告诉 Cinder 在快照时不静默实例。为此,‘quiesce=True|False’ 参数将被添加到 Cinder 的 snapshot-create API 中。

拍摄快照后,驱动程序将请求代理解冻文件系统。

此功能的先决条件是

  1. 超visor 是 ‘qemu’ 或 ‘kvm’

  2. hypervisor 中安装了 libvirt >= 1.2.5(具有 fsFreeze/fsThaw API)

  3. 在镜像元数据上设置了 ‘hw_qemu_guest_agent=yes’ 属性和 ‘hw_require_fsfreeze=yes’ 属性,并且 QEMU 客体代理已安装并在实例中启用

即使满足这些条件,如果静默失败(例如,代理未响应),快照也可能因异常而失败,以避免获取不一致的快照。

备选方案

使用 libvirt 的 domain.createSnapshot API 和 VIR_DOMAIN_SNAPSHOT_CREATE_QUIESCE 标志重写 nova 的快照,尽管这将改变磁盘镜像的当前命名方案。此外,它无法用于实现 cinder 卷的实时快照。

数据模型影响

REST API 影响

安全影响

通知影响

其他最终用户影响

性能影响

在拍摄快照时,来自实例的磁盘写入将被阻止。

其他部署者影响

开发人员影响

实现

负责人

主要负责人

tsekiyama

工作项

  1. 在可用时实现快照期间的自动静默。

  2. 添加一个使用 libvirt >= 1.2.5 的静默快照场景测试(Fedora 实验队列将是一个很好的测试起点)。

依赖项

测试

带有 qemu-guest-agent 镜像的实时快照应添加到 tempest。请注意,它需要一个具有 libvirt >= 1.2.5 的环境,因此它将是启用 virt-preview 仓库的 Fedora 实验队列作业。

文档影响

需要在操作指南中记录如何使用此功能(当前建议您手动使用 fsfreeze 工具)。

参考资料