我们常常遇到需要迁移虚拟机的问题,比如需要维护某台设备,会将设备上的一切应用迁移到另一台设备。但是如何将虚拟机进行迁移呢?好比说,虚拟机中正在运行一个程序,这个程序有源源不断的数据访问,怎么使得在不影响这些访问的情况下把虚拟机迁移到领一台服务器上呢?
尤其是当远程迁移的时候,怎么在虚拟机不崩溃的情况下迁移走所有的状态?
快照技术
snapshot(快照)就是将虚拟机的各种状态全部记录下来,存进硬盘里,等待下一次开启虚拟机的时候读取,这些状态包括:
- vCPU 状态(寄存器等)
- I/O设备状态
- 虚拟磁盘状态(利用写时拷贝技术)
- 所有的内存状态(实现最困难)
内存迁移
内存是最难处理的,因为它一直在变化。内存实时读写,导致我们没有办法截取某一时刻对内存进行拷贝。这就形成了两种处理方法:
pre-copy
- 将当前时刻所有的内存状态复制并发送到远程服务器,先不管实时更新的内存状态;
- 将新时刻的已改变的内存复制并发送到远程服务器:
(1).VMM会对所有的页进行写保护,当有数据改变时,标记该页为“赃页”;
(2).VMM将所有“赃页”拷贝进缓冲区,将缓冲区通过网络发送到远程服务器;
(3). 由于相关联的内存的局部性,赃页的数目很小,先设为
D
t
(
M
)
D_{t(M)}
Dt(M),t为时刻,M为内存大小
(4).要求发送内存的时间
t
i
=
t
(
D
t
i
−
1
)
≤
t
i
−
1
t_i = t(D_{t_{i-1}})\leq t_{i-1}
ti=t(Dti−1)≤ti−1
- 重复步骤2,直到
D
t
i
D_{t_{i}}
Dti足够小
(1).决定于可容忍的宕机时间
(2).迁移10MB的页仅仅需要宕机几毫秒
- 如果赃页太多,到达了阈值,停止虚拟机,复制剩余的赃页,vcpu和内存状态
- 远程重启虚拟机。
这样的话,只要宕机时间小于客户端的网络超时时间(通常设置为10s),就可以不丢失访问数据。
post-copy
- 先将vCPU状态复制到远程主机
- 虚拟机操作将会导致页错误
- 一旦远程主机可以被访问,直接将错误页拷贝到远程主机
优点:新服务器可以直接启动
缺点:剩余页将会在原主机保存很久,原主机的虚拟机是停止的,但是内存仍在读取数据。