nova中利用libvirt 事件来更新vm的DB中的power状态

https://wiki.openstack.org/wiki/ComputeDriverEvents

Nova compute manager每10分钟报告hypervisor上VM的状态,可以让nova检测到vm的真实状态,比如vm被guest OS shutdown或者被Hyper kill掉了。

_sync_power_states,虚拟机状态刷新,spacing=600
获取db中本机上的虚拟机,(会调用driver的get_num_instances方法获取虚拟机个数),根据db中的虚拟机做循环:
a) 忽略有task_state(正在处理)的虚拟机
b) 调用driver的get_info方法获取节点虚拟机信息,若找不到,power_state=NOSTATE
c) 若db中的power_state与driver返回的power_state不一致,以driver为准,更新db
d) 若db中的vm_state=BUILDING|RESCUED|RESIZED|SUSPENDED|PAUSED|ERROR,忽略
e) 若db中的vm_state==ACTIVE,而power_state是[SHUTDOWN, CRASHED, SUSPENDED],调用nova-api的stop接口停止虚拟机;如果power_state是[PAUSED|NOSTATE],忽略
f) 若db中的vm_state==STOPPED,而power_state不是[NOSTATE, SHUTDOWN, CRASHED],调用nova-api的stop接口停止虚拟机

但这会加重hypervisor,而且有延时。

Libvirt有domain events" capability可以及时的检测vm的状态。

RFC讨论:

http://lists.openstack.org/pipermail/openstack-dev/2013-January/004501.html

libvirt中的实现:

  1. libvirt.virEventRegisterDefaultImpl() 会注册libvirt的默认事件loop implementation,这里使用默认实现
  2. libvirt.virEventRunDefaultImpl()会对loop做一次迭代,需要放在一个 "while True"的循环中来处理libvirt的事件loop中的事件。
  3. conn.domainEventRegisterAny()在libvirt connection上注册event callbacks

在nova中实现为:

https://blueprints.launchpad.net/nova/+spec/compute-driver-events

  • def queue_event(queue) – 把libvirt中的事件放到queue中以便随后dispatch到compute manager.它运行在一个native thread.
  • def emit_event(event) - this will dispatch a single event to the compute manager callback. This is only to be invoked from a greenthread.
  • def emit_queued_events() - this will dispatch all events previously queued via the queue_event() method. This is only to be invoked from a greenthread.
  • def register_event_listener(callback) - register a callback function to receive events. The callback will be invoked with a single parameter - the event object

The actual data associated with events will be provided via a number of classes

  • Event - the (abstract) base class for all events. Simply maintains a timestamp indicating when the event was raised
  • InstanceEvent - the (abstract) base class for all events associated with an individual instance. Maintains an instance UUID.
  • LifecycleEvent - the class used for reporting changes in an instance state (started/stopped/paused/resumed)

实现细节:

https://review.openstack.org/#/c/21802/

Handle lifecycle events in the compute manager

时间处理中,如果当前收到事件状态如DB中一样,说明DB中的状态没有及时更新,

Self._sync_instance_power_state来更新,(为什么不直接更新DB?)

https://review.openstack.org/#/q/topic:bp/compute-driver-events,n,z

取得libvirt event放到一个pipe中,在compute manager中处理pipe中的事件。

https://review.openstack.org/#/c/21801/5/nova/virt/libvirt/driver.py

