目录

Libvirt 的 Live Migration

Libvirt 的 Live Migration 主要分为两个层面

  • 网络数据传输层面
  • 控制层面

网络数据传输层

  1. 基于 Hypervisor 的传输,两个 Hypervisor 之间直接建立数据传输连接。优点:数据传输量少。缺点:需要额外配置 Hypervisor Network。需要在防火墙上面打开更多的端口来支持并发迁移,数据不一定支持加密(取决于 Hypervisor 实现)。

  2. 基于 libvirtd Tunnel 的传输,源主机和目标主机上运行的 libvirtd 之间建立 RPC 隧道来传输数据。数据要先拷贝到 libvirtd,再由 libvirtd 中继到目标主机的 libvirtd。优点:不需要重新配置网络,防火墙上面只需要一个端口就可以支持并发迁移,数据强加密。缺点:相关的数据拷贝多,所有流量都通过一个端口,容易造成网络拥堵。



    在 Tunnel 传输模式下,同一份数据需要被拷贝多次,并且所有的流量都通过一个端口,在大内存、高业务(快速增加 RAM 脏数据)的场景下,同样的网络带宽,Tunnel 传输模式迁移速率较慢。因此,对于大内存、业务繁忙的场景下,首选基于 Hypervisor 的传输。

控制层

  1. Client 控制:由 Libvirt Client 直接控制迁移。Client 跟源主机 libvirtd 连接,也跟目的主机 libvirtd 连接,当目的主机迁移过程出现异常会反馈给 Client,再由 Client 通知源 libvirtd。整个过程,由 Client 主导控制。

  2. 源主机 libvirtd 控制:由源主机 libvirtd 主导整个迁移过程。Client 仅作为迁移指令的发起者,将迁移指令异步发送给源主机 libvirtd。如果目的主机迁移过程出现异常会反馈给源主机 libvirtd。这种方式的好处是,Client 故障也不会影响到整个迁移过程。

  3. Hypervisor 控制:有源主机 Hypervisor 控制整个迁移过程,Client 向源主机 Hypervisor 发送迁移指令,源主机和目的主机的 libvirtd 不参与控制。这种方式的前提是 Hypervisor 自身支持热迁移,好处在于 Client 和 libvirtd 的故障不会影响到整个迁移过程。

通过 libvirt 库实现虚拟机迁移的示例

import libvirt
import pprint conn_src = libvirt.open('qemu+tcp://username@src_server/system')
conn_dest = libvirt.open('qemu+tcp://username@dest_server/system') vm_domain = conn_src.lookupByName('instance_name')
vm_domain.migrate(conn_dest, True, 'instance_name', None, 0) pprint.pprint(help(vm_domain.migrate))

KVM 的预拷贝(Pre-Copy)Live Migration 过程

Step 1. 系统验证目标服务器的存储器和网络设置是否正确,并预保留目标服务器虚拟机的资源。

Step 2. 当虚拟机还在源服务器上运转时,第一个循环内将全部内存镜像复制到目标服务器上。在这个过程中,KVM 依然会监视内存的任何变化。

Step 3. 以后的循环中,检查上一个循环中内存是否发生了变化。 假如发生了变化,那么 VMM 会将发生变化的内存页即 dirty pages 重新复制到目标服务器中,并覆盖掉先前的内存页。在这个阶段,VMM 依然会继续监视内存的变化情况。

Step 4. VMM 会持续这样的内存复制循环。随着循环次数的增加,所需要复制的 dirty pages 就会明显减少,而复制所耗费的时间就会逐渐变短,那么内存就有可能没有足够的时间发生变化。最后,当源服务器与目标服务器之间的差异达到一定标准时,内存复制操作才会结束,同时暂停源系统。

Step 5. 在源系统和目标系统都停机的情况下,将最后一个循环的 dirty-pages 和源系统设备的工作状态复制到目标服务器。

Step 6. 然后,将存储从源系统上解锁,并锁定在目标系统上。启动目标服务器,并与存储资源和网络资源相连接。

参考资料

https://www.ibm.com/developerworks/cn/linux/l-cn-mgrtvm1/index.html

