深入解析Nova虚拟机动态迁移源码

需积分: 18 5 下载量 60 浏览量 更新于2024-07-18 收藏 169KB DOC 举报
" Nova虚拟机动态迁移源码分析" 在OpenStack云计算环境中,Nova是核心组件之一,负责管理和调度虚拟机实例。动态迁移是Nova提供的一种重要功能,它允许虚拟机在不中断服务的情况下从一个计算节点迁移到另一个计算节点。这对于优化资源分配、维护和升级硬件、以及应对故障恢复具有重要意义。 在Nova中,虚拟机动态迁移的实现主要涉及以下几个关键步骤和源码部分: 1. **API请求处理**: - API请求首先由/nova/api/openstack/compute/contrib/admin_actions.py中的`def_migrate_live`函数处理。这个函数接收管理员发起的迁移请求,包括目标主机信息(host)、是否启用块级迁移(block_migration)和磁盘过量预留(disk_over_commit)等参数。 2. **权限验证**: - 在处理请求之前,通过`authorize`函数验证请求者是否有执行动态迁移的权限。这确保了只有管理员才能执行该操作。 3. **参数检查**: - 函数会检查请求体中是否包含必要的参数,如目标主机名(host),如果没有,则抛出HTTPBadRequest异常。 4. **获取实例信息**: - 使用`compute_api.get`方法从数据库中获取待迁移虚拟机实例的信息。 5. **执行迁移操作**: - 关键的迁移操作在`compute_api.live_migrate`中执行。此函数接收上下文对象(context)、虚拟机实例、是否启用块级迁移和磁盘过量预留等参数,并调用底层的Libvirt或其他虚拟化驱动来实现实际的迁移过程。 6. **异常处理**: - 在尝试执行迁移过程中,如果遇到任何问题,如计算服务不可用、目标主机不可达或资源不足,会捕获并抛出相应的异常。 7. **Libvirt的使用**: - Nova通常依赖于Libvirt作为其虚拟化管理接口。在Libvirt中,动态迁移可能涉及`virDomainMigrate3`等API,这些API使用QEMU的KVM(Kernel-based Virtual Machine)支持实现无中断的迁移。 8. **网络迁移**: - 动态迁移不仅要迁移虚拟机的磁盘和内存数据,还需要处理网络配置,确保迁移后虚拟机能正确连接到原有网络。 9. **状态同步**: - 迁移完成后,Nova会更新数据库中的虚拟机状态,确保所有组件(如Nova-Scheduler、Nova-Conductor)都能看到最新的状态。 10. **回滚机制**: - 如果迁移失败,可能需要回滚到迁移前的状态,这可能涉及到撤销分配的资源和恢复原主机上的虚拟机。 以上是对Nova虚拟机动态迁移源码的一个高级概述。深入了解这一过程,有助于开发者和运维人员更好地理解OpenStack的内部工作原理,从而优化云环境的管理和维护。