Compute通过Conductor访问数据库方法

2023-05-16

目录

方法注册

实例序列化与反序列化

conductor与数据库交互

Instance类对象与ComputeManager类对象

compute服务的worker数量

这里以instance.save函数为例进行说明。

方法注册

nova组件中compute服务访问DB的方式是通过Conductor服务来实现的,即通过indirection_api重定向到Conductor服务。

compute服务启动方法:

nova.cmd.compute.main

在该函数中初始化重定向api方法:

cmd_common.block_db_access('nova-compute')
objects_base.NovaObject.indirection_api = conductor_rpcapi.ConductorAPI()

同时在nova.service.Service函数中,会等待conductor服务正常运行:

        if objects_base.NovaObject.indirection_api:
            conductor_api = conductor.API()
            conductor_api.wait_until_ready(context.get_admin_context())

因为构造Instance实例的时候,类的继承关系是:

oslo_versionedobjects.base.VersionedObject
--> nova.objects.base.NovaObject
--> nova.objects.instance.Instance

而indirection_api作为oslo_versionedobjects.base.VersionedObject成员变量,在nova.objects.instance.Instance中也是起到作用的,即调用instance的save()方法时,有一个@base.remotable装饰器,位于/nova/objects/instance.py

    @base.remotable
    def save(self, expected_vm_state=None,
             expected_task_state=None, admin_state_reset=False):

通过这个装饰器,会判断self.indirection_api是否存在,上面已经赋值,因此可以在compute服务中通过indirection_api重定向到nova-conductor中。

@base.remotable装饰器源码位于:
oslo_versionedobjects.base.remotable
        if self.indirection_api:
            updates, result = self.indirection_api.object_action(
                ctxt, self, fn.__name__, args, kwargs)

前面indirection_api函数已经赋值,为conductor_rpcapi.ConductorAPI()

因此调用的方法是:nova.conductor.rpcapi.ConductorAPI.object_action

继而调用的方法是:

nova.conductor.rpcapi.ConductorAPI.object_action

PRC call的调用方法object_action

构造的target是:

target = messaging.Target(topic=RPC_TOPIC, version='3.0')
cctxt = self.client.prepare()

在prepare()中并未指定server,因此这里是想conductor队列发送消息。

假设由多个节点上同时运行conductor服务,则这几个节点上的conductor服务都会监听这个队列,但最终该消息会被其中一个conductor服务消费掉。

实例序列化与反序列化

消息在传输的时候,用的是字典类型的消息体作为消息传输的格式。但是在OpenStack组件中使用的都是对象实例,这些对象实例是怎么传输和接收的?这里以Instance对象实例为例进行介绍。

消息序列化

消息将要发送的时候,在oslo_messaging组件中都会调用如下的函数,将对象进行序列化:

self.serializer.serialize_entity= 
nova.rpc.RequestContextSerializer.serialize_entity
(是nova.rpc.ProfilerRequestContextSerializer成员变量)
---> nova.objects.base.NovaObjectSerializer.serialize_entity

在该函数中,如果是对象实例的话,则会调用oslo_versionedobjects.base.VersionedObject.obj_to_primitive函数将对象实例转换为字典类型的数据,VersionedObject对象作为基类的继承关系如下所示:

oslo_versionedobjects.base.VersionedObject
--> nova.objects.base.NovaObject
--> nova.objects.instance.Instance

因此Instance对象中也有obj_to_primitive和_obj_from_primitive方法。

经过序列化之后的Instance对象实例如下所示:

{'nova_object.name': 'Instance', 'nova_object.namespace': 'nova',
 'nova_object.version': '2.7', 'nova_object.data':{Instance实例中的数据},
'nova_object.changes': ['flavor', 'task_state', 'power_state', 'info_cache'……]}

消息反序列化

作为服务端,当接收到client端发送来的消息之后,就会将字典类型的消息转化成能够在服务中相对应的实例对象,调用的方法如下:

oslo_messaging.rpc.client._BaseCallContext.call
--> nova.objects.base.NovaObjectSerializer.deserialize_entity

同时消息通过RPC call请求返回之后,也会经过deserialize_entity函数的处理。在这个函数中会将所有的字典都变为对象的形式。