Libvirt Live Migration 与 Pre-Copy 实现原理的更多相关文章

  1. OpenStack 虚拟机冷/热迁移的实现原理与代码分析

    目录 文章目录 目录 前文列表 冷迁移代码分析(基于 Newton) Nova 冷迁移实现原理 热迁移代码分析 Nova 热迁移实现原理 向 libvirtd 发出 Live Migration 指令 ...

  2. va_list原理及用法

    最后更新:2017-02-22 这是一篇很早很早的博客文章,虽然很基础,但是毕竟曾经历程,因此也保存下来 1. 概念 va_list 是在C语言中定义的宏,指在解决 变参问题是指参数的个数不定,可以是 ...

  3. Python的深浅copy详解

    Python的深浅copy详解 目录 Python的深浅copy详解 一.浅copy的原理 1.1 浅copy的定义 1.2 浅copy的方法 二.深copy的原理 2.1 深copy的定义 2.2 ...

  4. openstack Icehouse发布

    OpenStack 2014.1 (Icehouse) Release Notes General Upgrade Notes Windows packagers should use pbr 0.8 ...

  5. KVM虚拟机配置笔记

    KVM 全称是 Kernel-Based Virtual Machine.也就是说 KVM 是基于 Linux 内核实现的,KVM有一个内核模块叫 kvm.ko,只用于管理虚拟 CPU 和内存. 在 ...

  6. OpenStack 2014.1(Icehouse) 更新说明

    OpenStack 2014.1(Icehouse) 更新说明 1.综合升级说明 Ÿ   Windows安装包应使用PBR 0.8版本,以避免发生bug1294246 Ÿ   log-config选项 ...

  7. OpenStack 虚拟机冷/热迁移功能实践与流程分析

    目录 文章目录 目录 前文列表 虚拟机迁移的应用场景 需要迁移的虚拟机数据类型 虚拟机迁移的存储场景 文件存储 块存储 非共享存储 迁移的类型 迁移的方式 执行虚拟机冷迁移 冷迁移日志分析 执行虚拟机 ...

  8. Linux入门详解

    Linux基础知识 Linux&Unix 说起Linux,就不得不提Unix操作系统. Unix系统号称世界上最稳定的系统,就连苹果公司也从中获取灵感开发出了移动端大名鼎鼎的IOS. Unix ...

  9. openstack学习(一)kvm-libvirt

    准备工作: 操作系统:ubuntu 16.04 安装KVM Kernel-based Virtual Machine的简称,是一个开源的系统虚拟化模块,自Linux 2.6.20之后集成在Linux的 ...

随机推荐

  1. kotlin面向对象之枚举、印章类

    枚举: 由于这个比较简单,直接上代码: 下面使用一下: 印章类[Sealed class]: 听着挺新鲜的,下面以一个具体的场景来对它进行学习: 动物园里有三个动物如下,在天黑时它们污污的在做“游戏” ...

  2. 【bzoj 4318】OSU!

    题意 一个长度为 $n$ 的字符串,第 $i$ 位有 $p_i$ 的概率是 $1$,否则是 $0$.一个字符串的分数定义为:对于字符串中每一个极长的连续一段 $1$,设这段 $1$ 的长度为 $x$, ...

  3. 杜教BM模板

    #include<bits/stdc++.h> using namespace std; #define rep(i,a,n) for (int i=a;i<n;i++) #defi ...

  4. java多线程的四种实现方式

    主要有四种:继承Thread类.实现Runnable接口.实现Callable接口通过FutureTask包装器来创建Thread线程.使用ExecutorService.Callable.Futur ...

  5. Java常用类库——观察者设计模式

    观察者设计模式 现在很多的购房者都在关注着房子的价格变化,每当房子价格变化的时候,所有的购房者都可以观察得到.实际上以上的购房者都属于观察者,他们都关注着房子的价格. 如果要想实现观察者模式,则必须依 ...

  6. Mysql数据类型 来自官方手册5.6

    整形的取值范围:   定点数值(精确): 在MySQL中,NUMERIC被实现为DECIMAL,所以关于DECIMAL的以下说明同样适用于NUMERIC. MySQL以二进制格式存储DECIMAL值. ...

  7. P1801 黑匣子[对顶堆]

    没错我就是专门找对顶堆练习题的.现在感觉对顶堆使用面有点狭窄.这道题由于我询问是随时间单调增的,而且数据比较友好,应该是插入几次就询问一下的.而中位数那题也是经常询问的.如果查询的东西不单调,或者查询 ...

  8. dlsym用法

    1. 包含头文件 #include<dlfcn.h> 2. 函数定义 void *dlsym(void *handle, const char* symbol); handle是使用dlo ...

  9. 使用Nginx的proxy_cache缓存功能取代Squid[原创]

    使用Nginx的proxy_cache缓存功能取代Squid[原创] [文章作者:张宴 本文版本:v1.2 最后修改:2009.01.12 转载请注明原文链接:http://blog.zyan.cc/ ...

  10. MAC下安装Homebrew和GDB,并解决无法调试问题

    Homebrew官网 http://brew.sh/index_zh-cn.html Homebrew是神马 linux系统有个让人蛋疼的通病,软件包依赖,好在当前主流的两大发行版本都自带了解决方案, ...