OpenStack创建一个虚拟机,涉及到三种状态,vm_state,task_state和power_state。

先总结几点:

  • 电源状态(power_state):是hypervisor的状态,从计算节点”由下而上“加载。
  • 虚拟机状态(vm_state):反应基于API调用的一种稳定状态,符合用户体验,从上而下的API实现。
  • 任务状态(task_state):代表API调用过程的过渡状态。
  • 只要数据库可用,就可以强删虚拟机。(”hard“ delete of VM)
  • 电源状态和虚拟机状态会彼此冲突,需具体情况具体分析。

Power_state

Power_state是我们调用虚拟机中驱动获得的一个状态,事实上hypervisor的状态才是权威的。数据库中power_state只是之前状态的一个快照,

会被周期性更新,并且在有任务改变了power_state后要更新数据库。

1、怎样更新?

通常是”自下而上“,由计算节点产生,重写数据库。这个更新过程可能引起和vm_state的一致性冲突,如下。

2、power_state命名惯例

取决于ibvirt返回的状态。

废弃的状态:

BLOCKED,本质上应该是RUNNING;

SHUTOFF,现在是SHUTDOWN;

FAILED,现在是NOSTATE。

vm_state

vm_sate描述虚拟机当前稳定状态,而非过渡状态。如果没有running_tasks,虚拟机就应该是用户期待的状态,比如active。ACTIVE是一个vm_state,因为它代表虚拟机正常运行;而SUSPENDING是一个过渡状态,代表n秒后虚拟机将被挂起,所以应该属于task_state。

1、vm_stae怎样更新

vm_state仅在任务结束后更新,即当一个任务成功结束并且设置task_state状态为None。

当有API调用时,vm_state永远不能改变。如果任务失败,并且合适的清理后(比如live迁移失败,任务回滚,虚拟机在源节点正常运行),虚拟机状态不变。如果任务失败并且不能回滚,vm_state状态被置为ERROR。

2、vm_state命名惯例:使用一个形容词

3、vm_state和power_state关系?

二者不是一一映射,代表的侧重点不同,不能通过推理从一个得到另一个,所以都是需要的。

比如,当你去修复一个虚拟机,虚拟机从一个rescue镜像启动,此时power_state状态为RUNNING,但是vm_state状态只能是RESCUED。单单靠power_state是不能确定vm_state是ACTIVE还是RESCUED。

4、power_state和vm_state状态不一致,如何修正?

首先,有正在运行的任务时,vm_state和power_state极有可能不同,因为vm_state代表一个稳定状态,在任务运行期间,状态是过度状态,vm_state本来就是过期的。

当没有任务运行时,power_state和vm_state应该保持一致,除非出错或者失败,这种情况,要具体分析。

a、如果power_state=SHUTOFF,但是vm_state=ACTIVE,极有可能是虚拟机内部shotdown命令出错,所以power_state正确。一个粗暴但等价的方法,手动调用一个内部方法stop()API,虚拟机应该被修正为STOPPED。

b、如果power_state=BLOCKED,vm_state=HARD_DELETED,代表用户已经要求删除虚拟机但是过程失败了。所以尝试再次删除。

c、如果power_state=BLOCKED,vm_state=PAUSED,代表可能是pause()方法调用前出了不可预料的问题。此时修正方法就看怎样对用户最友好了,maybe设置vm_state为ERROR。

到此,会发现 _sync_power_states (同步电源状态)不鸟正在执行的任务,可能导致奇怪的错误。
5、如何从vm_state中获得和EC2等价的状态?

ec2状态包含稳定状态和过渡状态。所以需要同时根据task_state和vm_state来推断ec2状态。

vm_state如下:

  • INITIALIZED:虚拟机仅仅在数据库创建(应该是说表结构建好了),但是还没开始创建。(状态是BUILDING)
  • ACTIVE:虚拟机正在运行,使用特定的镜像。
  • RESCUED:虚拟机正在运行,但使用rescue镜像。
  • PAUSED:虚拟机暂停,使用特定镜像。依然占用计算和内存资源。
  • SUSPENDED:虚拟机挂起,使用的是特定的镜像,但是不占用计算和内存资源。
  • STOPPED:虚拟机停止,但是镜像依然在磁盘上。
  • SOFT_DELETED:虚拟机不再计算节点运行了,但是磁盘镜像依然保存,可以恢复。
  • HARD_DELETED:从配额和计费角度看,虚拟机不存在了。最终虚拟机和磁盘被销毁。
  • RESIZED:虚拟机在源节点停止,在目标节点运行。虚拟机镜像在源节点和目标节点都有,但是参数不同。用于需要确认resize(调整参数)或者恢复虚拟机。(废弃的的task_state RESIZE_VERIFY和vm_state RESIZED功能一样。)
  • ERROR:发生了无法恢复的错误,唯一的可执行的操作就是删除虚拟机。

