OpenStack nova VM migration (live and cold) call flow
OpenStack nova compute supports two flavors of Virtual Machine (VM) migration:
- Cold migration -- migration of a VM which requires the VM to be powered off during the migrate operation during which time the VM is inaccessible.
- Hot or live migration -- zero down-time migration whereupon the VM is not powered off during the migration and thus remains accessible.
Understanding these VM migration operations from an OpenStack internals perspective can be a daunting task. I had the pleasure of digging into these flows in the latter part of 2013 and as part of that effort created a rough outline of the internal flows. Other's I've worked with found these flow outlines useful and thus they're provided below.
Note -- The outlines below were created based on the OpenStack source in late 2013 and thus reflect the state of OpenStack at that point in time.
- nova.api.openstack.compute.contrib.admin_actions._migrate_live()
- nova.compute.api.live_migrate()
- update instance state to MIGRATING state
- call into scheduler to live migrate (scheduler hint will be set to the host select (which may be none)).
- nova.scheduler.manager.live_migration()
- nova.scheduler.manager._schedule_live_migration()
- nova.conductor.tasks.live_migrate.LiveMigrationTask.execute()
- check that the instance is running
- check that the instance's host is up
- if destination host provided, check that it..
- is different than the instance's host
- is up
- has enough memory
- is compatible with the instance's host (i.e. hypervisor type and version)
- passes live migration checks (call using amqp rpc into nova manager check_can_live_migrate_destination)
- else destination host not provided, find a candidate destination host and check that it...
- is compatible with the instance's host (i.e. hypervisor type and version)
- passes live migration checks (call using amqp rpc into nova manager check_can_live_migrate_destination)
- call using amqp rpc into nova manager live_migration
Note: Migration data is initially set by check_can_live_migrate_destination and can be used for implementation specific parameters from this point.
- nova.compute.manager.check_can_live_migrate_destination()
- driver.check_can_live_migrate_destination()
- call using amqp rpc into nova manager check_can_live_migrate_source
- driver.check_can_live_migrate_destination_cleanup()
- nova.compute.manager.check_can_live_migrate_source()
- determine if the instance is volume backed and add result to the migration data
- driver.check_can_live_migrate_source()
- nova.compute.manager.live_migration()
- if block migration request then driver.get_instance_disk_info()
- call using amqp rpc into nova manager pre_live_migration
- Error handler: _rollback_live_migration
- driver.live_migration()
- nova.compute.manager.pre_live_migration()
- get the block device information for the instance
- get the network information for the instance
- driver.pre_live_migration()
- setup networks on destination host by calling the network API setup_networks_on_host
- driver.ensure_filtering_rules_for_instance()
- nova.compute.manager._rollback_live_migration()
- update instance state to ACTIVE state
- re-setup networks on source host by calling the network API setup_networks_on_host
- for each instance volume connection call using amqp rpc into nova manager remove_volume_connection
- if block migration or volume backed migration without shared storage
- call using amqp rpc into nova manager rollback_live_migration_at_destination
- nova.compute.manager._post_live_migration()
- driver.get_volume_connector()
- for each instance volume connection call the volume API terminate_connection
- driver.unfilter_instance()
- call into conductor to network_migrate_instance_start which will eventually call the network API migrate_instance_start
- call using amqp rpc into nova manager post_live_migration_at_destination
- if block migration or not shared storage driver.destroy()
- else driver.unplug_vifs()
- tear down networks on source host by calling the network API setup_networks_on_host
- nova.compute.manager.post_live_migration_at_destination()
- setup networks on destination host by calling the network API setup_networks_on_host
- call into conductor to network_migrate_instance_finish which will eventually call the network API migrate_instance_finish
- driver.post_live_migration_at_destination()
- update instance to ACTIVE state
- setup networks on destination host by calling the network API setup_networks_on_host
- nova.compute.manager.rollback_live_migration_at_destination()
- tear down networks on destination host by calling the network API setup_networks_on_host
- driver.destroy()
- nova.compute.manager.remove_volume_connection()
- call _detach_volume
- driver.get_volume_connector()
- remove the volume connection by calling the volume API terminate_connection
- nova.compute.manager._detach_volume()
- driver.detach_volume()
- Since the live migration failed the VM should not be on the destination host. So this should be a no-op.
- If there is an exception detaching the volume then rollback the detach by calling the volume API roll_detaching
- driver.detach_volume()
- nova.api.openstack.compute.servers._resize()
- nova.api.openstack.compute.contrib.admin_actions._migrate()
- nova.compute.api.resize()
- if flavor_id is not passed, migrate host only and keep the original flavor
- else flavor_id is given, migrate host and resize to new flavor
- lookup the image for the instance by calling the image API show
- check quota headroom and reserve
- update instance to RESIZE_PREP state
- determine if the instance's current host should be ignored as a migration target and update filter properties for the scheduler accordingly
- call into scheduler to prep_resize
- nova.scheduler.manager.prep_resize()
- call scheduler driver to schedule_prep_resize
- if no valid host was found then update instance to ACTIVE state and rollback quota reservation
- if error occurred then update instance to ERROR state and rollback quota reservation
- nova.scheduler.filter_scheduler.schedule_prep_resize()
- run through scheduler filters to select host
- call using amqp rpc into nova manager prep_resize
- nova.compute.manager.prep_resize()
- if no node specified call driver.get_available_nodes()
- call _prep_resize
- if an exception occurs then call into scheduler to prep_resize again if possible
- nova.compute.manager._prep_resize()
- if same host is used then ensure that the same host is allowed (as per configuration)
- call using amqp rpc into nova manager resize_instance
- nova.compute.manager.resize_instance()
- get network and instance information
- update instance to RESIZE_MIGRATING state
- get block device information
- call driver.migrate_disk_and_power_off()
- call _terminate_volume_connections
- call into conductor to network_migrate_instance_start which will eventually call the network API migrate_instance_start
- update instance to RESIZE_MIGRATED state
- call using amqp rpc into nova manager finish_resize
- nova.compute.manager._terminate_volume_connections()
- if there is a volume connection to terminate
- driver.get_volume_connector()
- for each volume connection remove the connection by calling the volume API terminate_connection
- if there is a volume connection to terminate
- nova.compute.manager.finish_resize()
- call _finish_resize
- if successful commit the quota reservation
- else rollback the quota reservation and update instance to ERROR state
- nova.compute.manager._finish_resize()
- if the flavor is changing then update the instance with the new flavor
- setup networks on destination host by calling the network API setup_networks_on_host
- call into conductor to network_migrate_instance_finish which will eventually call the network API migrate_instance_finish
- update instance to RESIZE_FINISHED state
- refresh and get block device information
- driver.finish_migration()
- update instance to RESIZED state
- nova.api.openstack.compute.servers._action_confirm_resize()
- nova.compute.api.confirm_resize()
- reserve quota for decrease in resource usage
- call amqp rpc into nova manager confirm_resize
- nova.compute.manager.confirm_resize()
- tear down networks on source host by calling the network API setup_networks_on_host
- driver.confirm_migration()
- update instance to ACTIVE (or possibly STOPPED) state
- commit the quota reservation
- nova.api.openstack.compute.servers._action_revert_resize()
- nova.compute.api.revert_resize()
- reserve quota for increase in resource usage
- update instance task state to RESIZE_REVERTING
- call amqp rpc into nova manager revert_resize
- nova.compute.manager.revert_resize()
- tear down networks on destination host by calling the network API setup_networks_on_host
- call into conductor to network_migrate_instance_start which will eventually call the network API migrate_instance_start
- get block device information
- driver.destroy()
- call _terminate_volume_connections
- drop resize resources claimed on destination
- call amqp rpc into nova manager finish_revert_resize
- nova.compute.manager.finish_revert_resize()
- update instance back to pre-resize values
- re-setup networks on source host by calling the network API setup_networks_on_host
- refresh and get block device information
- driver.finish_revert_migration()
- update instance to RESIZE_REVERTING state
- call into conductor to network_migrate_instance_finish which will eventually call the network API migrate_instance_finish
- update instance to ACTIVE (or possibly STOPPED) state
- commit the quota usage
Source: http://bodenr.blogspot.com/2014/03/openstack-nova-vm-migration-live-and.html
OpenStack nova VM migration (live and cold) call flow的更多相关文章
- OpenStack Nova Release(Rocky to Train)
目录 文章目录 目录 前言 演进方向 Cellv2 更新 Rocky Support disabling a cell Stein Handling a down cell Train Count q ...
- OpenStack Nova 制作 Windows 镜像
OpenStack Nova 制作 Windows 镜像 windows虚拟机ubuntuimage防火墙云计算 本贴转自http://www.vpsee.com 上次 VPSee 给 OpenS ...
- OpenStack Nova 高性能虚拟机之 CPU 绑定
目录 文章目录 目录 前文列表 KVM KVM 的功能列表 KVM 工具集 KVM 虚拟机的本质是什么 vCPU 的调度与性能问题 Nova 支持的 vCPU 绑定 vcpu\_pin\_set 配置 ...
- Openstack Nova 源码分析 — 使用 VCDriver 创建 VMware Instance
目录 目录 前言 流程图 nova-compute vCenter 前言 在上一篇Openstack Nova 源码分析 - Create instances (nova-conductor阶段)中, ...
- Openstack Nova 源码分析 — RPC 远程调用过程
目录 目录 Nova Project Services Project 的程序入口 setuppy Nova中RPC远程过程调用 nova-compute RPC API的实现 novacompute ...
- 如何删除 OpenStack Nova 僵尸实例
转自:http://www.vpsee.com/2011/11/how-to-delete-a-openstack-nova-zombie-instance/ 前天强制重启一台 OpenStack N ...
- 深挖Openstack Nova - Scheduler调度策略
深挖Openstack Nova - Scheduler调度策略 一. Scheduler的作用就是在创建实例(instance)时,为实例选择出合适的主机(host).这个过程分两步:过滤(F ...
- OpenStack Nova
OpenStack Nova 简介 OpenStack 中的 Nova 负责维护和管理云环境的计算资源 Nova 在现有 Linux 服务器上作为一组守护线程来提供服务 Nova 由多个服务器进程组成 ...
- OpenStack Nova 高性能虚拟机之 NUMA 架构亲和
目录 文章目录 目录 写在前面 计算平台体系结构 SMP 对称多处理结构 NUMA 非统一内存访问结构 MPP 大规模并行处理结构 Linux 上的 NUMA 基本对象概念 NUMA 调度策略 获取宿 ...
随机推荐
- 1.jquery的变量赋予方式
1.首先通过将变量赋予 $_ = window.$ _jQuery = window.JQuery 2.将函数赋给两个全局变量 window.jQuery = window.$ = jQuery 3. ...
- CSS3中媒体查询,更换样式表
<link rel="stylesheet" href="css/1.css" media="(min- width:600px)"& ...
- guava学习--Ordering
转载:http://www.cnblogs.com/peida/p/Guava_Ordering.html Ordering是Guava类库提供的一个犀利强大的比较器工具,Guava的Ordering ...
- Winform TreeList递归绑定树节点
/// <summary> /// 绑定树目录 /// </summary> /// <param name="parentId">父ID< ...
- [HB2014 Week5] Allot 人员分配
这两天决心专门搞好网络流了 - - 题解在什么瞎胡搞跟我说要连n+2和n+1容量为无穷的边…我看了下std才做的… 坑死人的地方就是,需要求多次网络流,每次别忘了把流给清空了…这次是用链表所以专门写了 ...
- Python开发入门与实战8-基于Java的集成开发环境
8. 基于Java的Python的集成开发环境 目前为止我们所有的代码和例子都是通过Notepad文本编辑器来实现的,实际项目开发中这种编码模式效率较低(大虾除外),使用IDE集成开发环境常常大幅度的 ...
- OrCAD搭建Access数据库
刚进入到一个小公司,接到的第一个电路设计的案子是从零开始的,辛苦就不说,关键是这么不严谨,容易出错,于是乎,问题来了,能否从零开始着手建立个类似于以前公司的数据库,管理原理图封装,PCB封装及规格书! ...
- IOS第三方字体
项目中想使用第三方的字体,在stackoverflow上查询解决办法,也折腾一会,添加成功,示例如下: 1.将xx.ttf字体库加入工程里面 2.在工程的xx-Info.plist文件中新添加一行Fo ...
- php大力力 [042节] 今天做了一个删除功能
php大力力 [042节] 今天做了一个删除功能 if(isset($_GET['action'])){ if($_GET['action']=="del"){ $sql = &q ...
- OD调试篇12
Delphi的逆向 先看看今天需要破解的程序. 打开程序先出现了一个nag窗口,然后是unregistered未注册的提示,以及关于里的需要注册. 拖进die看了看 就是delphi写的.那 ...