[{'info_cache': InstanceInfoCache(created_at=2022-09-16T08:19:45Z,deleted=False,deleted_at=None,instance_uuid=10032782-3c3a-4e75-88c0-6b11b36f8072,
network_info=NetworkModel(2774d9d6-9e6c-470d-bdb5-a05a375e368f),updated_at=2022-09-21T08:25:44Z), 
'security_groups': SecurityGroupList(objects=[]), 
'flavor': Flavor(created_at=2022-08-26T09:16:12Z,deleted=False,deleted_at=None,description=None,disabled=False,ephemeral_gb=0,extra_specs={:architecture='x86_architecture',:category='general_purpose'},flavorid='e3c20f1b-2dba-49d5-9ea6-e9e58f913d09',id=3,is_public=True,memory_mb=1024,name='mini',projects=<?>,root_gb=0,rxtx_factor=1.0,swap=0,updated_at=None,vcpu_weight=0,vcpus=1), 
'updated_at': '2022-09-27T08:44:11Z', 
'obj_what_changed': ['flavor']}, None]

上述就是在Conductor服务中调用Instance.save之后的消息经过反序列化得到的对象。这些对象最后在oslo_versionedobjects.base.remotable函数中被重新更新到Instance对象中,就此完成数据库的更改。

conductor与数据库交互

在conductor服务中调用的方法是:

nova.conductor.manager.ConductorManager.object_action

直接调用nova.conductor.manager.ConductorManager._object_dispatch完成instance.save方法。然后将内容返回。访问数据库的接口位于nova/db/api.py文件中,该模块只是一个代理,剩下的实现是IMPL,其赋值如下:

_BACKEND_MAPPING = {'sqlalchemy': 'nova.db.sqlalchemy.api'}
IMPL = concurrency.TpoolDbapiWrapper(CONF, backend_mapping=_BACKEND_MAPPING)

Instance类对象与ComputeManager类对象

Instance对象和nova.compute.manager.ComputeManager类对象之间是什么样的关系?也就是说,compute作为服务端,client端将instance的序列化消息传入,然后server端反序列化得到Instance对象,接着compute进程就可以对该Instance对象实例进行相应的操作了。

原因是nova.compute.manager.ComputeManager对象和nova.objects.instance.Instance对象在接收到消息时,作为oslo_messaging.rpc.dispatcher.RPCDispatcher对象的成员变量,直接调用ComputeManager中的方法,并将Instance作为参数传入,这样在ComputeManager对象中就可以直接调用Instance对象了。

compute服务的worker数量

即:同一个节点上有多少个服务在监听compute.control01这个队列,消息在排队,rabbitmq是如何将消息分发到不同的worker线程上的?

注:nova-compute只有一个worker,因为还涉及到与libvirt后端连接,因此只有一个进程监听rabbitmq队列。

 而conductor中有多个worker,每个worker都会监听对应的队列:

 对于compute服务而言,首先在nova.cmd.compute.main函数中创建nova.service.Service对象实例,然后通过oslo_service.service.ServiceLauncher对象继续调用oslo_service.service.Services.run_service,在进程中调用nova.service.Service.start函数。

调用nova.rpc.get_server创建RPC Consumer所需的队列等信息。

等接收到消息之后,会将消息转换成实例对象,并调用ComputeManager对象中的类方法对参数进行处理。


