欢迎使用CSDN-markdown编辑器

来源:互联网 发布:手机兼职问卷调查软件 编辑:程序博客网 时间:2024/06/01 10:37

优雅的阅读Nova源码

通过虚拟机创建流程来分析Nova源码:

  • 准备知识
  • 源码结构
  • 虚拟机创建流程
  • 源码分析

准备知识

【Messaging 服务】创建虚机最核心的几个步骤,这几个步骤向我们展示了 nova-* 子服务之间的协作的方式,也体现了 OpenStack 整个系统的分布式设计思想。

openstack组件交互方式

1、客户( OpenStack 最终用户,其他程序)向 API(nova-api)发送请求:“帮我创建一个虚机”
2、API 对请求做一些必要处理后,向 Messaging(RabbitMQ)发送了一条消息:“让 Scheduler 创建一个虚机”
Scheduler(nova-scheduler)从 Messaging 获取到 API 发给它的消息,然后执行调度算法,从若干计算节点中选出节点 A
3、Scheduler 向 Messaging 发送了一条消息:“在计算节点 A 上创建这个虚机”
4、计算节点 A 的 Compute(nova-compute)从 Messaging 中获取到 Scheduler 发给它的消息,然后在本节点的 Hypervisor 上启动虚机。
5、在虚机创建的过程中,Compute 如果需要查询或更新数据库信息,会通过 Messaging 向 Conductor(nova-conductor)发送消息,Conductor 负责数据库访问。

同步调用和异步调用

cctxt = self.client.prepare(version=version)cctxt.cast(context, 'build_instances', **kw)

cast表示异步调用, build_instances 是远程调用的方法, kw 是传递的参数。参数就是字典类型,没有复杂对象结构,因此不需要特别的序列化操作。

cctxt.call(context,'XXX',*parameters)

API 直接调用 Scheduler 的接口就是同步调用。其特点是 API 发出请求后需要一直等待,直到 Scheduler 完成对 Compute 的调度,将结果返回给 API 后 API 才能够继续做后面的工作。

通常采用异步调用的方式,其好处是:
解耦各子服务 :子服务不需要知道其他服务在哪里运行,只需要发送消息给 Messaging 就能完成调用。
提高性能 :异步调用使得调用者无需等待结果返回。这样可以继续执行更多的工作,提高系统总的吞吐量。
提高伸缩性 :子服务可以根据需要进行扩展,启动更多的实例处理更多的请求,在提高可用性的同时也提高了整个系统的伸缩性。而且这种变化不会影响到其他子服务,也就是说变化对别人是透明的。

【RPC请求】通常一个服务的目录都会包含api.py、rpcapi.py、manager.py,这个三个是最重要的模块。

•api.py: 通常是供其它组件调用的库。换句话说,该模块通常并不会由本模块调用。比如compute目录的api.py,通常由nova-api服务的controller调用。
•rpcapi.py:这个是RPC请求的封装,或者说是RPC实现的client端,该模块封装了RPC请求调用。
•manager.py: 这个才是真正服务的功能实现,也是RPC的服务端,即处理RPC请求的入口,实现的方法通常和rpcapi实现的方法对应。

源码结构

•cmd:这是服务的启动脚本,即所有服务的main函数。看服务怎么初始化,就从这里开始。
•db: 封装数据库访问,目前支持的driver为sqlalchemy。
•conf:Nova的配置项声明都在这里。
•locale: 本地化处理。
•image: 封装Glance调用接口。
•network: 封装网络服务接口,根据配置不同,可能调用nova-network或者neutron。
•volume: 封装数据卷访问接口,通常是Cinder的client封装。
•virt: 这是所有支持的hypervisor驱动,主流的如libvirt、xen等。
•objects: 对象模型,封装了所有实体对象的CURD操作,相对以前直接调用db的model更安全,并且支持版本控制。
•policies: policy校验实现。
•tests: 单元测试和功能测试代码。

源码结构

虚拟机创建流程

线框图

调用链

源码分析