nova libvirt event的更多相关文章

  1. KVM 介绍(8):使用 libvirt 迁移 QEMU/KVM 虚机和 Nova 虚机 [Nova Libvirt QEMU/KVM Live Migration]

    学习 KVM 的系列文章: (1)介绍和安装 (2)CPU 和 内存虚拟化 (3)I/O QEMU 全虚拟化和准虚拟化(Para-virtulizaiton) (4)I/O PCI/PCIe设备直接分 ...

  2. KVM 介绍(6):Nova 通过 libvirt 管理 QEMU/KVM 虚机 [Nova Libvirt QEMU/KVM Domain]

    学习 KVM 的系列文章: (1)介绍和安装 (2)CPU 和 内存虚拟化 (3)I/O QEMU 全虚拟化和准虚拟化(Para-virtulizaiton) (4)I/O PCI/PCIe设备直接分 ...

  3. OpenStack—nova组件计算服务

    nova介绍: Nova 是 OpenStack 最核心的服务,负责维护和管理云环境的计算资源.OpenStack 作为 IaaS 的云操作系统,虚拟机生命周期管理也就是通过 Nova 来实现的. 用 ...

  4. 五、OpenStack—nova组件介绍与安装

    一.nova介绍 Nova 是 OpenStack 最核心的服务,负责维护和管理云环境的计算资源.OpenStack 作为 IaaS 的云操作系统,虚拟机生命周期管理也就是通过 Nova 来实现的. ...

  5. openstack第三章:nova

    第三篇nova— 计算服务 一.nova介绍:             Nova 是 OpenStack 最核心的服务,负责维护和管理云环境的计算资源.OpenStack 作为 IaaS 的云操作系统 ...

  6. CentOS7安装OpenStack(Rocky版)-05.安装一个nova计算节点实例

    上一篇文章分享了控制节点的nova计算服务的安装方法,在实际生产环境中,计算节点通常会安装一些单独的节点提供服务,本文分享单独的nova计算节点的安装方法 ----------------  完美的分 ...

  7. CentOS7安装OpenStack(Rocky版)-04.安装Nova计算服务(控制节点)

    上一篇文章分享了glance镜像服务的安装配置,本文主要分享openstack的计算服务Nova的安装和配制方法 ------------------ 完美的分割线 ----------------- ...

  8. openstack (4)---部署Glance镜像服务,Nova计算服务

    一.Glance Glance是Openstack项目中负责镜像管理的模块,其功能包括虚拟机镜像的查找.注册和检索等. Glance提供Restful API可以查询虚拟机镜像的metadata及获取 ...

  9. openstack——nova计算服务

    一.nova介绍               Nova 是 OpenStack 最核心的服务,负责维护和管理云环境的计算资源.OpenStack 作为 IaaS 的云操作系统,虚拟机生命周期管理也就是 ...

随机推荐

  1. VS2010编译报错FileTracker error FTK1011

    系统重装,TFS重新映射,编译项目报错,出现 FileTracker error FTK1011,折腾半天未搞定,网上找到答案,可能是路径更改导致(未验证): 修改MSNET.Framework 目标 ...

  2. SpringBoot-------实现多数据源Demo

    之前SpringBoot出来时候就看了下Springboot,感觉的确精简掉了配置文件! 还是很方便的!没办法,我只是个菜鸟! 什么怎么启动Springboot什么的就不说了, 具体的Demo地址我都 ...

  3. 【Python之路】第十六篇--Web框架之Tornado

    概述 Tornado 是 FriendFeed 使用的可扩展的非阻塞式 web 服务器及其相关工具的开源版本.这个 Web 框架看起来有些像web.py 或者 Google 的 webapp,不过为了 ...

  4. Python——用正则求时间差

    如有求时间差的需求,可直接套用此方法: import time true_time=time.mktime(time.strptime('2017-09-11 08:30:00','%Y-%m-%d ...

  5. hbase中清空整张表的数据

    hbase(main):005:0> truncate 'fr:test' Truncating 'FaceBase' table (it may take a while): - Disabl ...

  6. MySQL学习思维导图

    结束:分享在线下载地址 https://www.xmind.net/m/7t6U/

  7. Java技术相关

    1.System.getProperty("user.dir") References:API

  8. IMG图片下面出现空格、下边距的解决办法

    放图片的时候总有一个间隔,加上div看,是图片未充满div.最后父级元素加了一个 font-size:0,去掉了间隔. <div class="cut-img" style= ...

  9. 20160418 while,switch,do..while的使用

    9 一.While循环 示例:求100以内所有数的和 Int i=1;//初始条件 Int sum=0; While(i<=100)//循环条件 { Sum+=i;//循环体 i++;//状态改 ...

  10. Loadrunder常见问题汇总(持续更新)

    1.LR 脚本为空的解决方法: 1)如果安装了IE以外的浏览器,并且IE不是默认浏览器,则无法生成录制脚本 2)如果录制脚本时IE不能打开,则需要将浏览器的IE工具高级选项中,将“启用第三方浏览器扩展 ...