本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Compute通过Conductor访问数据库方法 的相关文章

  • 激光雷达入门

    转载自 xff1a https zhuanlan zhihu com p 33792450 前言 上一次的分享里 xff0c 我介绍了一个重要的感知传感器 摄像机 摄像机作为视觉传感器 xff0c 能为无人车提供丰富的感知信息 但是由于本身
  • 【超详细】韦东山:史上最全嵌入式Linux学习路线图

    我是1999年上的大学 xff0c 物理专业 在大一时 xff0c 我们班里普遍弥漫着对未来的不安 xff0c 不知道学习了物理后出去能做什么 你当下的经历 当下的学习 xff0c 在未来的一天肯定会影响到你 毕业后我们也各自找到了自己的职
  • ArUco码辅助定位——计算机视觉

    使用USB网络摄像头和ROS跟踪ArUco Markers
  • 基于D435i的点云重建

    Task 采用D435i采集深度图和RGB图像 xff0c 进行点云重建和聚类 1 xff09 解析Bag数据 xff1a import os import cv2 import numpy as np import rosbag from
  • vncviewer黑屏问题解决

    最近在重启服务器后 xff0c 用vnc进行远程桌面连接时 xff0c vnc能够连上 xff0c 或有提示错误 xff0c 或无提示错误 xff0c 但显示黑屏 在网上搜索了甚久 xff0c 各种google xff0c 各种baidu
  • Unbuntu 系统及VNC Viewer显示中文

    一行命令搞定 xff1a apt get install ttf wqy zenhei
  • 在嵌入式Linux系统上安装打印机

    简介 xff1a 在Linux环境中安装打印机 xff0c 通常是cups ghostscript等 xff0c 但体积通常很大 xff0c 几十兆 在我应用的环境 xff0c 要求打印模块不大于5M xff0c 在网上搜索的方案是将cup
  • 深度学习环境搭建:win10+GTX1060 + tensorflow1.5+keras+cuda9.0+cudnn7

    2018年 2月8日下午 xff0c 开始搭建环境 我新买了联想Y720笔记本电脑一台 xff0c 希望用它来开展深度学习的探索 根据之前的一点点经验 xff0c 搭建深度学习的环境 本篇博客主要记录的是流程 xff0c 不提供相关数据的下
  • Linux C/C++面试题汇总

    Linux C C 43 43 面试题汇总 前言计算机基础程序的内存空间进程和线程相关 关键字conststaticvolatile C C 43 43 指针 前言 最近面试的比较多 xff0c 看了很多关于面试的内容 xff0c 有些平时
  • NVIDIA TX2--3--NVIDIA Jetson TX2 查看系统版本参数状态及重要指令

    Yolov 1 TX2上用YOLOv3训练自己数据集的流程 VOC2007 TX2 GPU Yolov 2 一文全面了解深度学习性能优化加速引擎 TensorRT Yolov 3 TensorRT中yolov3性能优化加速 xff08 基于
  • freertos之timer浅析

    背景 freertos的定时器与我所见得到其他RTOS不一样 xff0c 我知道的ucosii是在每次tick 43 43 的时候会检查定时器链表 xff0c smc rtos也是这样做的 xff0c rtt没看过源码不清楚 xff0c 而
  • vins-fusion gps融合相关总结

    1 简介 xff1a VINS Fusion在VINS Mono的基础上 xff0c 添加了GPS等可以获取全局观测信息的传感器 xff0c 使得VINS可以利用全局信息消除累计误差 xff0c 进而减小闭环依赖 相比于局部传感器 xff0
  • vins-mono里的坐标系

    vins mono里主要涉及三个坐标系 xff1a word坐标系 xff0c body坐标系即IMU帧坐标系 xff0c cam坐标系即相机帧坐标系 对于单目系统而言 xff0c 初始化时就会确定世界坐标系 首先进行纯视觉初始化 SFM

