nova libvirt event
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中的实现:
- libvirt.virEventRegisterDefaultImpl() 会注册libvirt的默认事件loop implementation,这里使用默认实现
- libvirt.virEventRunDefaultImpl()会对loop做一次迭代,需要放在一个 "while True"的循环中来处理libvirt的事件loop中的事件。
- 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的更多相关文章
- 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设备直接分 ...
- 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设备直接分 ...
- OpenStack—nova组件计算服务
nova介绍: Nova 是 OpenStack 最核心的服务,负责维护和管理云环境的计算资源.OpenStack 作为 IaaS 的云操作系统,虚拟机生命周期管理也就是通过 Nova 来实现的. 用 ...
- 五、OpenStack—nova组件介绍与安装
一.nova介绍 Nova 是 OpenStack 最核心的服务,负责维护和管理云环境的计算资源.OpenStack 作为 IaaS 的云操作系统,虚拟机生命周期管理也就是通过 Nova 来实现的. ...
- openstack第三章:nova
第三篇nova— 计算服务 一.nova介绍: Nova 是 OpenStack 最核心的服务,负责维护和管理云环境的计算资源.OpenStack 作为 IaaS 的云操作系统 ...
- CentOS7安装OpenStack(Rocky版)-05.安装一个nova计算节点实例
上一篇文章分享了控制节点的nova计算服务的安装方法,在实际生产环境中,计算节点通常会安装一些单独的节点提供服务,本文分享单独的nova计算节点的安装方法 ---------------- 完美的分 ...
- CentOS7安装OpenStack(Rocky版)-04.安装Nova计算服务(控制节点)
上一篇文章分享了glance镜像服务的安装配置,本文主要分享openstack的计算服务Nova的安装和配制方法 ------------------ 完美的分割线 ----------------- ...
- openstack (4)---部署Glance镜像服务,Nova计算服务
一.Glance Glance是Openstack项目中负责镜像管理的模块,其功能包括虚拟机镜像的查找.注册和检索等. Glance提供Restful API可以查询虚拟机镜像的metadata及获取 ...
- openstack——nova计算服务
一.nova介绍 Nova 是 OpenStack 最核心的服务,负责维护和管理云环境的计算资源.OpenStack 作为 IaaS 的云操作系统,虚拟机生命周期管理也就是 ...
随机推荐
- C#窗体传值
整理一下: 1.静态变量传值,非常简单适合简单的非实例的 public calss form1:Form{ public static int A; } public class form2:Form ...
- dev 转自
.隐藏最上面的GroupPanel gridView1.OptionsView.ShowGroupPanel=false; .得到当前选定记录某字段的值 sValue=Table.Rows[gridV ...
- 022-Spring Boot 构建微服务实战
一.概述 二. 2.1.微服务 将原来一个大的系统,拆分成小系统 每个小系统分别开发,测试,维护 2.2.调用方 服务提供方式:rest(http)[restTemplate,httpclient]. ...
- TLS and SSL
SSL:(Secure Socket Layer,安全套接字层),位于可靠的面向连接的网络层协议和应用层协议之间的一种协议层.SSL通过互相认证.使用数字签名确保完整性.使用加密确保私密性,以实现客户 ...
- "深入理解C语言" 指针
本文对coolshell中的"深入理解C语言"这篇文章中提到的指针问题, 进行简要的分析. #include <stdio.h> int main(void){ ]; ...
- Shortcut Keys in Eclipse
@1: Here are some shortcut keys in Eclipse that I use a lot.Eclipse的编辑功能非常强大,掌握了Eclipse快捷键功能,能够大大提高开 ...
- C#中时间的Ticks属性
C#中时间的Ticks属性是一个很大的长整数,单位是 100 毫微秒.表示自 0001 年 1 月 1 日午夜 12:00:00 以来已经过的时间的以 100 毫微秒为间隔的间隔数,已经说得很清楚了, ...
- AJAX的应用
用AJAX实现数据显示与删除事件 主页面: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" &q ...
- OpenGL学习进程(2)OpenGL开发环境的搭建
通过本节,我们来学习一下在Win10 64.VS1013环境下搭建OpenGL的开发环境. (1)选择一个编译环境: 现在在windows中OpenGL的主流编译工具有Visual S ...
- JAVA ArrayUtils 数组工具类
package com.sicdt.library.core.utils; import java.util.ArrayList; import java.util.Arrays; import ja ...