Cinder/QuiescedSnapshotWithQemuGuestAgent
< Cinder
目录
在快照期间使用 QEMU 客体代理使文件系统静默
相关蓝图
- https://blueprints.launchpad.net/nova/+spec/quiesced-snapshots-with-qemu-guest-agent
- https://blueprints.launchpad.net/cinder/+spec/quiesced-snapshots-with-qemu-guest-agent
目标
- 使用 QEMU 客体代理创建具有静默 I/O 的一致卷和镜像快照
- 使用应用层一致性对 nova 镜像和 cinder 卷进行在线备份
先决条件
- 使用 QEMU/KVM 作为虚拟机监控程序(通过 libvirt 计算驱动程序)
- 镜像元数据具有 'hw_qemu_guest_agent=yes' 属性
- 已安装 QEMU 客体代理
概述
目前,我们需要在创建快照和备份之前手动使用 'fsfreeze' 命令使文件系统静默,但是冻结根文件系统存在轻微的死锁风险。对于 cinder 卷,即使在指定 --force 选项的情况下,我们也可以创建快照,但如果没有 fsfreeze,则无法保证快照的一致性。
本提案旨在在使用 KVM 实例上 QEMU 客体代理时,安全地自动冻结文件系统,同时进行快照。该代理还具有应用程序的钩子,以便在适当配置时可以使应用程序(例如 mysql)静默。
镜像快照的创建
- 用户调用 Nova 的 image-create API
- 如果实例处于活动状态并已安装 QEMU 客体代理,则向代理发送 'guest-fsfreeze-freeze' 命令以使其静默。
- 拍摄快照
- 如果在步骤 2 成功静默,则通过向代理发送 'guest-fsfreeze-thaw' 命令来取消静默。
卷快照的创建
- 用户调用 Cinder 的 snapshot-create API,并带有新的 "quiesce=True" 参数。
- 如果卷已附加并且实例处于活动状态,则通过 novaclient 调用 Nova 的 "quiesce" API(admin_action)。
- Nova(compute/libvirt)通过向代理发送 'guest-fsfreeze-freeze'(如果已安装)来使实例静默。
- 如果 "quiesce" API 成功,则创建卷快照。否则报告错误并退出。
- 通过 novaclient 调用 Nova 的 "unquiesce" API(admin_action)。
- 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。
- 如果指定 force=True
相关链接
- 蓝图:为 kvm 实例添加 qemu-guest-agent 支持
- QEMU Wiki - Live Snapshots / Guest Agent