随机推荐

  • 华三交换机配置telnet远程登录和http、https登录

    1 配置管理IP地址 lt H3C gt system view 进入系统视图 H3C int vlan 1 进入管理VLAN1 H3C Vlan interface1 ip address 1 1 1 1 24 配置默认管理IP地址 H3
  • C——char(字符串)转int

    有时候需要对输入的数字进行计算之类的操作 xff0c 这时候需要将char转int类型 char是一个单独字节 xff0c 可以保存一个本地字符集的内容的类型 一般使用char 的格式来使用 int就是一个范围较小的无符号整数类型 注意 x
  • Linux设备驱动——第三章字符驱动

    当对幸福的憧憬过于急切 xff0c 那痛苦就在人的心灵深处升起 加缪 本章的目的是编写一个完整的字符设备驱动 我们开发一个字符驱动是因为这一类适合大部分简单的硬件设备 字符驱动也比块驱动易于理解 本章的最终目的是编写一个模块化的字符驱动 x
  • FreeRTOS(一)系统时钟和中断

    RTOS系统运行必需要有时钟 xff0c FreeRTOS可以选择SysTick或TIM作为时钟源 本文以再stm32f1上的移植介绍 选择SysTick需要在FreeRTOSConfig h中取消SysTick Handler 函数的映射
  • 对于USB Bulk通信发送0包的理解

    写Device USB驱动的时候 xff0c 当Bulk送信发送的数据长度恰好是wMaxPacketSize的整数倍时 xff0c 是否应该发送0包的问题搞得我焦头烂额 查找了好多资料 xff0c 有的说要加 xff0c 这是USB协议的一
  • upload漏洞专题

    一 upload上传绕过专题 后缀检验绕过 1 黑名单检测绕过 1 上传文件重命名 span class token comment 由于只有后缀是可控的 span 所以常见的后缀为php中 php2 php3 php4 php5 phtm
  • Pony语言学习(七)——表达式(Expressions)语法(单篇向)

    一 字面量 xff08 Literals xff09 xff08 一 xff09 Bool值 xff1a 没啥要说的 xff0c 就是true和false x1f44a xff08 二 xff09 数值 xff08 Numeric Lite
  • Pony语言学习(八):引用能力(Reference Capabilities)

    xff08 如果你有更好的翻译 xff0c 请务必联系我 我们需要和Rust术语做到翻译看齐 xff09 一 总览 xff08 特译 xff1a https tutorial ponylang io reference capabiliti
  • Pony语言学习(二):基础类型 之 Class

    写在前面的 xff1a 这次咱们来唠唠Pony的基础类型 xff0c 这里说的基础类型指的不是int string boolean float什么内置数据类型 xff0c 而是Pony中用来定义类型的几种方法 xff0c 分别是 Class
  • 匿名管道和命名管道

    进程间通信 xff08 IPC xff09 每个进程有各自不同的用户地址空间 xff0c 任何一个进程的全局变量在另一个进程中都看不到 所以进程之间要交换数据必须通过内核 xff0c 在内核中开辟一块缓冲区 xff0c 进程1把数据从用户空
  • ROS修改rosbag中话题的frame_id,以及发布坐标在Rviz中与点云融合显示

    ROS修改rosbag中话题的frame id xff0c 以及发布坐标在Rviz中与点云融合显示 读取rosbag xff0c 修改话题frame id与话题名并循环发布 span class token keyword import s
  • 定义类模板,未定义的引用

    在使用类模板的时候 xff0c 将类的申明和定义放在两个文件中 xff0c 在编译的时候出现 XXX未定义的引用 xff0c 即找不到对应的函数实现 解决办法是 xff1a 将类的定以和申明都放在一个头文件中 xff0c 这样就可以避免上述
  • It is a distutils installed project

    方法1 xff1a 方法2 xff1a 直接全局搜索对应文件 xff0c 具体包括 34 package name 34 文件夹 和 34 package name 34 egg info xff0c 找到后直接删除即可 eg sudo f
  • git将当前修改文件生成patch

    应用场景 xff1a 只想将当前文件夹中改动的文件打包成一个patch xff0c 并不想提交相应的代码 执行命令 xff1a git diff nova api openstack compute servers py nova cmd
  • OpenStack--虚拟机操作(挂起、暂停和搁置)

    1 OpenStack虚拟机三种操作 1 1 挂起和恢复 xff08 suspend和resume xff09 挂起 xff1a openstack中的挂起 xff08 suspend xff09 操作是将虚拟机的内存保存到磁盘中 xff0
  • eMMC 里 DDR52 HS200 HS400 等的含义

    eMMC 里 DDR52 HS200 HS400 这些名词指的是不同的速度 DDR52就是最高 52M clock xff0c 数据速率就是 52 x 2 61 104 HS200 就是最高 200M clock xff0c 单通道 xff
  • Libvirt的job机制3--基本原理

    在Job机制简介中介绍了在libvirt中调用接口时如何使用Job机制 xff1b 在条件变量基本原理中介绍了条件变量的一些基本原理 xff0c 这个是Job机制的基础 本文主要介绍Job机制中用到的一些函数 结构体等变量 xff0c 分析
  • libvirt初始化流程分析

    libvirtd daemon初始化流程比较复杂 xff0c 本文对代码流程进行初步分析 xff0c 可能有不对的地方 xff0c 随时会进行更新和补充 总体代码流程 main remote remote deamon c daemonCo
  • OpenStack调试方法总结

    1 利用remote pdb进行调试 下载链接remote pdb 2 0 0 py2 py3 none any whl 虚拟化文档类资源 CSDN下载 from remote pdb import RemotePdb RemotePdb
  • Compute通过Conductor访问数据库方法

    目录 方法注册 实例序列化与反序列化 conductor与数据库交互 Instance类对象与ComputeManager类对象 compute服务的worker数量 这里以instance save函数为例进行说明 方法注册 nova组件