vm_state中废弃的状态REBUILDING,MIGRATING,RESIZING都放在了task_state中。而SHUTOFF不用了,因为这个状态很费解,应该根据shutdown_terminate标记被划分到STOPPED或者DELETED。

task_state

task_state代表过渡状态,和一个computeAPI紧密相关,表明虚拟机当前执行哪个任务。处于vm_state的虚拟机是不会有task_state,只有正在运行的进程有task_state。

1、特定任务:force_delete(或者hard delete)

虚拟机什么时候都能成功删除。用户删除虚拟机可以释放配额里更多资源,不再被收费。不幸的是,可能出现这种情况,一个前置任务卡住了所以task_state永远不能到None,或者虚拟驱动在销毁虚拟机时卡住了,再或者计算节点因为网络/硬件的原因不可用而无法执行销毁虚拟机操作。所以,不应该等到force_delete() 任务获得计算节点然后更新虚拟机状态为HARD_DELETED。而应该是说,vm_state立马更新而不去检查计算节点。换句话说,force_delete() 任务是一个纯粹的数据库操作。一些善后工作(真正的清除工作)随后进行,也不需要power_state和vm_state之间的一致性操作,因为它们会被定期触发。

2、如何更新?

task_state被设置当确认它是虚拟机上唯一执行的任务时。要做到原子更新,任务开始会生成一个独一无二的task_id(uuid格式)和虚拟机id关联。如果虚拟机已经有一个VM id,说明已经有别的任务在运行。在任务执行过程中,task_id通过RequestContext数据格式传播。在任务执行中途如果要更新ask_state,必须确认虚拟机的task_id匹配当前执行任务的id,否则新任务抢占当前任务(目前只有force_delete)。当任务成,task_state置为None,同时task_id置为None。

因为hard delete是唯一一个可以抢占其他任务的任务,我们没必要立即设置task_id,但是需要检查vm_state以确认它不是HARD_DELETE而不是去检查task_id是否匹配。

3、真的要分开vm_state和task_state吗?

从技术上讲,虚拟机状态(稳定)和任务状态(过渡)没有交集,可以组合使用。分开最大的好处就是状态转换图简单得多——只要考虑vm_state之间的DFA。如果需要增加一个新task_state,状态转换图保持不变。

4、命名变化

最好用动词+”ing“来描述task_state,且这个动词是compute API方法。任务执行期间,task_state不变。要表述任务的进展,应该使用一个单独的领域,而不是简化状态机。

  • None:没有正在执行的任务
  • BUDILDING
  • IMAGE_SNAPSHOTTING
  • IMAGE_BACKINGUP
  • UPDATING_PASSWORD
  • PAUSING
  • UNPAUSING
  • SUSPENDING
  • RESUMING
  • DELETING
  • STOPPING
  • STARTING
  • RESCUING
  • UNRESCUING
  • REBOOTING
  • REBUILDING
  • POWERING_ON
  • POWERING_OFF
  • RESIZING
  • RESIZE_REVERTING
  • RESIZE_CONFIRMING
  • SCHEDULING
  • BLOCK_DEVICE_MAPPING
  • NETWORKING
  • SPAWNING
  • RESIZE_PREP
  • RESIZE_MIGRATING
  • RESIZE_MIGRATED
  • RESIZE_FINISH

废弃的状态:
RESIZE_VERIFY不是一个过渡状态,而是稳定状态。变成了vm_state中的新状态RESIZED。

参考:

https://wiki.openstack.org/wiki/VMState

http://docs.openstack.org/developer/nova/devref/vmstates.html#preconditions-for-commands

