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服务相关推荐

  1. OpenStack之Nova分析——Nova API服务

    Nova是OpenStack中最核心的组件,可以说OpenStack中的其它组件都是为Nova服务的.所以Nova也是OpenStack最复杂的组件.Nova服务由多个子服务组成,这些子服务通过RPC ...

  2. Nova Conductor 与 Versioned Object Model 机制

    目录 文章目录 目录 Nova Conductor 数据库访问代理机制 Versioned Object Model 机制 Nova Conductor Conductor 服务作为 Nova 核心部 ...

  3. nova— 计算服务

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

  4. (四)浅谈OpenStack T版服务组件--Nova计算服务(#^.^#)

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 一.Nova简介 1.Nova的概念 2.Nova系统架构 二.Nova组件详解 1.Nova--API 2.Nova--S ...

  5. OpenStack-T版——Nova计算服务

    文章目录 一.Nova计算服务简介 1.什么是Nova? 2.组件有哪些? 3.Nova调度器的类型 4.过滤器调度器调度过程 5. 虚拟机实例化流程 二.OpenStack-nova组件部署 2.1 ...

  6. OpenStack T版服务组件之Nova计算服务

    文章目录 一.Nova计算服务 1.1Nova计算服务概述 1.2Nova系统架构 二.Nova组件-API 三.Nova组件-Scheduler 3.1Scheduler调度器 3.2Nova调度器 ...

  7. OpenStack Nova计算服务管理(四)

    作者:李晓辉 联系方式: Xiaohui_li@foxmail.com 环境介绍 类型 控制节点和计算节点等在一起,形成all-in-one 内存 8G 硬盘 200G 网卡 2块 计算服务概览 使用 ...

  8. OpenStack精华问答 | NOVA计算服务

    自诞生以来,OpenStack 似乎一直被质疑,其背后最重要的两大推手 NASA 和 Rackspace 都弃它而去,惠普.思科接连宣布关闭基于 OpenStack 的公有云服务,但是,OpenSta ...

  9. Nova API服务之Nova API服务的启动

    Nova API的启动和工作流程.openstack的每个组件都提供API服务,用于接收和处理客户端的HTTP请求. Nova API服务是一个RESTful API服务. 1.Nova API服务的 ...

最新文章

  1. 《神魔降世》隐私政策
  2. Spring-Spring MVC + Spring JDBC + Spring Transaction + Maven 构建web登录模块
  3. 关于有源晶振倍频干扰的问题
  4. BZOJ.1190.[HNOI2007]梦幻岛宝珠(分层背包DP)
  5. type_traits应用
  6. P6620 [省选联考 2020 A 卷] 组合数问题(斯特林数、下降幂)
  7. 云有约 | 在去O的道路上,AWS表示:经验可复制,惊喜并非只属于我们!
  8. ​MobileViT 它来了!Apple 提出轻量、通用、适用于移动设备的Transformer!
  9. Java学习----集合框架总结
  10. 模拟线性调制系统的仿真
  11. 斥候密报_斥候密报《最强王者》三国幕后巾帼之黄月英_吉吉建站手游网
  12. 2016年最新C/C++学习路线图 附完整视频资源
  13. 宾州州立大学计算机本科,2020年宾州州立大学本科读几年
  14. mx350显卡天梯图_不可错过的2020显卡天梯图,选卡详解
  15. 三次hermite插值多项式例题_2点三次Hermite插值多项式解析.ppt
  16. 应聘flash游戏开发面试技巧及建议
  17. linux huge模式设置,Linux HugePages 配置步骤
  18. A The Miracle and the Sleeper
  19. 会唱歌的程序员为何如此受欢迎?
  20. vue的报错 error Trailing spaces not allowed

热门文章

  1. 诚信,是一个庄严的承诺
  2. Freescale k60的GPIO的操作
  3. JS XML在线格式化、压缩、校验、XML转JSON工具-toolfk程序员工具网
  4. Android4: Write Storage权限问题
  5. 七年时间,微软智能云在中国走过的“大江大河”
  6. 四川地震发生前已有征兆?网民问责地震局未预警
  7. 华为交换机/华三交换机 查看光口模块信息
  8. 2020-04-24--黑寡妇的复活
  9. 送给大一新生的一些话
  10. 2019全国计算机模拟题,2019年全国计算机二级Java考试模拟习题3