虚拟化学习笔记-KVM虚拟化跨机迁移原理
在线迁移过程划分为三个阶段:准备阶段、迁移阶段和切换阶段。
迁移环境为虚拟化底层KVM+Qemu、虚拟化管理Libvirt、虚拟化网络Openvswitch。
准备阶段
- Step.1 选择一台具有足够磁盘和内存资源的物理机DestHost,并在DestHost上创建VM对应的系统盘和数据盘,同时选定接收迁移数据的tcp端口(如图 1-1所示),这两个磁盘在DestHost和SourceHost上的路径必须完全一致。不同的是,DestHost上初始创建的只是空盘,上面没有真实数据。
- Step.2 通过虚拟化管理软件Libvirt在DestHost上创建一个和VM同样配置的虚拟机VM’,系统盘和数据盘使用Step.1中创建的系统盘和数据盘(如图 1-2所示)。VM’当前是paused状态,虚拟机VM’的vcpu处于暂停状态,同时虚拟机VM’会通过监听一个内网的tcp端口来接收迁移数据
迁移阶段
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。
然后再通过多次迭代,将迁移过程中虚拟机产生的新数据迁移到目标端DestHost(如图 1-5所示)。这一迭代过程是收敛的,收敛依据与之前设置的带宽、最大停机时间有关。同时,在迭代过程中,Qemu将边迁移边记录剩下的脏数据大小,并与停机时间进行比较,如果这个值比停机时间大,那么继续迁移,如果比停机时间小,那么源端Qemu进程就会暂停,从而避免产生新的脏数据,以便进行迁移收尾工作。
在虚拟机暂停之后,进入第三步迁移收尾工作,源端Qemu进程会把磁盘、内存脏数据和设备状态一次性同步到目标端,完成时VM和VM’的数据将会一致。这时,上层管理软件会把VM关闭,并把VM’的vcpu恢复运行状态,整个虚拟机的数据迁移就完成了。
切换阶段
- Step.5 数据迁移完成后,VM关闭,VM’作为它的一个完全拷贝,在DestHost上运行着,但网络还是不通的(如图 1-2所示)。VM’通过DestHost的vswitch 连接到物理机网卡,vswitch相当于一个虚拟交换机,而VM从SourceHost迁移到DestHost,在网络上相当于把网线从一个交换机拔下插到另一个交换机上,此时就需要一次arp广播,告知VM的mac地址已经变更到另外一台交换机的某个端口。
这就是迁移完成后的网络切换,由于切换时间很短,少于tcp的超时重传时间,因此对于原VM上跑着网络服务程序几乎是无感知的。此后,如图 1-6所示,目标端DestHost虚拟机就具备和用户直接进行交互的能力,而源端SourceHost虚拟机此时就可以删除。
整个迁移过程对用户来说是透明的。
虽然,当前KVM虚拟化在线迁移能够满足大多数情况下的用户虚拟机迁移,但还存在以下问题:
- 在磁盘和内存负载高的情况下,存在迁移无法完成的情况;
- 跨机迁移存在网络中断时间长的问题;
- 跨存储类型的场景下如何进行迁移;
- 如何应用迁移进行虚拟机组件的更新。
虚拟化学习笔记-KVM虚拟化跨机迁移原理的更多相关文章
- kvm虚拟化学习笔记(二)之linux kvm虚拟机安装
KVM虚拟化学习笔记系列文章列表----------------------------------------kvm虚拟化学习笔记(一)之kvm虚拟化环境安装http://koumm.blog.51 ...
- KVM虚拟化学习笔记系列文章列表(转)
Kernel-based Virtual Machine KVM虚拟化学习笔记系列文章列表----------------------------------------kvm虚拟化学习笔记(一)之k ...
- kvm虚拟化学习笔记(四)之kvm虚拟机日常管理与配置
KVM虚拟化学习笔记系列文章列表----------------------------------------kvm虚拟化学习笔记(一)之kvm虚拟化环境安装http://koumm.blog.51 ...
- kvm虚拟化学习笔记(一)之kvm虚拟化环境安装
平时一直玩RHEL/CentOS/OEL系列的操作,玩虚拟化也是采这一类系统,kvm在RHEL6系列操作系统支持比较好,本文采用采用OEL6.3操作系统,网上所有文章都说KVM比xen简单,我怎么感觉 ...
- kvm虚拟化学习笔记(三)之windows kvm虚拟机安装
KVM虚拟化学习笔记系列文章列表----------------------------------------kvm虚拟化学习笔记(一)之kvm虚拟化环境安装http://koumm.blog.51 ...
- 学习笔记:AJAX 跨域问题
学习笔记:AJAX 跨域问题 AJAX 跨域是浏览器的问题. 只要 xhr 请求,不同的域名就会出现 AJAX 跨域问题. JSONP 是一要简单方式,但是有很多弊端,需要修改服务端代码. JSONP ...
- OpenCV学习笔记(27)KAZE 算法原理与源码分析(一)非线性扩散滤波
http://blog.csdn.net/chenyusiyuan/article/details/8710462 OpenCV学习笔记(27)KAZE 算法原理与源码分析(一)非线性扩散滤波 201 ...
- 并发编程学习笔记(5)----AbstractQueuedSynchronizer(AQS)原理及使用
(一)什么是AQS? 阅读java文档可以知道,AbstractQueuedSynchronizer是实现依赖于先进先出 (FIFO) 等待队列的阻塞锁和相关同步器(信号量.事件,等等)提供一个框架, ...
- Linux虚拟化学习笔记<一>
关于虚拟化,原理的东西是非常复杂的,要想完全理解,没有足够的耐心是不不能完全学透这部分内容的.那下面我主要以资源汇总的形式把一些资料罗列出来,帮助大家快速理解虚拟化,快速使用和配置. 为什么要虚拟化: ...
随机推荐
- SSM 三大框架系列:Spring 5 + Spring MVC 5 + MyBatis 3.5 整合(附源码)
之前整理了一下新版本的 SSM 三大框架,这篇文章是关于它的整合过程和项目源码,版本号分别为:Spring 5.2.2.RELEASE.SpringMVC 5.2.2.RELEASE.MyBatis ...
- (js描述的)数据结构[双向链表](5)
(js描述的)数据结构[双向链表](5) 一.单向链表的缺点 1.只能按顺序查找,即从上一个到下一个,不能反过来. 二.双向链表的优点 1.可以双向查找 三.双向链表的缺点 1.结构较单向链表复杂. ...
- js定义类的方法
ECMAScript6已经支持了class,但之前版本都不支持类,但是可以通过一些方法来模拟类. js中的类,既是重点,也是难点,很多时候都感觉模棱两可. 首先强调一下js中很重要的3个知识点:thi ...
- Node.js 的事件循环机制
目录 微任务 事件循环机制 setImmediate.setTimeout/setInterval 和 process.nextTick 执行时机对比 实例分析 参考 1.微任务 在谈论Node的事件 ...
- JPA入门例子(采用JPA的hibernate实现版本) --- 会伴随 配置文件:persistence.xml
JPA入门例子(采用JPA的hibernate实现版本) 分类: j2se2011-03-30 16:09 45838人阅读 评论(9) 收藏 举报 jpahibernate数据库jdbcjava框架 ...
- log4j入门(转) --- 很详细 也很简单容易懂
log4j入门(转) Log4j实在是很熟悉,几乎所有的Java项目都用它啊.但是我确一直没有搞明白.终于有一天我受不了了,定下心去看了一把文档,才两个小时,我终于搞明白了.一般情况下Log4j总是和 ...
- AJ学IOS 之微博项目实战(4)微博自定义tabBar中间的添加按钮
AJ分享,必须精品 一:效果图 自定义tabBar实现最下面中间的添加按钮 二:思路 首先在自己的tabBarController中把系统的tabBar设置成自己的tabBar(NYTabBar),这 ...
- AJ学IOS 之微博项目实战(1)微博主框架-子控制器的添加
AJ分享,必须精品 一:简单介绍 这是新浪微博的iOS端项目,来自于黑马的一个实战项目. 主要分成五大模块,本次全部运用纯代码实现,其中会用到很多前面学过得内容,如果有的地方有重复的知识点,说明这个知 ...
- week7_简单题_C_水题_hdu_5578+F_贪心_hdu_5583
C HDU_5578 求字符串中所有相同字母的最小距离H. Input 实例个数T然后T行字符串字符串中仅含有小写字母.1≤T≤501≤len≤1000(len为字符串长度) Output ...
- Cilium使用 (Cilium 3)
使用k3s测试Cilium,安装步骤可以参见官方文档 Cilium安装使用 docker安装 使用如下命令安装最新版本的docker yum install -y yum-utils \ device ...