OpenStack的Resize和冷迁移代码解析及改进

原文:http://www.hengtianyun.com/download-show-id-79.html

OpenStack的Resize(升级)功能,我们可以改变虚拟机的CPU核数、内存及磁盘大小,当然虚拟机只能向上升级,不允许向下降级。通过分析源代码,我们发现Resize的过程其实就是冷迁移的过程,Resize多传进去了一个flavor参数。下面将分析OpenStack升级虚拟机和冷迁移的功能。

一、前端入口

(一) Resize

/usr/share/openstack-dashboard/openstack_dashboard/dashboards/project/instances/workflows/resize_instance.py

从上面的代码可知,传了两个相关参数进去,第一个为虚拟机id(instance_id),第二个为升级的flavor。继续深入api.nova.server_resize

/usr/share/openstack-dashboard/openstack_dashboard/api/nova.py

从代码可知,利用novaclient客户端,向后端发出升级请求

(二) 冷迁移

/usr/share/openstack-dashboard/openstack_dashboard/dashboards/admin/instances/tables.py

前段通过api.nova.server_migrate发起迁移请求,其中参数obj_id就是虚拟机的id,深入api.nova.server_migrate

/usr/share/openstack-dashboard/openstack_dashboard/api/nova.py

从代码可知,利用novaclient客户端,向后端发出迁移请求

二、后端响应

当novaclient发出请求时,一般由nova-api组件作出响应。我们将分别分析nova-api如何对resize和冷迁移进行响应。

(一) Resize

对Resize请求进行响应的函数位于文件

/usr/lib/python2.7/dist-packages/nova/api/openstack/compute/servers.py

继续深入self._resize()函数

从上述代码可知,最后通过compute_api.resize进行调用,它传了instance和flavor_id两个参数进去

(二) 冷迁移

/usr/lib/python2.7/dist-packages/nova/api/openstack/compute/contrib/admin_actions.py

从代码可知,冷迁移也调用了compute_api.resize(),相比Resize功能,它只传了instance一个参数进去

(三) Resize和冷迁移的共同过程

下面将从compute_api.resize()开始分析,这段代码位于文件

/usr/lib/python2.7/dist-packages/nova/compute/api.py

/usr/lib/python2.7/dist-packages/nova/conductor/api.py

Nova-conductor组件响应请求

/usr/lib/python2.7/dist-packages/nova/conductor/manager.py

函数_cold_migrate()

通过上述代码我们发现,首先是通过rpc调用nova-scheduler组件调度最优节点。调度算法分为两个阶段,即filter和weight。首先是过滤(filter),从所有的主机中找到符合实例运行条件的主机,然后从过滤出来的主机中,找到最合适的一个主机。

过滤阶段系统默认调用的filter主要包括RetryFilter、AvailabilityZoneFilter、RamFilter、ComputeFilter、ComputeCapabilitiesFilter、ImagePropertiesFilter,其中比较重要的filter包括AvailabilityZoneFilter和RamFilter,AvailabilityZoneFiter保证了调度发生在同一个zone,RamFilter确保了内存是否足够,默认情况下,ram的扩大系数为1.5,也就是假如物理内存为100G,内存被虚拟为150G,通过nova.conf配置文件,我们可以改变扩大系数。此外,通过配置文件,我们还可以改变调用的过滤器,除了上述过滤器外,我们还可以使用CoreFilter、DiskFilter、IoOpsFilter等。这些都是系统自带的过滤器,我们也可以根据需求,自己构造过滤器。

Weight阶段,从它做的工作来看,就是从符合条件的主机中选择“最合适”的主机,这个选择的过程是通过“评分”来实现的。现阶段的weight很简单,主要通过RAMWeigher进行权衡,剩余内存越大,权值越大。

当上述工作完成后,若未挑选出合适的节点,Resize过程结束,系统报错,若挑选出了合适节点,开始Resize流程,首先,rpc调用目的节点的nova-compute,即self.compute_rpcapi.prep_resize。

目的节点nova-compute开始响应

/usr/lib/python2.7/dist-packages/nova/compute/manager.py(2885)_prep_resize()

在prep_resize阶段,主要保存了虚拟机Resize前后的状态,最后通过rpc调用源节点的nova-compute,即self.compute_rpcapi.resize_instance

/usr/lib/python2.7/dist-packages/nova/compute/manager.py(3020)resize_instance()

上述代码,一个比较重要的过程就是迁移磁盘文件,该功能通过self.driver.migrate_disk_and_power_off这个函数实现,我们可以具体看一下这个函数

/usr/lib/python2.7/dist-packages/nova/virt/libvirt/driver.py(4487)migrate_disk_and_power_off()

通过上述步骤,成功把虚拟机的磁盘文件复制到了目的节点上,开始迁移的最后一步,创建虚拟机这一步通过rpc调用目的节点的nova-compute实现,即self.compute_rpcapi.finish_resize,其具体代码如下。

/usr/share/pyshared/nova/compute/manager.py:3153

/usr/lib/python2.7/dist-packages/nova/compute/manager.py(3073)_finish_resize()

/usr/lib/python2.7/dist-packages/nova/virt/libvirt/driver.py

通过self._create_domain_and_network就成功创建了虚拟机。

一、 不足与改进

通过对Resize的分析,我们发现有以下几个缺陷

1)        AvailabilityZoneFilter

