zoukankan      html  css  js  c++  java
  • OpenStack 虚拟机热迁移流程图

    目录

    源计算节点与目的计算节点之间的交互流程

    热迁移主要包括三个阶段:

    • pre_live_migration 阶段:热迁移前的准备阶段,主要在目的计算节点上提前准备虚拟机资源,包括网络资源,例如:建立虚拟机的网卡,然后将网卡加入 OvS br-int 网桥。如果该阶段失败,会有回滚操作。

    • 内存迁移阶段:该阶段完全虚拟机虚拟内存数据的迁移,如果虚拟机的系统盘在计算节点本地,那么系统盘数据也会在此时进行迁移。如果该阶段失败,会有回滚操作,回滚流程和 pre_live_migration 阶段一致。

    • post_live_migration 阶段:热迁移完成后资源清理阶段,源计算节点主要是断开源计算节点上虚拟机的卷连接、清理源计算节点虚拟机的网卡资源;目的节点主要是调用 neutronclient,更新 Port Host 属性为目的计算节点。(NOTE:该阶段无需回滚流程,因为虚拟机实际上已经成功迁移,再回滚没有意义)

    在这里插入图片描述

    @startuml
    autonumber
    
    entity shost
    entity slibvirt
    entity dhost
    entity dlibvirt== pre_live_migration 阶段 ==
    alt pre_live_migration successful case
      group try...exception
        shost -> shost: 设置虚拟机的 migration 状态为 `preparing`
        shost -> shost: 获取虚拟机的卷信息
        shost -> dhost: (RPC call) pre_live_migration() 在 dhost 上提前准备虚拟机迁移所需要的资源
        dhost -> dhost: 获取虚拟机的卷信息
        dhost -> dhost: 获取虚拟机的网络信息
        dhost -> dlibvirt: 调用 Libvirt Driver 执行 driver.pre_live_migration
        dlibvirt -> dlibvirt: 获取虚拟机镜像 image_meta 信息
        dlibvirt -> dlibvirt: 创建虚拟机本地目录
        dlibvirt -> dlibvirt: 连接虚拟机卷
        dlibvirt -> dlibvirt: 创建虚拟机网卡并添加到 br-int
        dlibvirt -> dhost: return pre_live_migration 执行结果
        dhost -> shost: return pre_live_migration 执行结果
      end
    else pre_live_migration failure case (catch exception)
      shost -> shost: _rollback_live_migration()
      activate shost
        shost -> shost: 获取 dhost 中虚拟机的卷的 bdms 信息
        shost -> dhost: (RPC call) 清除虚拟机的卷连接信息
        dhost -> dhost: 获取虚拟机的 bdms 信息,终止 volume_connection 断开卷
        shost -> dhost: (RPC cast) 执行热迁移失败清理 rollback_live_migration_at_destination()
      deactivate shost
        dhost -> dhost: 清理虚拟机配置信息
        dhost -> dhost: 清理虚拟机网卡信息,将网卡从 br-int 上 unbind
        dhost -> dhost: 清理 dhost 上的虚拟机目录
    end
    
    
    == 内存(本地系统盘)数据迁移阶段 ==
    shost -> shost: 设置虚拟机的 migration 状态为 `migrating`
    shost -> slibvirt: 正式进入 live migration 步骤
    alt live_migration successful case
      group try...exception
        slibvirt -> slibvirt: 获取虚拟机的 disk path
        slibvirt -> slibvirt: 开启额外的协程,监控虚拟机内存(本次系统盘)数据的拷贝过程
        slibvirt -> dlibvirt: SSH/TCP & Pre-Copy/Post-Copy 数据拷贝
        slibvirt -> shost: live_migration 成功,进入 post_live_migration 阶段
    else live_migration failure case (catch exception)
      shost -> shost: _rollback_live_migration()
      note left: 处理过程同上
    end
    
    
    == post_live_migration 迁移阶段 ==
    shost -> shost: 获取虚拟机需要断开连接的 bdms 信息
    shost -> slibvirt: 断开虚拟机 bdms 卷连接
    note left: 此时 shost 上的虚拟机正式不可访问
    shost -> shost: 调用 cinder api 断开 shost 虚拟机的 bdms
    shost -> slibvirt: 执行 post_live_migration_at_source() 清理 shost 上虚拟机的网卡信息
    shost -> dhost: (RPC cast) 执行 post_live_migration_at_destination()
    dhost -> dhost: 获取虚拟机网络信息
    dhost -> dhost: 调用 neutron api 更新 port host 为 dhost
    dhost -> dhost: 获取虚拟机的状态,并更新虚拟机的 host、power_state、task_state 等状态
    dhost -> dhost: 更新 dhost 资源
    note left: dhost 上的 live migration 正式完成
    shost -> slibvirt: 清理虚拟机在 shost 上的虚拟机目录、disk、config 等文件
    shost -> shost: 释放 shost 上虚拟机所占用的资源
    note left: shost 上的 live migration 正式完成
    @enduml
    

    Nova 和 Neutron 之间的交互流程

    • OVS Normal plug, Linux bridge, MacVTap, SR-IOV

    在这里插入图片描述

    • OVS-Hybrid plug

    在这里插入图片描述

    相关阅读:

  • 相关阅读:
    学过C#之后,对javascript数组容易犯的错误
    关于最优种植区评价问题
    JavaScript全局变量与局部变量
    ArcGIS API for Javascript 图层切换渐变效果实现
    Motan在服务provider端用于处理request的线程池
    转:Log4j 日志体系结构
    zookeeper的开机自启动
    maven的多模块项目搭建
    scala中json与对象的转换
    社区帖子全文搜索实战(基于ElasticSearch)
  • 原文地址:https://www.cnblogs.com/hzcya1995/p/13309483.html
Copyright © 2011-2022 走看看