跳转到: 导航, 搜索

Cinder/QuiescedSnapshotWithQemuGuestAgent

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

相关蓝图

目标

  1. 使用 QEMU 客体代理创建具有静默 I/O 的一致卷和镜像快照
  2. 使用应用层一致性对 nova 镜像和 cinder 卷进行在线备份

先决条件

  • 使用 QEMU/KVM 作为虚拟机监控程序(通过 libvirt 计算驱动程序)
  • 镜像元数据具有 'hw_qemu_guest_agent=yes' 属性
  • 已安装 QEMU 客体代理

概述

目前,我们需要在创建快照和备份之前手动使用 'fsfreeze' 命令使文件系统静默,但是冻结根文件系统存在轻微的死锁风险。对于 cinder 卷,即使在指定 --force 选项的情况下,我们也可以创建快照,但如果没有 fsfreeze,则无法保证快照的一致性。

本提案旨在在使用 KVM 实例上 QEMU 客体代理时,安全地自动冻结文件系统,同时进行快照。该代理还具有应用程序的钩子,以便在适当配置时可以使应用程序(例如 mysql)静默。

镜像快照的创建

  1. 用户调用 Nova 的 image-create API
  2. 如果实例处于活动状态并已安装 QEMU 客体代理,则向代理发送 'guest-fsfreeze-freeze' 命令以使其静默。
  3. 拍摄快照
  4. 如果在步骤 2 成功静默,则通过向代理发送 'guest-fsfreeze-thaw' 命令来取消静默。

卷快照的创建

  1. 用户调用 Cinder 的 snapshot-create API,并带有新的 "quiesce=True" 参数。
  2. 如果卷已附加并且实例处于活动状态,则通过 novaclient 调用 Nova 的 "quiesce" API(admin_action)。
  3. Nova(compute/libvirt)通过向代理发送 'guest-fsfreeze-freeze'(如果已安装)来使实例静默。
  4. 如果 "quiesce" API 成功,则创建卷快照。否则报告错误并退出。
  5. 通过 novaclient 调用 Nova 的 "unquiesce" API(admin_action)。
  6. Nova(compute/libvirt)通过向代理发送 'guest-fsfreeze-thaw' 来取消使实例静默。

新的 API

Nova

  • 新的 quiesce() admin action
    • 在 libvirt/kvm 驱动程序中,如果已安装,则向客体代理发送 'guest-fsfreeze-freeze' 命令。
    • 否则,返回错误。
    • 需要将其添加到 novaclient,以便 cinder 可以调用它。
  • 新的 unquiesce() admin action
    • 在 libvirt/kvm 驱动程序中,如果已安装,则向客体代理发送 'guest-fsfreeze-thaw' 命令。
    • 否则,返回错误。
    • 需要将其添加到 novaclient,以便 cinder 可以调用它。

Cinder

  • volume_snapshot_create() API 中的更改
    • 如果指定 force=True
      • 如果卷附加到活动客体,则在快照之前/之后尝试调用 Nova 的 quiesce()/unquisce() API。

相关链接