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即可。
OpenStack的Resize和冷迁移代码解析及改进的更多相关文章
- OpenStack之虚机冷迁移代码简析
OpenStack之虚机冷迁移代码简析 前不久我们看了openstack的热迁移代码,并进行了简单的分析.真的,很简单的分析.现在天气凉了,为了应时令,再简析下虚机冷迁移的代码. 还是老样子,前端的H ...
- OpenStack之虚机热迁移代码解析
OpenStack之虚机热迁移代码解析 话说虚机迁移分为冷迁移以及热迁移,所谓热迁移用度娘的话说即是:热迁移(Live Migration,又叫动态迁移.实时迁移),即虚机保存/恢复(Save/Res ...
- 【openstack N版】——云主机调整大小\冷迁移
一.先决条件 云主机冷迁移,即:将一台云主机从一个计算节点上,迁移到另外一个计算节点上.因为环境原因,所以我们需要准备两个计算节点. 1.1准备环境 在控制节点上,安装一个计算节点 #在控制节点安装n ...
- OpenStack虚拟机冷迁移与热迁移
一.虚拟机迁移分析 openstacvk虚拟机迁移分为冷迁移和热迁移两种方式. 1.1冷迁移: 冷迁移(cold migration),也叫静态迁移.关闭电源的虚拟机进行迁移.通过冷迁移,可以选择将关 ...
- openStack 重新resize时会进行重新调度,可能在本机Resize 扩展资源,也可能存在的情况时 ,新扩展的资源在当前节点不足分配,整个虚拟机将进行迁移调度,进行异机迁移时需要迁移 的两台主机间能使用nova系统用户经passless登录
openStack 重新resize时会进行重新调度,可能在本机Resize 扩展资源,也可能存在的情况时 ,新扩展的资源在当前节点不足分配,整个虚拟机将进行迁移调度,进行异机迁移时需要迁移 的两台主 ...
- openstack热迁移和冷迁移
转自: http://www.cnblogs.com/pycode/p/6494848.html 迁移类型: *非在线迁移 (有时也称之为‘迁移’).也就是在迁移到另外的计算节点时的这段时间虚拟机实例 ...
- openstack云主机冷迁移
1:开启nova计算节点之间互信 冷迁移需要nova计算节点之间使用nova用户互相免密码访问 默认nova用户禁止登陆,开启所有计算节点的nova用户登录shell. usermod -s /bin ...
- java集合框架之java HashMap代码解析
java集合框架之java HashMap代码解析 文章Java集合框架综述后,具体集合类的代码,首先以既熟悉又陌生的HashMap开始. 源自http://www.codeceo.com/arti ...
- VBA常用代码解析
031 删除工作表中的空行 如果需要删除工作表中所有的空行,可以使用下面的代码. Sub DelBlankRow() DimrRow As Long DimLRow As Long Dimi As L ...
随机推荐
- 61. Rotate List
题目: Given a list, rotate the list to the right by k places, where k is non-negative. For example:Giv ...
- NSArray 数组排序
//方法1,使用自带的比较器 //compare是数组自带的比较方法 NSArray *array=[NSArray arrayWithObjects:@"3",@"1& ...
- Android Handler消息传递
一.背景 出于性能优化考虑,Android的UI操作并不是线程安全的,这意味着如果有多个线程并发操作UI组件,可能导致线程安全问题.为了解决这个问题,Android制定了一条简单的原则:只允许UI线程 ...
- highcharts 结合phantomjs纯后台生成图片系列二之php2
上篇文章中介绍了phantomjs的使用场景,方法. 本篇文章详细介绍使用php,highcharts 结合phantomjs纯后台生成图片.包含一步步详细的php代码 一.highcharts 结合 ...
- 对Memcached使用的总结和使用场景
1.memcached是什么 Memcached 常被用来加速应用程序的处理,在这里,我们将着重于介绍将它部署于应用程序和环境中的最佳实践.这包括应该存储或不应存储哪些.如何处理数据的灵活分布以 及如 ...
- 07-语言入门-07-A Famous Music Composer
题目地址: http://blog.csdn.net/sevenmit/article/details/8231994 描述 Mr. B is a famous music composer. On ...
- hibernate--query接口初步
Query session.createQuery(String hql)方法; * hibernate的session.createQuery()方法是使用HQL(hibernate的查询语句)语句 ...
- 传感器(2)常用api简介及列出当前设备支持的传感器代码
Android SDK提供了Android sensor framework,可以用来访问当前Android设备内置的传感器. ASF提供了很多类和接口,可以帮助我们完成各种与传感器有关的任务. 例如 ...
- ASP.NET MVC 学习1、新增Controller,了解MVC运行机制
1,turorial ,根据链接教程新建一个MVC项目 http://www.asp.net/mvc/tutorials/mvc-4/getting-started-with-aspnet-mvc4/ ...
- iDSDT搞定显卡和声卡 黑苹果不纠结
原帖:http://www.lovelucy.info/idsdt-mac-video-audio-drive.html 之前写过PC机上装Mac OS X系统,准备工作中最纠结的就是驱动了.在网络上 ...