参考:https://zhuanlan.zhihu.com/p/27055555

在线迁移过程划分为三个阶段:准备阶段、迁移阶段和切换阶段。
迁移环境为虚拟化底层KVM+Qemu、虚拟化管理Libvirt、虚拟化网络Openvswitch。

准备阶段

  • Step.1 选择一台具有足够磁盘和内存资源的物理机DestHost,并在DestHost上创建VM对应的系统盘和数据盘,同时选定接收迁移数据的tcp端口(如图 1-1所示),这两个磁盘在DestHost和SourceHost上的路径必须完全一致。不同的是,DestHost上初始创建的只是空盘,上面没有真实数据。
图 1-1在目标端新建虚拟机镜像
  • Step.2 通过虚拟化管理软件Libvirt在DestHost上创建一个和VM同样配置的虚拟机VM’,系统盘和数据盘使用Step.1中创建的系统盘和数据盘(如图 1-2所示)。VM’当前是paused状态,虚拟机VM’的vcpu处于暂停状态,同时虚拟机VM’会通过监听一个内网的tcp端口来接收迁移数据
图 1-2 在目标端创建新虚拟机

迁移阶段

  • Step.3 虚拟化管理层Libvirt给VM对应的Qemu进程发出一个迁移指令,并指定参数,例如指定DestHost为目标、需要迁移块设备、最大停机时间、迁移带宽限制等,然后迁移数据就会通过指定tcp链路传输给DestHost上的VM’。需要注意,迁移数据的网络包不是经过 vswitch,而是直接从SourceHost的ethx网卡出,进到DestHost的ethx,因为VM’对应Qemu进程正作为DestHost一个用户态进程,监听在ethx对应的内网ip(如图 1-3所示)。

    图 1-3 虚拟机迁移数据
  • step.4 经过前面三步,虚拟机的数据就正式开始迁移,剩下的挑战是如何保证数据迁移的一致性,因为此时VM处于运行状态,里面时刻发生内存更新、磁盘io操作和设备状态变更,而VM’是paused状态,只通过一个线程接收VM进程发过来的数据。

为此,在迁移过程中各种数据如何有序迁移?首先,Libvirt会发送qmp_dirve_mirror命令来通知Qemu进行虚拟机磁盘数据迁移,从而在源端和目标端直接同步磁盘数据。然后,Libvirt会再次发送qmp_migrate命令通知Qemu进行虚拟机内存数据迁移,进一步完成虚拟机主要数据的迁移。最后,由于设备状态对应的数据量很少,在迁移最后阶段会通过一次性同步,将Qemu里每个设备注册的状态同步到目标端。

另外,迁移过程中发生变更的数据如何迁移?如果不迁移变更的数据,那数据必然不一致,也表明迁移还不能结束,因此Qemu一般通过数据迁移准备、数据迁移、数据迁移收尾三个步骤来完成。

循环调用磁盘和内存迁移函数也是按阶段来分别调用的。首先,循环调用磁盘和内存迁移函数的迁移数据准备功能,即前期准备工作,例如把磁盘按block为单位组织成一个数组,并设置记录脏块机制;把内存所有页全部设置为脏页,并发送开始迁移的标志到VM’的进程。

紧接着,需要进行真正的数据迁移,Qemu在这个阶段调用磁盘和内存迁移函数的第二步骤功能,并且要求必须等磁盘数据迁移完成后才会执行内存数据迁移。如图 1-4所示,Qemu首先会进行磁盘(内存)的全量数据迁移,依次将每个block(页)迁移到目标端DestHost。


图 1-4 全量数据迁移示意图

然后再通过多次迭代,将迁移过程中虚拟机产生的新数据迁移到目标端DestHost(如图 1-5所示)。这一迭代过程是收敛的,收敛依据与之前设置的带宽、最大停机时间有关。同时,在迭代过程中,Qemu将边迁移边记录剩下的脏数据大小,并与停机时间进行比较,如果这个值比停机时间大,那么继续迁移,如果比停机时间小,那么源端Qemu进程就会暂停,从而避免产生新的脏数据,以便进行迁移收尾工作。
在虚拟机暂停之后,进入第三步迁移收尾工作,源端Qemu进程会把磁盘、内存脏数据和设备状态一次性同步到目标端,完成时VM和VM’的数据将会一致。这时,上层管理软件会把VM关闭,并把VM’的vcpu恢复运行状态,整个虚拟机的数据迁移就完成了。

图 1-5 增量数据迁移示意图

切换阶段

  • Step.5 数据迁移完成后,VM关闭,VM’作为它的一个完全拷贝,在DestHost上运行着,但网络还是不通的(如图 1-2所示)。VM’通过DestHost的vswitch 连接到物理机网卡,vswitch相当于一个虚拟交换机,而VM从SourceHost迁移到DestHost,在网络上相当于把网线从一个交换机拔下插到另一个交换机上,此时就需要一次arp广播,告知VM的mac地址已经变更到另外一台交换机的某个端口。

这就是迁移完成后的网络切换,由于切换时间很短,少于tcp的超时重传时间,因此对于原VM上跑着网络服务程序几乎是无感知的。此后,如图 1-6所示,目标端DestHost虚拟机就具备和用户直接进行交互的能力,而源端SourceHost虚拟机此时就可以删除。


图 1-6 完成虚拟机迁移示意图

整个迁移过程对用户来说是透明的。
虽然,当前KVM虚拟化在线迁移能够满足大多数情况下的用户虚拟机迁移,但还存在以下问题:

- 在磁盘和内存负载高的情况下,存在迁移无法完成的情况;
- 跨机迁移存在网络中断时间长的问题;
- 跨存储类型的场景下如何进行迁移;
- 如何应用迁移进行虚拟机组件的更新。

虚拟化学习笔记-KVM虚拟化跨机迁移原理的更多相关文章

  1. kvm虚拟化学习笔记(二)之linux kvm虚拟机安装

    KVM虚拟化学习笔记系列文章列表----------------------------------------kvm虚拟化学习笔记(一)之kvm虚拟化环境安装http://koumm.blog.51 ...

  2. KVM虚拟化学习笔记系列文章列表(转)

    Kernel-based Virtual Machine KVM虚拟化学习笔记系列文章列表----------------------------------------kvm虚拟化学习笔记(一)之k ...

  3. kvm虚拟化学习笔记(四)之kvm虚拟机日常管理与配置

    KVM虚拟化学习笔记系列文章列表----------------------------------------kvm虚拟化学习笔记(一)之kvm虚拟化环境安装http://koumm.blog.51 ...

  4. kvm虚拟化学习笔记(一)之kvm虚拟化环境安装

    平时一直玩RHEL/CentOS/OEL系列的操作,玩虚拟化也是采这一类系统,kvm在RHEL6系列操作系统支持比较好,本文采用采用OEL6.3操作系统,网上所有文章都说KVM比xen简单,我怎么感觉 ...

  5. kvm虚拟化学习笔记(三)之windows kvm虚拟机安装

    KVM虚拟化学习笔记系列文章列表----------------------------------------kvm虚拟化学习笔记(一)之kvm虚拟化环境安装http://koumm.blog.51 ...

  6. 学习笔记:AJAX 跨域问题

    学习笔记:AJAX 跨域问题 AJAX 跨域是浏览器的问题. 只要 xhr 请求,不同的域名就会出现 AJAX 跨域问题. JSONP 是一要简单方式,但是有很多弊端,需要修改服务端代码. JSONP ...

  7. OpenCV学习笔记(27)KAZE 算法原理与源码分析(一)非线性扩散滤波

    http://blog.csdn.net/chenyusiyuan/article/details/8710462 OpenCV学习笔记(27)KAZE 算法原理与源码分析(一)非线性扩散滤波 201 ...

  8. 并发编程学习笔记(5)----AbstractQueuedSynchronizer(AQS)原理及使用

    (一)什么是AQS? 阅读java文档可以知道,AbstractQueuedSynchronizer是实现依赖于先进先出 (FIFO) 等待队列的阻塞锁和相关同步器(信号量.事件,等等)提供一个框架, ...

  9. Linux虚拟化学习笔记<一>

    关于虚拟化,原理的东西是非常复杂的,要想完全理解,没有足够的耐心是不不能完全学透这部分内容的.那下面我主要以资源汇总的形式把一些资料罗列出来,帮助大家快速理解虚拟化,快速使用和配置. 为什么要虚拟化: ...

随机推荐

  1. 少儿编程Scratch第一讲:Scratch完美的初体验

    素材及视频下载 链接:https://pan.baidu.com/s/1qX0T2B_zczcLaCCpiRrsnA提取码:xfp8 都说未来是人工智能.计算机程式控制的时代,如何让青少年接触计算机编 ...

  2. 登录窗口java

    这次代码是登录窗口的制作. 主要的方面是是包括,用户名.密码.验证码.以及输入数据所需要的文本框,对于验证码可以通过点击验证码进行修改.同时对于验证码的前景色和背景色同时都得到修改. 点击注册(这里还 ...

  3. django rest framework用户认证

    django rest framework用户认证 进入rest framework的Apiview @classmethod def as_view(cls, **initkwargs): &quo ...

  4. TP基础

    一.目录结构 解压缩到web目录下面,可以看到初始的目录结构如下: www WEB部署目录(或者子目录)├─index.php 入口文件├─README.md README文件├─Applicatio ...

  5. 22 Extends 继承(子类、父类)

    本章主要介绍继承的 概念.方法重写(@Override注解的使用).使用场景.方法的执行顺序 /*1.继承的 概念 * 继承:多个类有共同的成员变量和成员方法,抽取到另外一个类中(父类),在让多个类去 ...

  6. hive常用函数五

    复合类型构建操作 1. Map类型构建: map 语法: map (key1, value1, key2, value2, …) 说明:根据输入的key和value对构建map类型 举例: hive& ...

  7. Byte字节

    字节(Byte )是计算机信息技术用于计量存储容量的一种计量单位,作为一个单位来处理的一个二进制数字串,是构成信息的一个小单位.最常用的字节是八位的字节,即它包含八位的二进制数. 中文名 字节 外文名 ...

  8. AJ学IOS(44)之网易彩票自定义图片在右边的Button_弹出view_ios6,7简单适配

    AJ分享,必须精品 效果: 注意图里面了吗,其实那个效果做起来真的很简单,在iOS中苹果给我们封装的很好,关键是那个按钮 系统的按钮的图片是在左边的,这里我们需要把他调整到右边,然后呢需要我们自己做一 ...

  9. python圆周率计算小程序(非常慢)

    源码: from math import fabs #导入数学模块 from time import perf_counter #导入时间模块 from numba import jit @jit d ...

  10. PHP函数:fwrite

    fwrite()  - 写入文件(可安全用于二进制文件) 说明: fwrite ( resource $handle , string $string [, int $length ] ) : int ...