文档章节

 虚拟机冷迁移和resize代码分析(一)

CUP_张洋洋
 CUP_张洋洋
发布于 2017/02/06 10:45
字数 723
阅读 268
收藏 2

#  一、冷迁移和resize

  迁移是指将虚拟机从一个计算节点迁移到另外一个节点上。冷迁移是相对热迁移而言,区别在于冷迁移过程中虚拟机时关机或者是处于不可用的状态,而热迁移则需要保证虚拟机时刻运行。      Resize则是根据需求重新调整虚拟机的计算能力和资源。Resize和冷迁移的工作流程相同,区别只是Resize时必须保持新的Flavor配置大于旧的配置,而冷迁移则要求两者相同。Resize的工作流程如图所示:

1.resize过程

  nova-api在收到虚拟机resize的请求后,会去调用/nova/api/openstack/compute/servers.py中的_action_resize()方法,部分代码和注释如下: 

    @wsgi.response(202)     @extensions.expected_errors((400, 401, 403, 404, 409))     @wsgi.action('resize')     @validation.schema(schema_server_resize)     def _action_resize(self, req, id, body):         """Resizes a given instance to the flavor size requested."""         resize_dict = body['resize']         #获取升级flavor         flavor_ref = str(resize_dict["flavorRef"])

        resize_kwargs = {}

        if list(self.resize_extension_manager):             self.resize_extension_manager.map(self._resize_extension_point,                                               resize_dict, resize_kwargs)

        self._resize(req, id, flavor_ref, **resize_kwargs)

  接着调用_resize()方法,部分代码和注释如下:

    def _resize(self, req, instance_id, flavor_id, **kwargs):         """Begin the resize process with given instance/flavor."""         context = req.environ["nova.context"]         authorize(context, action='resize')         #通过instance_id获取虚拟机实例的具体信息         instance = self._get_server(context, req, instance_id)

        try:             #传递instance和flavor_id两个参数             self.compute_api.resize(context, instance, flavor_id, **kwargs)         except exception.InstanceUnknownCell as e:             raise exc.HTTPNotFound(explanation=e.format_message())         except exception.QuotaError as error:             raise exc.HTTPForbidden(                 explanation=error.format_message())         except exception.FlavorNotFound:             msg = _("Unable to locate requested flavor.")             raise exc.HTTPBadRequest(explanation=msg)         except exception.CannotResizeToSameFlavor:             msg = _("Resize requires a flavor change.")             raise exc.HTTPBadRequest(explanation=msg)         except (exception.CannotResizeDisk,                 exception.AutoDiskConfigDisabledByImage) as e:             raise exc.HTTPBadRequest(explanation=e.format_message())         except exception.InstanceIsLocked as e:             raise exc.HTTPConflict(explanation=e.format_message())         except exception.InstanceInvalidState as state_error:             common.raise_http_conflict_for_instance_invalid_state(state_error,                     'resize', instance_id)         except exception.ImageNotAuthorized:             msg = _("You are not authorized to access the image "                     "the instance was started with.")             raise exc.HTTPUnauthorized(explanation=msg)         except exception.ImageNotFound:             msg = _("Image that the instance was started "                     "with could not be found.")             raise exc.HTTPBadRequest(explanation=msg)         except (exception.NoValidHost,                 exception.AutoDiskConfigDisabledByImage) as e:             raise exc.HTTPBadRequest(explanation=e.format_message())         except exception.Invalid:             msg = _("Invalid instance image.")             raise exc.HTTPBadRequest(explanation=msg)