OpenStack虚拟机状态的更多相关文章

  1. OpenStack 计算节点关机,虚拟机状态解决办法

    检查服务正常化 1 nova-manage service list 发现很多nova服务没有启动. 全部启动,直到nova-manage service list所有服务都是:)而不是XXX. 虚拟 ...

  2. OPENSTACK重装系统失败导致虚拟机状态为error

    重装系统失败导致虚拟机状态为error DASHBOARD查看虚拟机状态: 查看日志: 磁盘不足导致下载新镜像失败. Virsh list -all 无法发现虚拟机,底层盘消失(因为重装系统时nova ...

  3. openstack虚拟机rescue模式

    nova rescue vm_instance es.ops 20190426 linux虚拟机在出现类似kernel panic后,根据panic信息以及故障前的操作,定位问题的发生点,进行修复 n ...

  4. OpenStack虚拟机冷迁移与热迁移

    一.虚拟机迁移分析 openstacvk虚拟机迁移分为冷迁移和热迁移两种方式. 1.1冷迁移: 冷迁移(cold migration),也叫静态迁移.关闭电源的虚拟机进行迁移.通过冷迁移,可以选择将关 ...

  5. OpenStack虚拟机快照和增量备份实现

    1 快照的概念一般对快照的理解就是能够将系统还原到某个瞬间,这就是快照的作用.快照针对要保存的数据分为内存快照和磁盘快照,内存快照就是保存当前内存的数据,磁盘快照就是保存硬盘的数据.快照针对保存方式又 ...

  6. 云计算与OpenStack(虚拟机Nova篇)

    <云计算与OpenStack(虚拟机Nova篇)> 基本信息 作者: 伯龙 程志鹏 张杰 出版社:电子工业出版社 ISBN:9787121201202 上架时间:2013-8-5 出版日期 ...

  7. Openstack虚拟机创建流程

    续上一篇Openstack安装配置 一,keystone交互认证阶段 1,发送用户名和密码给keystone认证获取token 2,带着token访问nova-api 3,nova-api使用toke ...

  8. OpenStack 虚拟机冷/热迁移的实现原理与代码分析

    目录 文章目录 目录 前文列表 冷迁移代码分析(基于 Newton) Nova 冷迁移实现原理 热迁移代码分析 Nova 热迁移实现原理 向 libvirtd 发出 Live Migration 指令 ...

  9. OpenStack 虚拟机冷/热迁移功能实践与流程分析

    目录 文章目录 目录 前文列表 虚拟机迁移的应用场景 需要迁移的虚拟机数据类型 虚拟机迁移的存储场景 文件存储 块存储 非共享存储 迁移的类型 迁移的方式 执行虚拟机冷迁移 冷迁移日志分析 执行虚拟机 ...

随机推荐

  1. 重新想象 Windows 8 Store Apps (47) - 多线程之线程同步: Semaphore, CountdownEvent, Barrier, ManualResetEvent, AutoResetEvent

    [源码下载] 重新想象 Windows 8 Store Apps (47) - 多线程之线程同步: Semaphore, CountdownEvent, Barrier, ManualResetEve ...

  2. Access restriction : The constructor BASE64Decoder() is not accessible due to restriction on required library

    1.问题描述 找不到包  sun.misc.BASE64Encoder 2. 解决方案 只需要在project build path中先移除JRE System Library,再添加库JRE Sys ...

  3. python pip 升级每个包

    pip本身不自带升级所有包的功能, 但可以通过下面的脚本实现. import pip from subprocess import call for dist in pip.get_installed ...

  4. PHP学习笔记:APACHE配置虚拟目录、一个站点使用多域名配置方式

    我用的是xmapp lite2016的集成包,配置虚拟目录教程如下: 找到httpd-vhosts.conf这个文件,这个文件一般是在xampp\apache\conf\extra这个路径下面,找不到 ...

  5. .Net开源项目之开源论坛

    .Net开源项目非常多,但是开源并且直接就能用的BBS项目就很少了,至少最近我在这上面没有找到一个合适的开源论坛.可能是因为我要求比较特殊,不但要开箱即用,还要用MVC+MySql开发. Discuz ...

  6. Android 手机卫士15--程序锁

    1.基本思路 ①.创建已加锁应用的数据库(字段:_id,packagename),如果应用已加锁,将加锁应用的包名维护到数据库中 ②.已加锁+未加锁 == 手机中所有应用(AppInfoProvide ...

  7. API的非向后兼容性无论如何通常代表着一种比较差的设计

    不管一个类库或者工具方法实现多么的好,如果无法做到向后兼容性,通常会给用户带来很大的升级成本,很多对此的依赖如果希望在后续的升级和维护期间使用该类库的其他新增特性或者好处,将不得不推迟升级亦或是被迫接 ...

  8. C#进制转换

    //十进制转二进制 Console.WriteLine(Convert.ToString(69, 2)); //十进制转八进制 Console.WriteLine(Convert.ToString(6 ...

  9. 关于Fragment 不响应onActivityResult的情况分析 (

    大家都知道,可以通过使用 startActivityForResult() 和 onActivityResult() 方法来传递或接收参数. 但你是否遭遇过onActivityResult()不执行或 ...

  10. Android——检查网络是否已经链接

    新建一个项目testNet 添加一个button layout.xml: <RelativeLayout xmlns:android="http://schemas.android.c ...