Nova Conductor服务
Nova Conductor服务的大部分方法都是数据库的查询操作(/nova/conductor/manager.py ConductorManager类)。主
要作用是避免Nova Compute服务直接访问数据库,增加系统的安全性。
一、引入nova conductor服务
1、nova compute服务的数据库查询更新操作都需要通过向nova conductor服务发送RPC请求来实现。
2、在创建Nova Compute服务的Service对象时,会调用conductor_api的wait_until_ready方法等待nova conductor服
务完成初始化工作。以下是Service类的初始化代码片段(/nova/service.py)。
class Service(service.Service):def __init__(self, host, binary, topic, manager, report_interval=None,periodic_enable=None, periodic_fuzzy_delay=None,periodic_interval_max=None, db_allowed=True,*args, **kwargs):...#创建conductor_api对象self.conductor_api = conductor.API(use_local=db_allowed)#等待nova conductor服务开始工作self.conductor_api.wait_until_ready(context.get_admin_context())
初始化方法中,有一个与conductor_api相关的重要参数db_allowed,指定服务是否有访问数据库的权限。
db_allowed默认值是True。nova compute服务的启动脚本(/bin/nova-compute),显式设置参数为False。
注意:nova scheduler启动脚本中,没有显式设置db_allowed参数。因此,db_allowed的值为默认值True。所以,具
有访问数据库的权限。
二、conductor.API方法
conductor.API方法定义如下:
def API(*args, **kwargs):#获取外部传入的use_local参数use_local = kwargs.pop('use_local', False)#如果nova.conf配置文件中配置了use_local配置项为True#或者外部传入的use_local参数为True,则使用LocalAPI对象if oslo_config.cfg.CONF.conductor.use_local or use_local:api = conductor_api.LocalAPI#否则创建远程API对象else:api = conductor_api.APIreturn api(*args, **kwargs)
API方法检查nova.conf配置文件中的use_local配置项和use_local参数。如果 use_local配置项和use_local参数为
True,则为Nova服务创建LocalAPI对象;否则创建远程API对象。
注意:nova.conf配置文件use_local配置项默认值False。conductor.API方法会为nova compute服务创建远程API对
象;由于nova scheduler服务传入的use_local值为True,为nova scheduler服务创建Local API对象。
三、conductor_api对象的定义
Nova服务的conductor_api对象的类型可能是LocalAPI对象或者API类。LocalAPI类和API类初始化方法和
wait_until_ready方法。
1、LocalAPI类
LocalAPI类的初始化方法定义如下:
class LocalAPI(object):def __init__(self):self._manager = utils.ExceptionHelper(manager.ConductorManager())
(1)创建了一个ConductorManager对象。 在ConductorManager类中,定义许多数据库访问的方法,这些方法都在本
机建立与数据库的连接。
(2)LocalAPI类定义了许多接口方法供Nova其他服务(Nova Scheduler)调用,底层都是直接调用ConductorManager
对象中定义的相应的方法,并没有向nova conductor服务发送RPC请求。
注意:Nova Scheduler服务使用的conductor_api是LocalAPI对象。当Nova Scheduler调用conductor_api访问数据库
时,直接在本地建立与数据库的连接。因此Nova Scheduler服务的运行并不依赖nova conductor服务。
(3)既然不依赖nova conductor服务,nova scheduler没有必要等待nova conductor服务开始运行。实现代码重用,
创建nova scheduler服务对象时,调用conductor_api的wait_until_ready方法。 LocalAPI类为空。
2、远程API方法
远程API类的初始化方法定义:
class API(LocalAPI):def __init__(self):self._manager = rpcapi.ConductorAPI()
(1)创建了一个Conductor RPC API对象。Conductor RPC API类中定义许多接口方法向nova conductor发送RPC请求。
而nova consuctor服务处理RPC请求的manager对象是一个ConductorManager对象。API类中定义的接口方法底层会调
用Conductor RPC API对象中相应的方法。
注意:
(1)默认,nova compute服务使用的conductor_api是API对象。当nova compute调用conductor_api访问数据库时,会
通过Conductor RPC服务向Nova Conductor服务发送RPC请求。因此conpute服务依赖于conductor服务。
(2)既然nova compute服务访问数据库需要通过nova conductor服务中转,效率比nova scheduler服务低。
(2)创建Nova Compute服务对象时,调用API对象的wait_until_ready方法,定义如下:
class API(LocalAPI):def wait_until_ready(self, context, early_timeout=10, early_attempts=10):#尝试次数attempt = 0#请求等待时间timeout = early_timeouthas_timedout = False#不断尝试ping Nova conductor服务while True:#如果尝试此时达到early_attempts,则不设置RPC请求等待时间if attempt == early_attempts:timeout = Noneattempt += 1try:#尝试向nova conductor服务发送RPC请求self.base_rpcapi.ping(context, '1.21 GigaWatts',timeout=timeout)if has_timedout:LOG.info(_LI('nova-conductor connection ''established successfully'))#如果请求成功,说明nova conductor服务正常工作,结束循环break#如果请求失败,进入下一个循环,继续发送RPC请求except messaging.MessagingTimeout:has_timedout = TrueLOG.warning(_LW('Timed out waiting for nova-conductor. ''Is it running? Or did this service start ''before nova-conductor? ''Reattempting establishment of ''nova-conductor connection...'))
不断向Nova Conductor服务发送ping RPC请求。当请求等待正常响应时,则认为nova conductor服务已经正常工作
了。nova conductor服务最终会把ping RPC请求交给ConductorManager对象的ping方法处理。
总结:
1、创建虚拟机请求的处理流程
通过虚拟机创建请求,分析Nova API、Nova Scheduler和Nova Compute服务的工作和协作机制。
虚拟机创建请求的处理流程:
servers资源底层(nova.api.openstack.compute.legacy_v2.servers.py) Controller类的create方法
2、调度算法
虚拟机调度算法是Nova Scheduler服务实现的最主要的功能,算法的框架定义在FilterScheduler类的_scheduler方
法中。_scheduler工作流程:
(1)调用HostManager对象的get_all_hosts方法获取所有的计算节点列表。
(2)调用HostManager对象的get_filtered_hosts方法获取可用的计算节点列表。
(3)调用HostManager对象的get_weighted_hosts方法计算可用计算节点的权值。
(4)从权值最高的scheduler_host_subset_size个计算节点中随机选择一个计算节点作为创建虚拟机的节点。
(5)调用被选中计算节点对应的 HostState对象的 consume_from_instance方法,更新选择的计算节点的硬件资源信
息,为虚拟机预留资源。
(6)HostManager对象的get_all_hosts方法首先调用HostManager对象的_choose_host_filters方法获取过滤器类列
表,然后调用HostFilterHandler对象的get_filtered_objects方法使用过滤器检查计算节点。
(7)HostFilterHandler对象的get_filtered_objects方法依次调用每个过滤器对象的filter_all方法。过滤器的
filter_all方法返回的是通过该过滤器的主机列表。只有通过所有的过滤器检查的节点才是可用的节点。
(8)HostManager对象的get_weighted_hosts方法调用了HostWeightHandler对象的get_weighted_objects方法。
(9)HostWeightHandler对象的get_weighted_objects方法首先为每个主机创建一个WeightedObject对象。然后,依
次调用权值对象的weigh_objects方法不断修改主机WeightedObject对象的权值。
主机最终的权值是所有权值对象赋予给主机权值的加权和。最后将主机按照权值由高到低顺序排列。
Nova Conductor服务相关推荐
- OpenStack之Nova分析——Nova API服务
Nova是OpenStack中最核心的组件,可以说OpenStack中的其它组件都是为Nova服务的.所以Nova也是OpenStack最复杂的组件.Nova服务由多个子服务组成,这些子服务通过RPC ...
- Nova Conductor 与 Versioned Object Model 机制
目录 文章目录 目录 Nova Conductor 数据库访问代理机制 Versioned Object Model 机制 Nova Conductor Conductor 服务作为 Nova 核心部 ...
- nova— 计算服务
一.nova介绍: Nova 是 OpenStack 最核心的服务,负责维护和管理云环境的计算资源.OpenStack 作为 IaaS 的云操作系统,虚拟机生命周期管理也就是通过 Nova 来实现的. ...
- (四)浅谈OpenStack T版服务组件--Nova计算服务(#^.^#)
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 一.Nova简介 1.Nova的概念 2.Nova系统架构 二.Nova组件详解 1.Nova--API 2.Nova--S ...
- OpenStack-T版——Nova计算服务
文章目录 一.Nova计算服务简介 1.什么是Nova? 2.组件有哪些? 3.Nova调度器的类型 4.过滤器调度器调度过程 5. 虚拟机实例化流程 二.OpenStack-nova组件部署 2.1 ...
- OpenStack T版服务组件之Nova计算服务
文章目录 一.Nova计算服务 1.1Nova计算服务概述 1.2Nova系统架构 二.Nova组件-API 三.Nova组件-Scheduler 3.1Scheduler调度器 3.2Nova调度器 ...
- OpenStack Nova计算服务管理(四)
作者:李晓辉 联系方式: Xiaohui_li@foxmail.com 环境介绍 类型 控制节点和计算节点等在一起,形成all-in-one 内存 8G 硬盘 200G 网卡 2块 计算服务概览 使用 ...
- OpenStack精华问答 | NOVA计算服务
自诞生以来,OpenStack 似乎一直被质疑,其背后最重要的两大推手 NASA 和 Rackspace 都弃它而去,惠普.思科接连宣布关闭基于 OpenStack 的公有云服务,但是,OpenSta ...
- Nova API服务之Nova API服务的启动
Nova API的启动和工作流程.openstack的每个组件都提供API服务,用于接收和处理客户端的HTTP请求. Nova API服务是一个RESTful API服务. 1.Nova API服务的 ...
最新文章
- 《神魔降世》隐私政策
- Spring-Spring MVC + Spring JDBC + Spring Transaction + Maven 构建web登录模块
- 关于有源晶振倍频干扰的问题
- BZOJ.1190.[HNOI2007]梦幻岛宝珠(分层背包DP)
- type_traits应用
- P6620 [省选联考 2020 A 卷] 组合数问题(斯特林数、下降幂)
- 云有约 | 在去O的道路上,AWS表示:经验可复制,惊喜并非只属于我们!
- ​MobileViT 它来了!Apple 提出轻量、通用、适用于移动设备的Transformer!
- Java学习----集合框架总结
- 模拟线性调制系统的仿真
- 斥候密报_斥候密报《最强王者》三国幕后巾帼之黄月英_吉吉建站手游网
- 2016年最新C/C++学习路线图 附完整视频资源
- 宾州州立大学计算机本科,2020年宾州州立大学本科读几年
- mx350显卡天梯图_不可错过的2020显卡天梯图,选卡详解
- 三次hermite插值多项式例题_2点三次Hermite插值多项式解析.ppt
- 应聘flash游戏开发面试技巧及建议
- linux huge模式设置,Linux HugePages 配置步骤
- A The Miracle and the Sleeper
- 会唱歌的程序员为何如此受欢迎?
- vue的报错 error Trailing spaces not allowed