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.

Live Migration Flow:
  • 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..
      1. is different than the instance's host
      2. is up
      3. has enough memory
      4. is compatible with the instance's host (i.e. hypervisor type and version)
      5. 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...
      1. is compatible with the instance's host (i.e. hypervisor type and version)
      2. 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
 
Cold Migration Flow:
  • 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
  • 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
Cold migration confirm flow:
Cold migration revert flow:
    • 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的更多相关文章

  1. OpenStack Nova Release(Rocky to Train)

    目录 文章目录 目录 前言 演进方向 Cellv2 更新 Rocky Support disabling a cell Stein Handling a down cell Train Count q ...

  2. OpenStack Nova 制作 Windows 镜像

    OpenStack Nova 制作 Windows 镜像   windows虚拟机ubuntuimage防火墙云计算 本贴转自http://www.vpsee.com 上次 VPSee 给 OpenS ...

  3. OpenStack Nova 高性能虚拟机之 CPU 绑定

    目录 文章目录 目录 前文列表 KVM KVM 的功能列表 KVM 工具集 KVM 虚拟机的本质是什么 vCPU 的调度与性能问题 Nova 支持的 vCPU 绑定 vcpu\_pin\_set 配置 ...

  4. Openstack Nova 源码分析 — 使用 VCDriver 创建 VMware Instance

    目录 目录 前言 流程图 nova-compute vCenter 前言 在上一篇Openstack Nova 源码分析 - Create instances (nova-conductor阶段)中, ...

  5. Openstack Nova 源码分析 — RPC 远程调用过程

    目录 目录 Nova Project Services Project 的程序入口 setuppy Nova中RPC远程过程调用 nova-compute RPC API的实现 novacompute ...

  6. 如何删除 OpenStack Nova 僵尸实例

    转自:http://www.vpsee.com/2011/11/how-to-delete-a-openstack-nova-zombie-instance/ 前天强制重启一台 OpenStack N ...

  7. 深挖Openstack Nova - Scheduler调度策略

    深挖Openstack Nova - Scheduler调度策略   一.  Scheduler的作用就是在创建实例(instance)时,为实例选择出合适的主机(host).这个过程分两步:过滤(F ...

  8. OpenStack Nova

    OpenStack Nova 简介 OpenStack 中的 Nova 负责维护和管理云环境的计算资源 Nova 在现有 Linux 服务器上作为一组守护线程来提供服务 Nova 由多个服务器进程组成 ...

  9. OpenStack Nova 高性能虚拟机之 NUMA 架构亲和

    目录 文章目录 目录 写在前面 计算平台体系结构 SMP 对称多处理结构 NUMA 非统一内存访问结构 MPP 大规模并行处理结构 Linux 上的 NUMA 基本对象概念 NUMA 调度策略 获取宿 ...

随机推荐

  1. 1.jquery的变量赋予方式

    1.首先通过将变量赋予 $_ = window.$ _jQuery = window.JQuery 2.将函数赋给两个全局变量 window.jQuery = window.$ = jQuery 3. ...

  2. CSS3中媒体查询,更换样式表

    <link rel="stylesheet" href="css/1.css" media="(min- width:600px)"& ...

  3. guava学习--Ordering

    转载:http://www.cnblogs.com/peida/p/Guava_Ordering.html Ordering是Guava类库提供的一个犀利强大的比较器工具,Guava的Ordering ...

  4. Winform TreeList递归绑定树节点

    /// <summary> /// 绑定树目录 /// </summary> /// <param name="parentId">父ID< ...

  5. [HB2014 Week5] Allot 人员分配

    这两天决心专门搞好网络流了 - - 题解在什么瞎胡搞跟我说要连n+2和n+1容量为无穷的边…我看了下std才做的… 坑死人的地方就是,需要求多次网络流,每次别忘了把流给清空了…这次是用链表所以专门写了 ...

  6. Python开发入门与实战8-基于Java的集成开发环境

    8. 基于Java的Python的集成开发环境 目前为止我们所有的代码和例子都是通过Notepad文本编辑器来实现的,实际项目开发中这种编码模式效率较低(大虾除外),使用IDE集成开发环境常常大幅度的 ...

  7. OrCAD搭建Access数据库

    刚进入到一个小公司,接到的第一个电路设计的案子是从零开始的,辛苦就不说,关键是这么不严谨,容易出错,于是乎,问题来了,能否从零开始着手建立个类似于以前公司的数据库,管理原理图封装,PCB封装及规格书! ...

  8. IOS第三方字体

    项目中想使用第三方的字体,在stackoverflow上查询解决办法,也折腾一会,添加成功,示例如下: 1.将xx.ttf字体库加入工程里面 2.在工程的xx-Info.plist文件中新添加一行Fo ...

  9. php大力力 [042节] 今天做了一个删除功能

    php大力力 [042节] 今天做了一个删除功能 if(isset($_GET['action'])){ if($_GET['action']=="del"){ $sql = &q ...

  10. OD调试篇12

    Delphi的逆向 先看看今天需要破解的程序. 打开程序先出现了一个nag窗口,然后是unregistered未注册的提示,以及关于里的需要注册. 拖进die看了看      就是delphi写的.那 ...