`
lynnkong
  • 浏览: 301463 次
  • 性别: Icon_minigender_1
  • 来自: 西安
社区版块
存档分类
最新评论

【openstack】openstack中的消息队列

阅读更多

openstack中的消息队列

1      openstack中消息队列的使用

nova中的每个组件都会连接消息服务器,一个组件可能是一个消息发送者(如APIScheduler),也可能是一个消息接收者(如computevolumenetwork)。发送消息有两种方式:同步调用rpc.call和异步调用rpc.cast

openstack内部一些对象:

l  Topic Publisher:该对象在进行rpc.callrpc.cast时创建,每个对象都会连接同一个topic类型的交换器,消息发送完毕后对象被回收。

l  Direct Publisher:该对象在进行rpc.call调用时创建,用于向消息发送者返回响应。该对象会根据接收到的消息属性连接一个direct类型的交换器。

l  Direct Consumer:该对象在进行rpc.call调用时创建,用于接收响应消息。每一个对象都会通过一个的队列连接一个direct类型的交换器(队列和交换器以UUID命名)。

l  Topic Consumer:该对象在内部服务初始化时创建,在服务过程中一直存在。用于从队列中接收消息,调用消息属性中指定的函数。该对象通过一个共享队列或一个私有队列连接一个topic类型的交换器。每一个内部服务都有两个topic consumer,一个用于rpc.cast调用(此时连接的是binding-key为“topic”的共享队列);另一个用于rpc.call调用(此时连接的是binding-key为“topic.host”的私有队列)

l  Topic Exchangetopic类型交换器,每一个消息代理节点只有一个topic类型的交换器。

l  Direct Exchangedirect类型的交换器,存在于rpc.call调用过程中,对于每一个rpc.call的调用,都会产生该对象的一个实例。

l  Queue Element:消息队列。可以共享也可以私有。routing-key为“topic”的队列会在相同类型的服务中共享(如多个compute节点共享一个routing-key为“topic”的队列)。

 

各个对象的工作模型:

 
 

       openstack中默认使用kombu(实现AMQP协议的Python函数库)连接RabbitMQ服务器。消息的收/发者都需要一个Connetion对象连接RabbitMQ服务器。

2      消息队列性能影响因素

消息队列在openstack整个架构中扮演着至关重要(交通枢纽)的作用,正是因为openstack部署的灵活性、模块的松耦合、架构的扁平化,反而使openstack更加依赖于消息队列(不一定使用RabbitMQ,可以是其他的消息队列产品),所以消息队列收发消息的性能和消息队列的HA能力直接影响openstack的性能。

openstack中的任意时间点,影响消息服务器性能的的因素如下:

l  rpc.call调用过程中:rpc.call的调用数决定了direct类型的交换器个数,相关的私有队列个数以及监听私有队列的direct consumer的个数。

l  工作者线程(内部服务)个数:相同属性的工作者线程(如compute节点)会共享一个队列,但每一个工作者线程都有一个私有队列。相同属性的工作者线程个数也决定了在topic类型交换器上的routing key的个数。

 

在实验环境下,主机名为kongopenstack各个组件启动后,会创建:

Ø  Exchanges

1.      nova (topic exchange)

Ø  Queues

1.      compute.kong

2.      compute

3.      network.kong

4.      network

5.      volume.kong

6.      volume

7.      scheduler.kong

8.      scheduler

 

使用消息队列时有如下几个(Consumer类)属性:

Ø  Durable:该属性决定了交换器和队列是否持久化,如持久化,则交换器和队列在RabbitMQ服务重启后仍然继续工作,否则交换器和队列的信息被清空。AMQP协议规定,持久化的队列只能绑定到持久化的交换器。

Ø  Auto_delete:如果设置,则当所有队列结束后,交换器自动删除。默认为False

Ø  Exclusive:队列是否私有,如果该属性设置,则Auto_delete属性会自动生效。默认为False

Ø  Auto_ack:收到消息时是否自动发送回执。默认是False,要求消息接收者手动处理回执。

Ø  No_ack:如果设置会提高性能,但会降低可靠性。

Ø  Delivery_mode:消息的传输类型。目前RabbitMQ支持两种类型:

n  1或者“transient”:消息存储在内存,当服务器宕机或重启时消息丢失

n  2或者“persistent”:消息会同时在内存和硬盘保存,服务器宕机或重启时消息不丢失

默认为2

 

在大规模部署的情况下,势必会对单节点的RabbitMQ server造成较大的负载,一旦发生单节点故障,整个openstack服务都会瘫痪。所以,部署时可以考虑使用RabbitMQHA等高级部署特性,具体参见RabbitMQ相关文档,在此不再赘述。

3      代码验证

3.1      服务的启动

根据以上分析可知,nova组件服务启动时会创建TopicConsumer,以“nova-compute”服务启动为例,在服务的启动过程中,会调用service::start()方法,在该方法中:

 

            3.1.1     conn是什么?

nova.openstack.common.amqp.ConnectionContext对象,这个对象是由RPC实现类调用create_connection()方法创建。RPCopenstack中有四种实现:

   具体使用哪一种根据配置文件确定,默认的配置项是:

rpc_backend=nova.rpc.impl_kombu

ConnectionContext对象包含两个字段:

ü  connection_pool:一个Connection对象池(继承自eventlet.pools.Pool),用于生成Connection对象。

ü  connection:由connection_pool 生成。nova.openstack.common.rpc.impl_komku.Connection对象。该对象在初始化时,会根据配置的参数和策略连接RabbitMQ服务器。

3.1.2     rpc_dispatcher是什么?

RpcDispatcher对象。该对象中有属性callbacks,是一个包含ComputeManager对象的列表。用于接收到消息之后的处理。

3.1.3     三个create_consumer方法干了什么?

以第一个为例,在该函数中,创建了TopicConsumer对象。

 

3.1.4     consume_in_thread方法

在方法的实现里,又借助了evlentlet库创建超线程。在超线程主函数中调用了TopicConsumer对象的consume()方法(该类没有实现该方法,直接调用父类)。

 



 对消息的处理包括:从消息中获取接口名称、获取接口参数、调用
ComputeManager对象相应方法。

 

至此,“nova-compute”服务启动完成。

3.2      消息的发送

以创建虚拟机为例,由前几篇文章可知,经过Scheduler模块的过滤后,将创建虚拟机消息发送到对应的compute节点。

 


  
 cast_to_compute_host
方法的实现:

 

 rpc.cast
最终会创建一个TopicPublisher对象,并调用该对象的send方法。



 由上可知,
TopicConsumer对象会向名为“nova”的exchange上, compute.host”为routing-key发送消息。此时消息会发送到在名为“compute.host”队列上监听的TopicConsumer对象。

  • 大小: 28.8 KB
  • 大小: 32.8 KB
  • 大小: 4.2 KB
  • 大小: 267.4 KB
  • 大小: 230.3 KB
  • 大小: 8.7 KB
  • 大小: 134.5 KB
  • 大小: 177.7 KB
1
3
分享到:
评论
1 楼 jazeltq 2013-06-26  
哥们看的够快的啊。 quantum刚加到G版的,就分析了。。。。

相关推荐

    什么是openstack.docx

    11. nova-compute 会从对应的消息队列中获取创建虚拟机请求的消息。 12. nova-conductor 根据消息查询虚拟机对应的信息。 13. nova-conductor 从数据库中获得虚拟机对应信息。 14. nova-conductor 把虚拟机信息通过...

    openstack-rpm

    安装这些RPM包时,通常需要按照特定顺序执行,首先安装基础依赖,然后是数据库服务(如MySQL或PostgreSQL),接着是消息队列服务(如RabbitMQ),最后才是OpenStack的各个服务组件。安装过程中需要配置各个服务的...

    OpenStack源码

    5. **消息队列**:Nova使用RabbitMQ作为消息队列,实现服务间的异步通信。服务之间的通信基于AMQP协议,可以在`nova/objects`和`nova/conductor`等目录中找到相关实现。 6. **配置文件**:Nova的配置文件通常位于`...

    openstack开发讲义

    5. Queue: Queue 是 Nova 的消息队列,负责为各种模块之间的通信提供一个集线器。 在 OpenStack 的数据库中,所有的数据都存储在 SQL 数据库中。OpenStack 支持多种数据库管理系统,包括 MySQL、PostgreSQL、SQLite...

    OpenStack架构详解.pdf

    OpenStack 中还包含两个组件:消息队列服务和数据库。这两个组件方便异步编排复杂的任务通过消息传递和信息共享。 OpenStack 项目架构可以概括为三句话:终端用户通过 nova-api 接口与 OpenStack 计算交互。...

    Openstack F版本源码安装

    4. **数据库和消息队列**:OpenStack服务之间的通信通常依赖于数据库(如MySQL或MongoDB)和消息队列(如RabbitMQ)。需要为每个服务设置相应的数据库和队列连接。 5. **配置服务**:在/etc目录下创建各服务的配置...

    OpenStack云计算平台搭建与管理教学教案(共17单元)8.pdf

    本节课程主要讲解了 OpenStack 云计算平台中的消息队列服务安装和配置,使用 RabbitMQ 消息队列服务。课程的主要目的是让学生能够安装和配置 RabbitMQ 消息队列服务,了解 OpenStack 中的消息队列服务的重要性。 一...

    centos7部署OpenStack云平台

    - 在计算节点上安装`openstack-nova-compute`,配置与控制节点的连接,确保与数据库和消息队列的通信。 4. **OpenStack-placement模块**: - placement服务跟踪资源供应和使用,帮助scheduler做出决策。 - 部署...

    openstack部署笔记+脚本

    8. **数据库和消息队列服务**:OpenStack组件之间通过消息队列(如RabbitMQ)进行通信,并使用数据库(如MySQL或MongoDB)存储状态信息。配置这些服务以支持OpenStack组件。 9. **验证和测试**:部署完成后,通过...

    OpenStack全套安装教程.rar

    安装Nova的控制节点和服务节点,配置数据库、消息队列和网络设置。别忘了注册Nova服务到Keystone。 六、安装Neutron Neutron为OpenStack提供网络功能。安装Neutron服务器,配置网络插件(如OVS),设置网络段,并...

    OpenStack简介和相关资料

    2. OpenStack对象存储(SWIFT):是一个在具有内置冗余和容错的大容量系统中存储对象的系统。对象存储有各种应用,如备份或存档数据,存储图形或视频(流媒体数据传输到用户的浏览器),储存二级或三级静态数据,...

    Openstack基础知识-PPT.pptx

    4. Marconi消息队列服务(Message Queue as a Service) 5. Savanna大数据处理(MapReduce as a Service) 6. Trove数据库服务(DataBase as a Service) OpenStack概念架构包括: 1. Horizon(Dashboard)与其他...

    centos7 openstack ocata安装

    在OpenStack环境中,CentOS 7是常用的部署操作系统,OpenStack Ocata是其特定的一个版本。这个项目将向你展示如何在CentOS 7上安装和配置OpenStack Ocata。以下是一步步的详细过程。 首先,我们需要进行【一、环境...

    OpenStack云计算快速入门教程

    OpenStack云计算快速入门教程 ...OpenStack内部采用消息队列进行通信,Nova对请求应答进行异步调用,当请求接收后便则立即触发一个回调。由于使用了异步通信,不会有用户的动作被长置于等待状态。

    OpenStack安装部署Icehouse

    7. **安装 Nova**:配置 Nova 控制节点和计算节点,包括数据库、消息队列和 API 服务。设置网络配置,如 nova-network 或 Neutron。 8. **部署 Neutron**:如果使用 Neutron 进行网络管理,需要安装和配置 Neutron ...

    openstack安装部署详细步骤,带图

    9. 安装消息队列:安装 RabbitMQ 服务器,配置消息队列参数,并设置合适的用户名和密码。 10. 安装 Memcached:安装 Memcached 服务器,配置 Memcached 参数,并设置合适的用户名和密码。 11. 安装 ETCD:安装 ...

    搭建多节点的openstack

    在控制节点上安装Glance,配置数据库、消息队列和后端存储(如Swift或Ceph)。 五、部署Nova Nova是OpenStack的核心组件,负责计算资源的调度和服务。在控制节点上安装Nova控制器,在计算节点上安装Nova计算服务。...

    openstack 多节点安装完整版

    在这个“OpenStack多节点安装完整版”中,我们将深入探讨如何在多个服务器节点上部署OpenStack,包括其主要组件Swift对象存储和Nova计算服务的配置。 一、OpenStack简介 OpenStack由一系列相互协作的服务组成,这些...

    openstack 安装手册及安装包

    这会引导你配置各个组件,包括数据库连接、消息队列服务(如RabbitMQ)、网络设置等。同时,你还需要为每个OpenStack服务创建相应的数据库、用户和服务帐户。 对于"nova"组件,你需要配置计算节点和控制节点。计算...

    OpenStack云计算全套.rar

    此外,OpenStack支持多种后端技术,例如使用不同的数据库(如MySQL或MongoDB)、消息队列(如RabbitMQ)等,这也会是学习的一部分。 OpenStack的安装和配置是一个复杂的过程,通常涉及多个步骤,包括环境准备、安装...

Global site tag (gtag.js) - Google Analytics