Nova组件
Nova是OpenStack云中的计算组织控制器组件,支持OpenStack云中实例(instances)生命周期的所有活动都由Nova处理。这样使得Nova成为一个负责管理计算资源、网络、认证、所需可扩展性的平台。但是,Nova自身并没有提供任何虚拟化能力,相反它使用libvirt API来与被支持的Hypervisors交互。Nova 通过一个与Amazon Web Services(AWS)EC2 API兼容的web services API来对外提供服务。
nova的主要组件
Nova 云架构包括以下主要组件:
API Server (nova-api)
Message Queue (rabbit-mq server)
Compute Workers (nova-compute)
Network Controller (nova-network)
Volume Worker (nova-volume)
Scheduler (nova-scheduler)
相关介绍:https://www.jb51.net/article/96997.htm
消息队列Message Queue
消息(Message)是指在应用间传送的数据。
消息队列(Message Queue)是一种应用间的通信方式,消息发送后可以立即返回,由消息系统来确保消息的可靠传递。消息生产者只需要把消息发布到消息队列中而不用管谁来取,消息消费者只需从消息队列中取消息而不管是谁生产的。由此看出消息队列是一种应用间的异步协作机制
RabbitMQ消息队列
引自:https://blog.csdn.net/whoamiyang/article/details/54954780
概念说明:
Broker:它提供一种传输服务,它的角色就是维护一条从生产者到消费者的路线,保证数据能按照指定的方式进行传输,
Exchange:消息交换机,它指定消息按什么规则,路由到哪个队列。
Queue:相当于存放消息的缓冲区,每个消息都会被投到一个或多个队列。
Binding:绑定,它的作用就是把exchange和queue按照路由规则绑定起来.
Routing Key:路由关键字,exchange根据这个关键字进行消息投递。
vhost:虚拟主机,一个broker里可以有多个vhost,用作不同用户的权限分离。
Producer:消息生产者,就是投递消息的程序.
Consumer:消息消费者,就是接受消息的程序.
Channel:消息通道,在客户端的每个连接里,可建立多个channel.
交换器
引自:https://blog.csdn.net/jincm13/article/details/38705719
交换器根据生命周期的长短主要分为三种:持久交换器、临时交换器与自动删除交换器。
持久交换器是在RabbitMQ服务器中长久存在的,并不会因为系统重启或者应用程序终止而消除,其相关数据长期驻留在硬盘之上;
临时交换器驻留在内存中,随着系统的关闭而消失;
自动删除交换器随着宿主应用程序的中止而自动消亡,可有效释放服务器资源。
而交换器根据发布消息的方法又可以分为三种:广播式(fanout)、直接式(direct)、主题式(topic)。
广播式交换器不分析所接收到消息中的Routing Key,默认将消息转发到所有与该交换器绑定的队列中去,其转发效率最高,但是安全性较低,消费者应用程序可获取不属于自己的消息;
直接式交换器需要精确匹配Routing Key与BindingKey,如消息的Routing Key = Cloud,那么该条消息只能被转发至Binding Key = Cloud的消息队列中去,其转发效率较高,安全性较好,但是缺乏灵活性,系统配置量较大;
主题式交换器最为灵活,其通过消息的Routing Key与Binding Key的模式匹配,将消息转发至所有符合绑定规则的队列中。Binding Key支持通配符,其中“*”匹配一个词组,“#”匹配多个词组(包括零个)。其实还有一种header类型,headers 匹配消息的 header 而不是路由键,此外 headers 交换器和 direct 交换器完全一致,但性能差很多,目前几乎用不到了,
队列
引自:https://blog.csdn.net/jincm13/article/details/38705719
类似于交换器,消息队列也可以是持久的,临时的或者自动删除的。
持久的消息队列不会因为系统重启或者应用程序终止而消除,其相关数据长期驻留在硬盘之上;
临时消息队列在服务器被关闭时停止工作;
自动删除队列在没有应用程序使用它的时候被服务器自动删除。
消息队列将消息保存在内存、硬盘或两者的组合之中。
队列由消费者应用程序创建,主要用于实现存储与转发交换器发送来的消息。
绑定
绑定,用于消息队列和交换器之间的关联。一个绑定就是基于路由键将交换器和消息队列连接起来的路由规则,可以将交换器理解成一个由绑定构成的路由表。
nova中的消息队列
nova模块内不同组件之间通信利用RPC远程调用完成,通过消息队列使用AMQP(Advanced Message Queue Protocol)完成通信。
AMQP是应用层协议的一个开放标准,为面向消息的中间件而设计,其中RabbitMQ是AMQP协议的一个开源实现,在openstack中可以使用其他实现,比如ActiveMQ,但是大部分openstack版本都使用了rabbitMQ。
Nova 通过异步调用请求响应,使用回调函数在收到响应时触发。因为使用了异步通信,不会有用户长时间卡在等待状态。这是有效的,因为许多API调用预期的行为都非常耗时,例如加载一个实例,或者上传一个镜像。
rpc发送消息方式
nova中的每个组件都会连接消息服务器,一个组件可能是一个消息发送者(如API、Scheduler),也可能是一个消息接收者(如compute、volume、network)。发送消息主要有两种方式:rpc.call和rpc.cast。
rpc.call
rpc.call:基于请求和响应方式,发送消息到消息队列,等待接受返回结果
例如在用户想要启动一个实例时,
1、nova-api作为消息生产者,将“启动实例”的消息包装成amqp消息以rpc.call的方式通过topic交换机放入消息队列;
2、nova-compute作为消息消费者,接受该消息并通过底层虚拟化软件执行相应操作;
3、虚拟机启动成功后,nova-compute作为消息生产者将“实例启动成功”的消息通过direct交换机放入相应的响应队列;
4、nova-api作为消息消费者接受该消息并通知用户。
rpc.cast
rpc.cast:只提供单向请求,发送消息到消息队列,没有返回结果
以nova-conductor服务调用nova-compute服务build_and_run_instance(创建并启动)为例:
1. nova-conductor服务向消息队列服务的compute队列发送RPC请求,请求结束,不需要等待请求的最终回复。
2. nova-compute服务通过topic交换机从compute队列中获取消息并作出相应的处理。
创建实例的rpc调用
//从nova/compute/api.py的create函数开始:
create(self, context, instance_type,
image_href, kernel_id=None, ramdisk_id=None,
min_count=None, max_count=None,
display_name=None, display_description=None,
key_name=None, key_data=None, security_group=None,
availability_zone=None, forced_host=None, forced_node=None,
user_data=None, metadata=None, injected_files=None,
admin_password=None, block_device_mapping=None,
access_ip_v4=None, access_ip_v6=None, requested_networks=