外观
在线迁移与离线迁移
组好集群之后,最直接的收益就是能把客户机从一个节点挪到另一个节点——做节点维护、升级、或者负载不均衡时都会用到。这篇讲清楚什么情况下能在线(不停机)迁移,什么情况下只能离线(先关机再搬)。
为什么需要它
常见场景:
- 要重启某个节点打补丁,先把上面的虚拟机迁走。
- 某个节点负载太高,把几台客户机挪到空闲的节点。
- 硬件要下线维修或退役,配合安全移除节点先清空节点。
开始之前
迁移能不能在线,取决于三件事:
| 条件 | 说明 |
|---|---|
| 磁盘位置 | 磁盘在共享存储(Ceph、NFS、iSCSI 等所有节点都能访问的存储)上,才能真正无缝在线迁移;磁盘在本地存储上,PVE 会在迁移过程中把整块磁盘通过网络搬过去,期间仍然可以不停机,但耗时取决于磁盘大小和网络带宽 |
| 有无存储复制 | 如果目标节点上已经有这台客户机的 ZFS 存储复制副本,迁移只需要同步增量,快得多 |
| CPU 类型 | 虚拟机 CPU 类型选了 host(见创建第一个虚拟机的 CPU 一节),只能迁移到指令集兼容的节点;选通用型号(如 x86-64-v2-AES)才能自由迁移到任意节点 |
容器(LXC)和虚拟机(KVM)不完全一样
虚拟机可以做真正的在线迁移(内存状态一起搬过去,几乎无感知中断)。容器的在线迁移能力和实现方式以你的版本文档为准——不确定的话按"会有短暂中断"来规划维护窗口,不要假设它和虚拟机的在线迁移完全等价。
本地磁盘的在线迁移会占用网络带宽,可能拖慢集群
把一块几十上百 GB 的本地磁盘在线迁移到另一个节点,数据要整块通过网络传输。如果没有为迁移单独规划网络(默认经管理网络或按 datacenter.cfg 里的 migration 设置走指定网段),会和其他流量(客户机对外访问、其他备份/迁移任务)抢带宽。生产环境建议给迁移单独配一个网段,规划方法和 corosync 链路类似,见集群进阶。
操作步骤
Web UI
右键点选中的虚拟机/容器 → Migrate:
- 选择目标节点。
- 如果磁盘在本地存储,需要选择目标节点上对应的存储(做存储映射)。
- 勾选 Online(可选项是否出现取决于当前状态和存储条件)发起在线迁移;不勾选则会先关机再搬,即离线迁移。
- 观察任务日志里的进度,迁移完成后客户机会出现在目标节点下。
命令行
sh
# 在线迁移虚拟机 100 到 node2
qm migrate 100 node2 --online
# 容器迁移,具体是否支持在线以及命令参数以你的版本 man pct 为准
pct migrate 200 node2<vmid>/<ctid> 换成实际编号,在 Web UI 左侧树客户机名称前能看到。
检查结果
- 目标节点上出现该客户机,原节点上消失。
- 在目标节点执行
qm status <vmid>(或pct status <ctid>),确认状态为running。 - 客户机内部网络、磁盘数据保持不变——用测试客户机先跑一遍,确认应用没有异常。
- 查看 Web UI 的任务日志,确认迁移任务是
OK结束,没有报错。
常见问题
迁移选项里没有 Online,只能离线迁移。 通常是磁盘在本地存储且目标节点没有该客户机的存储复制副本,或者客户机当前配置不满足在线迁移条件(例如挂了直通设备)。挂了 PCI/USB 直通的客户机一般不能在线迁移。
迁移失败,报 CPU 不兼容。 虚拟机 CPU 类型选了 host,目标节点的物理 CPU 指令集和源节点不完全一致。改成通用 CPU 类型需要重启虚拟机才能生效,不能迁移中途切换。
迁移很慢。 检查是走了哪个网络(管理网还是专用迁移网),以及磁盘是不是在本地存储上做整盘复制。给目标节点配置存储复制可以把后续迁移的数据量降到只有增量。
迁移完成后原节点上还留着旧配置或磁盘残留。 正常迁移会自动清理;如果任务中途失败,检查 Web UI 任务日志的报错,必要时手动核对源节点和目标节点上是否都残留了同一 VMID 的文件。