openstack -- nova的组件消息队列

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=
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值