2.冷迁移过程

  nova-api在收到虚拟机冷迁移的请求后,会去调用/nova/api/openstack/compute/migrate_server.py中的_migrate()方法,部分代码和注释如下: 

    @wsgi.response(202)     @extensions.expected_errors((400, 403, 404, 409))     @wsgi.action('migrate')     def _migrate(self, req, id, body):         """Permit admins to migrate a server to a new host."""         context = req.environ['nova.context']         authorize(context, action='migrate')         #获得虚拟机信息         instance = common.get_instance(self.compute_api, context, id)         try:             #仅传递instance一个参数             self.compute_api.resize(req.environ['nova.context'], instance)         except (exception.TooManyInstances, exception.QuotaError) as e:             raise exc.HTTPForbidden(explanation=e.format_message())         except exception.InstanceIsLocked as e:             raise exc.HTTPConflict(explanation=e.format_message())         except exception.InstanceInvalidState as state_error:             common.raise_http_conflict_for_instance_invalid_state(state_error,                     'migrate', id)         except exception.InstanceNotFound as e:             raise exc.HTTPNotFound(explanation=e.format_message())         except exception.NoValidHost as e:             raise exc.HTTPBadRequest(explanation=e.format_message())

  从上面的分析可以看出,冷迁移和resize底层接口一致,假如前端传入了新的flavor,则是resize,新的flavor被传入底层。迁移时传入底层的flavor则为自身实例相同的flavor。底层根据传入的flavor参数执行相同的逻辑。resize和冷迁移的区别是在迁移的同时,是否改变虚拟机的flavor。 后面将继续介绍两者底层相同的调用逻辑。

© 著作权归作者所有

CUP_张洋洋
粉丝 10
博文 16
码字总数 17225
作品 0
浦东
后端工程师
私信 提问
虚拟机冷热迁移Migrate

【OpenStack】Nova中的migrate/resize/live-migration 2013年10月22日 综合 共 3906字 字号 小 中 大 评论关闭 声明: 本博客欢迎转发,但请保留原作者信息! 新浪微博:@孔令贤HW; 博客地址...

gengyeh
2017/05/03
0
0
openstack ice resize 详解(一)

7-1、/nova/scheduler/rpcapi.py 7-2、/nova/scheduler/manage.py 7-3、/nova/scheduler/filter_scheduler.py...

tantexian
2016/03/29
81
0
Openstack Dashboard 二次开发

Openstack的Dashboard项目Horizon,其实做的很不错。其实如果你熟悉他的代码,对他进行一下简单修改,可以实现很多你需要的功能。很多时候,并不需要做太大的改动。 很多人都是根据Openstack...

剑气满天
2015/07/27
496
0
KVM guest磁盘扩容

一,KVM常用的两种磁盘格式的比较: raw格式: raw (default) the raw format is a plain binary image of the disc image, and is very portable. On filesystems that support sparse fil......

leejia1989
2014/11/17
0
0
华为FusionCompute虚拟化平台升级操作文档

华为FusionCompute虚拟化平台升级操作文档 一、问题分析与解决思路 问题描述:在一段时间内,FC平台中的多台CNA主机偶发性自动重启,随即导致主机中部署的虚拟机自动重启,严重影响线上业务。...

热带冠头鱼
2017/09/09
0
0

没有更多内容

加载失败,请刷新页面

加载更多

为构建社交关系链手淘都做了啥?

作者|王卫(泓冰) 出品|阿里巴巴新零售淘系技术部 01、淘宝社交关系推荐的背景 1、互联网下半场到来:互联网的下半场,人口红利消失,各大平台需要对用户做精细化运营,用户的增长和留存是每一...

阿里云官方博客
4分钟前
2
0
Iaas/Paas/Saas有何区别,一个故事告诉你

云计算有三种服务模式,IaaS,PaaS和SaaS。单从英文全称去理解,他们分别是“基础设施即服务”“平台即服务”和“软件即服务”。 这样翻译过来可不好理解,但是我们可以举个例子。现在我们就以...

JEPaaS云平台
11分钟前
3
0
温度传感器怎么测好坏

  温度传感器也就是负温度系数热敏电阻,温度越高,电阻越小,测量时先看其阻值能不能根据温度的变化而变,再看其变化的阻值是不是在标定的范围之内。   有以下四种方法;   1、若是有...

仙溪
12分钟前
2
0
zk中ZooKeeperServer解析

内部类 ChangeRecord 处理PrepRP和FinalRP之间的信息 static class ChangeRecord { ChangeRecord(long zxid, String path, StatPersisted stat, int childCount, List<ACL> acl) {......

writeademo
22分钟前
3
0
LNMP---安装worrdpress、discuz,域名重定向,用户认证,nginx访问日志

4.34 安装wordpress 4.35 安装discuz 4.36 域名重定向 4.37 用户认证 4.38 nginx访问日志 一、安装wordpress 创建博客: 添加一个博客的虚拟主机 blog.tobe.com.conf 做如下更改 安装博客wor...

tobej
24分钟前
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部