迁移过程中,会出现跨域的resize,availabilityZoneFilter好像并没有起到过滤错误,这是由于我们创建虚拟机时,虚拟机的域选择为ramdom,因此AvailabilityZoneFilter过滤器会对所有域的主机都放行,导致虚拟机升级到别的域域上去。

2)        镜像复制过程

迁移过程中,先会在源节点将增量镜像和base镜像进行合并,然后在复制到目的节点上,合并的过程比较耗时,我们可以直接将增量镜像复制到目的节点,然后下载base镜像,最后做一次rebase即可。

时间: 2024-10-11 02:00:31

OpenStack的Resize和冷迁移代码解析及改进的相关文章

OpenStack之虚机冷迁移代码简析

OpenStack之虚机冷迁移代码简析 前不久我们看了openstack的热迁移代码,并进行了简单的分析.真的,很简单的分析.现在天气凉了,为了应时令,再简析下虚机冷迁移的代码. 还是老样子,前端的Horizon代码就省去了,直接看后端的代码实现,前端通过请求的action进入到nova/api/openstack/compute/contrib/admin_actions.py文件.代码如下: 1 @wsgi.action('migrate') 2 def _migrate(self, req

OpenStack之虚机热迁移代码解析

OpenStack之虚机热迁移代码解析 话说虚机迁移分为冷迁移以及热迁移,所谓热迁移用度娘的话说即是:热迁移(Live Migration,又叫动态迁移.实时迁移),即虚机保存/恢复(Save/Restore):将整个虚拟机的运行状态完整保存下来,同时可以快速的恢复到原有硬件平台甚至是不同硬件平台上.恢复以后,虚机仍旧平滑运行,用户不会察觉到任何差异.OpenStack的虚机迁移是基于Libvirt实现的,下面来看看Openstack虚机热迁移的具体代码实现. 首先,由API入口进入到nova/

openstack迁移云主机总汇 其二(云主机冷迁移)

2冷迁移 冷迁移有两种方式: 一种方式只能在同一个openstack集群中做,另一种可以再相同或者不同的集群中做 在做冷迁移之前记得把要迁移的实例关机 2.1方法1 把主机名为YUN-19上的实例迁移到YUN-20上,两个节点在同一个集群中,其中YUN-19是控制节点 2.1.1在YUN-19上,修改数据库 (修改数据库必须要在控制节点上做) # mysql mysql> use nova; mysql> update instances set host='YUN-20' where hos

java集合框架之java HashMap代码解析

 java集合框架之java HashMap代码解析 文章Java集合框架综述后,具体集合类的代码,首先以既熟悉又陌生的HashMap开始. 源自http://www.codeceo.com/article/java-hashmap-java-collection.html 签名(signature) public class HashMap<K,V> extends AbstractMap<K,V> implements Map<K,V>, Cloneable, Se

个人小程序实现自然语言对话工程查询--快递,身份证,词典,天气等功能完整代码解析

这个小程序旨在通过自然语言对话查询快递.身份证.天气.诗歌.词典等等的功能. 自然语言对话,即使用中文语言直接对程序下命令,比如:‘查一下天气’,“帮我查一下123456这个运单号吧”,“我想听李白的静夜思”等等. 如果还是不明白,请阅读博客 https://i.cnblogs.com/EditPosts.aspx?postid=7203097&update=1 的前言部分. 1. 小程序功能介绍 如果希望直接体验小程序,请直接扫描下面的二维码,这样更直观. 但是发布的小程序里没有身份证查询,因

ffmpeg代码解析

void avdevice_register_all(void){    static int initialized;    if (initialized)        return;    initialized = 1;    /* devices */    REGISTER_INOUTDEV(ALSA,             alsa);    REGISTER_INDEV   (AVFOUNDATION,     avfoundation);    REGISTER_INDEV

[nRF51822] 10、基础实验代码解析大全 &#183; 实验15 - RTC

一.实验内容: 配置NRF51822 的RTC0 的TICK 频率为8Hz,COMPARE0 匹配事件触发周期为3 秒,并使能了TICK 和COMPARE0 中断. TICK 中断中驱动指示灯D1 翻转状态, 即指示灯D1 以8Hz 的速率翻转状态 COMPARE0 中断中点亮指示灯D2 二.nRF51822的内部RTC结构: NRF51822 有两个RTC 时钟:RTC0,RTC1.两个RTC 均为24 位,使用LFCLK 低频时钟,并带有12 位分频器,可产生TICK.compare 和溢出

(转)Java二进制指令代码解析

转自http://www.blogjava.net/DLevin/archive/2011/09/13/358497.html Java二进制指令代码解析 Java源码在运行之前都要编译成为字节码格式(如.class文件),然后由ClassLoader将字节码载入运行.在字节码文件中,指令代码只是其中的一部分,里面还记录了字节码文件的编译版本.常量池.访问权限.所有成员变量和成员方法等信息(详见Java字节码格式详解).本文主要简单介绍不同Java指令的功能以及在代码中如何解析二进制指令. Ja

Storm中的LocalState 代码解析

官方的解释这个类为: /** * A simple, durable, atomic K/V database. *Very inefficient*, should only be * used for occasional reads/writes. Every read/write hits disk. */ 简单来理解就是这个类每次读写都会将一个Map<Object, Object>的对象序列化存储到磁盘中,读的时候将其反序列化. 构造函数指定的参数就是你在磁盘中存储的目录,同时也作为