虚拟机迁移
虚拟机迁移是 QVMConsole 的核心基础设施能力,支持将虚拟机从一个节点迁移到另一个节点,实现资源调度、负载均衡和高可用部署。迁移功能与节点管理紧密协作,通过预检机制和任务队列确保迁移的安全性和可靠性。
虚拟机迁移操作仅对管理员角色开放,从虚拟机列表的操作菜单中触发。
迁移架构
迁移方式
QVMConsole 支持两种迁移方式,系统会根据虚拟机的运行状态自动识别:
| 迁移方式 | 适用场景 | 特点 |
|---|---|---|
| 热迁移 | 虚拟机运行中 | 业务不中断,基于 libvirt 块迁移(--copy-storage-inc),无需共享存储 |
| 冷迁移 | 虚拟机关机 | rsync 稀疏复制磁盘文件 + 目标节点重新定义,简单可靠 |
系统会自动检测虚拟机的运行状态,无需手动选择迁移方式。运行中的虚拟机将自动采用热迁移,关机的虚拟机将自动采用冷迁移。
整机迁移
整机迁移(VmMigrationDialog)支持将虚拟机的完整配置和数据迁移到目标节点。
迁移配置项
| 配置项 | 说明 | 必填 |
|---|---|---|
| 目标节点 | 选择已启用的目标节点 | 是 |
| 目标存储 | 选择带可用容量的存储池 | 是 |
| 硬盘目标存储 | 多块硬盘时可单独选择目标存储 | 否 |
| 轻量云 VPC | 轻量云模式下的网络配置 | 按需 |
| 目标 VPC | 标准模式下的目标网络 | 按需 |
| 目标安全组 | 迁移后的安全组配置 | 否 |
| 预检策略 | 跳过 backing 哈希校验(仅比对磁盘格式与虚拟容量,其余预检照常执行) | 否 |
| 迁移 CPU 限制 | 热迁移时的 CPU 使用限制(后端归一化到 10%-100%) | 否 |
硬盘目标存储
当虚拟机拥有多块硬盘时,可以为每块硬盘单独选择目标存储位置:
| 字段 | 说明 |
|---|---|
| 设备 | 硬盘设备标识(如 vda、vdb) |
| 容量 | 硬盘容量大小 |
| 源路径 | 当前硬盘文件路径 |
| 对端存储 | 选择目标存储池 |
预检机制
迁移预检是确保迁移成功的重要环节,会在迁移前进行全面的兼容性检查:
预检结果展示
预检结果包含以下信息:
基本信息
| 字段 | 说明 |
|---|---|
| 源状态 | 虚拟机当前运行状态 |
| 用户信息 | 虚拟机所属用户和云类型 |
| 目标用户 | 是否自动注册新用户或绑定已有用户 |
| 目标存储目录 | 迁移后的存储路径 |
| 所需容量 | 迁移所需的总存储空间 |
| VM 凭据 | 是否同步虚拟机登录凭据 |
热迁移评估
对于运行中的虚拟机,预检会进行热迁移可行性评估:
| 指标 | 说明 | 影响 |
|---|---|---|
| 平均带宽 | 迁移数据传输带宽 | 影响迁移速度 |
| 脏页速率 | 内存页面变更速率 | 速率过高可能导致迁移失败 |
| 脏页占比 | 脏页占总内存的比例 | 占比过高会阻止热迁移 |
| CPU 限制 | 迁移时的 CPU 使用限制 | 可配置限制百分比 |
| 评估结论 | 热迁移是否可行 | 允许热迁移 / 阻止热迁移 |
当脏页速率达到平均带宽的 20%-50% 时,后端会强制启用 CPU 限制;达到 50% 时会阻止热迁移,建议改用冷迁移。
磁盘检查
| 字段 | 说明 |
|---|---|
| 磁盘 | 磁盘设备标识 |
| 目标存储 | 目标存储池名称 |
| 源 overlay | 源磁盘文件路径 |
| 目标 overlay | 目标磁盘文件路径 |
| backing | 基础镜像路径 |
backing 检查
| 状态 | 说明 |
|---|---|
| 通过 | backing 文件在目标节点存在且兼容 |
| 失败 | backing 文件缺失或不兼容,需要先处理 |
端口转发
| 字段 | 说明 |
|---|---|
| 协议 | 端口转发协议(TCP/UDP) |
| 源端口 | 当前端口转发的主机端口 |
| 目标端口 | 迁移后的目标主机端口(自动分配) |
| VM 端口 | 虚拟机内部端口 |
CPU 限制配置
热迁移时可以配置 CPU 使用限制,避免迁移过程影响业务性能:
| 配置项 | 说明 | 范围 |
|---|---|---|
| 启用 CPU 限制 | 是否限制迁移时的 CPU 使用率 | 开/关 |
| 限制百分比 | CPU 使用率上限 | 10%-100%(表单步长 5% 为前端约束,后端统一归一化到 10-100) |
CPU 限制通过 virsh schedinfo 的 period/quota 参数实现,迁移结束(无论成功失败)后自动恢复原值。
提交流程
单硬盘迁移
单硬盘迁移支持将虚拟机的单个硬盘迁移到其他存储池,适用于存储扩容、存储池迁移等场景。
硬盘列表
| 字段 | 说明 |
|---|---|
| 设备 | 硬盘设备标识(如 vda、vdb) |
| 容量 | 硬盘容量大小 |
| 格式 | 磁盘格式(qcow2、raw 等) |
| 驱动 | 磁盘驱动类型(virtio、ide 等) |
| 当前路径 | 硬盘文件当前路径 |
| backing | 基础镜像路径(链式存储) |
| 状态 | 是否可迁移(可迁移/不可迁移) |
迁移流程
对于使用链式存储的硬盘(有 backing 文件),仅迁移活动的 overlay 文件,backing 文件保持不变。
实现原理
热迁移原理
热迁移通过 libvirt 的块迁移能力实现(virsh migrate --live --persistent --copy-storage-inc),不依赖共享存储,核心流程:
- 评估阶段:重新执行热迁移评估(测速 + 脏页速率),不满足条件即中止
- SSH 信任:将源节点 SSH 公钥写入目标节点(
qemu+ssh传输通道) - 目标预创建:按每块磁盘的格式与 backing 链在目标存储预创建磁盘文件(先校验剩余空间);UEFI 虚拟机同时预创建 NVRAM 文件
- 增量传输:内存页面与磁盘块增量传输至目标节点
- 最终切换:脏页收敛后暂停源虚拟机,完成最终同步并在目标节点恢复运行
- 目标接管:源节点调用目标面板的
/migration/adopt-vm完成账户与网络接管
失败回滚:热迁移失败时自动清理目标节点已创建的磁盘与 NVRAM 文件、恢复 CPU 限制;源节点虚拟机不受影响。
冷迁移原理
冷迁移在虚拟机关机状态下进行:
- 确认关机:要求虚拟机处于
shut off状态 - 复制磁盘:通过
rsync -aS(稀疏感知)逐盘复制 overlay 磁盘到目标存储(链式盘的 backing 文件需已通过 backing 校验存在于目标节点) - 传输配置:导出虚拟机 XML 并按目标存储路径替换磁盘位置
- 更新定义:在目标节点
virsh define定义虚拟机 - 保留源副本:迁移成功后源节点的虚拟机定义与磁盘文件继续保留(不做自动清理)
目标节点接管(adopt)
热迁移成功后,源节点会以管理员身份调用目标面板的 POST /migration/adopt-vm 完成接管:
- 校验目标域存在,必要时补建 UEFI NVRAM 文件
- 在目标面板创建或更新同名用户(快照式同步邮箱、密码、配额等),非管理员用户绑定 VM 归属
- 轻量云用户补建轻量云配额与专属网络;标准模式绑定目标 VPC(未指定时使用默认 VPC)
- 保存虚拟机凭据、刷新 VM 缓存
- 按预检映射重建端口转发规则(目标端口被占用时自动重新分配)
API 接口
| 方法 | 路径 | 说明 | 执行方式 |
|---|---|---|---|
GET | /nodes/{id}/migration-options | 获取节点迁移选项(目标存储列表等) | 同步 |
POST | /vm/{name}/migration/preview | 迁移预检(含热迁移评估,测速阶段较长) | 同步 |
POST | /vm/{name}/migrate | 提交整机迁移 | 异步任务(vm_migrate) |
GET | /vm/{name}/disk-migration/options | 获取单硬盘迁移表单选项 | 同步 |
POST | /vm/{name}/disk/{dev}/migrate | 提交硬盘迁移 | 异步任务(vm_disk_migrate) |
POST | /migration/adopt-vm | 节点间内部接管接口(由源节点调用目标节点) | 同步 |
所有迁移提交接口均要求高风险二次验证;虚拟机处于迁移中时重复提交返回 409,并阻止对该虚拟机的电源操作、配置修改与删除。
最佳实践
迁移策略
- 预检优先:迁移前务必执行预检,避免迁移失败
- 错峰迁移:在业务低峰期执行迁移,减少对业务的影响
- 监控迁移:迁移过程中密切关注脏页速率和迁移进度
故障处理
- 迁移失败:查看任务详情中的错误信息,常见原因包括存储空间不足、网络中断等
- 回滚操作:迁移失败时,虚拟机通常会保留在源节点,可继续使用
- 热迁移需要源和目标节点的 CPU 兼容,建议使用同型号 CPU
- 迁移过程中请勿对虚拟机进行其他操作
- 确保目标节点有足够的存储空间容纳迁移的虚拟机