1 nova 的结构 :
/- ( LDAP ) [ Auth Manager ] --- | \- ( DB ) | | | [ Web Dashboard ] -> [ api ] -- < AMQP > ------ [ network ] - ( Flat/Vlan ) | \ < HTTP > [ scheduler ] - [ compute ] - ( libvirt/xen ) | | [ objectstore ] < - retrieves images
- DB: 所有组件的数据存储
- Web Dashboard:和api沟通的潜在外部组件
- api: 接收http请求,转化命令,通过队列或者http和其他组件进行沟通。
- Auth Manager: 负责 users/projects/and roles.支持 DB 或者 LDAP.
- objectstore: 并且接收存储和获取镜像
- scheduler: 决定每一个vm放在哪一个主机上
- network: 管理IP映射,网桥和虚拟局域网
- compute: 负责和管理者还有虚拟机之间的通信
AMQP 是一种信息传送协议,rabbitMQ是这中协议的一个开源实现, 可以让nova组件之间采取一种低耦合的方式实现RPC通信。
nova 采用的信息交互的方式有三种:直接,分列Fanout(消息会被传递到所有绑定的队列上),基于主题 3 种方式
nova 通过提供一个适配器来封装和解封发送消息,实现了RPC(rpc.call 和 rpc.cast) 。每一种nova服务(Compute,Scheduler,cert,conductor,consoleauth,)在初始化的时候,初始化两个队列1 接收‘NODE-TYPE.NODE-ID’ 类型路由key消息的队列 ;2 接收‘NODE-TYPE’ 类型路由key消息队列
3 nova RPC 映射
每个nova组件连接到rabbitMQ,可能会将消息队列来当做一个invoker 或者是一个worker。Invoker通过rpc.call或者rpc.cast的方式向队列当中发消息,worker接收队列当中的消息来应答。
4 oslo.messaging
为了支持不同的RPC 后端实现,oslo.meesaging 对如下对象做了统一 :
Transport 实现RPC的底层通信
target 封装了消息最终目标的的所有信息,其所具有若干属性 exchange ,topic ,namespace ,version ,server ,fanout
server 一个RPC 服务器可以暴漏多个Endpoint ,每个endpoint 包含一组方法,可以被客户端进行远程调用,创建一个server 需要指定 Transport ,target ,endpoit
RPC client :可以调用server 上面的方法 ,有cast 和call 两种调用形式
Notifier 通过某个tranport 发消息
Notifier Listener 暴漏多个endpoint
5 nova 当中的RPC
nova 当中的各个组件之间的通信就是基于AMOP 这种RPC 机制,每个组件在启动的时候都会注册一个RPC server ,除nova-api (由于没有服务会调用他的借接口)