- 浏览: 303654 次
- 性别:
- 来自: 西安
最新评论
-
happyxiaomo:
...
【openstack】openstack的调度(Scheduler) -
linuxgao:
请问,OpenStack在关心消息返回值的情况下,两个队列一发 ...
【架构】关于RabbitMQ -
wangchao719:
zfj_0928 写道引用1. 消息ACK,通知RabbitM ...
【架构】关于RabbitMQ -
zfj_0928:
引用1. 消息ACK,通知RabbitMQ消息已被处理,可以从 ...
【架构】关于RabbitMQ -
zhangwind:
写的好,很感谢!
【架构】关于RabbitMQ
openstack中的消息队列
1 openstack中消息队列的使用
nova中的每个组件都会连接消息服务器,一个组件可能是一个消息发送者(如API、Scheduler),也可能是一个消息接收者(如compute、volume、network)。发送消息有两种方式:同步调用rpc.call和异步调用rpc.cast
openstack内部一些对象:
l Topic Publisher:该对象在进行rpc.call或rpc.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 Exchange:topic类型交换器,每一个消息代理节点只有一个topic类型的交换器。
l Direct Exchange:direct类型的交换器,存在于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的个数。
在实验环境下,主机名为kong,openstack各个组件启动后,会创建:
Ø 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服务都会瘫痪。所以,部署时可以考虑使用RabbitMQ的HA等高级部署特性,具体参见RabbitMQ相关文档,在此不再赘述。
3 代码验证
3.1 服务的启动
根据以上分析可知,nova组件服务启动时会创建TopicConsumer,以“nova-compute”服务启动为例,在服务的启动过程中,会调用service::start()方法,在该方法中:
3.1.1 conn是什么?
是nova.openstack.common.amqp.ConnectionContext对象,这个对象是由RPC实现类调用create_connection()方法创建。RPC在openstack中有四种实现:
具体使用哪一种根据配置文件确定,默认的配置项是:
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对象。
发表评论
-
【OpenStack】OpenStack服务的启动
2013-03-15 13:35 12293OpenStack服务的启动 本博客欢迎转发,但请保 ... -
【OpenStack】使用Rest工具向OpenStack消息发送指导
2013-03-13 20:15 3391本博客欢迎转发,但请保留原作者(新浪微博:@孔令贤HW;博客 ... -
【OpenStack】【转】Openstack之Cinder服务初探
2013-03-11 14:22 2094这篇blog是一个同事不久前写的,得到允许后,在此转载 ... -
【OpenStack】创建虚拟机时与Quantum的交互(F版)
2013-02-27 14:33 1809本博客欢迎转发,但请保留原作者(新浪微博:@孔令贤HW;博 ... -
【OpenStack】 Grizzly中的nova-conductor
2013-02-24 11:26 5360OpenStack Grizzly中的nova ... -
【OpenStack】Folsom版Quantum对象模型
2013-02-19 11:43 1543本博客欢迎转发,但请保留原作者信息(@孔令贤HW)!内容系 ... -
【openstack】Quantum(Folsom版)中update_floatingIP流程
2013-02-18 17:56 1294本博客欢迎转发,但请保留原作者信息(@孔令贤HW)!内容系 ... -
【OpenStack】G版中关于Nova的Cell
2013-02-02 03:02 4054本博客欢迎转发,但请保留原作者(新浪微博:@孔令贤HW;博 ... -
【OpenStack】G版Keystone对象模型
2013-02-02 01:14 3420本博客欢迎转发,但请保留原作者信息(@孔令贤HW)!内 ... -
【OpenStack】Grizzly版本中Scheduler filter机制详解
2013-01-26 18:11 2600Grizzly版本中Scheduler filter机制详 ... -
【OpenStack】Grizzly目前版本相对于Folsom的变更
2013-01-24 10:05 2972本博客欢迎转发,但请保留原作者(新浪微博:@孔令贤HW;博 ... -
Grizzly中的LoadBalancer初步分析
2013-01-22 09:41 2149Grizzly中的LoadBalancer初步分析 ... -
OpenStack网络知识片断(持续更新)
2012-12-26 16:14 13327OpenStack网络知识片断(持续更新) ... -
Quantum中的L3模型实战
2012-12-20 09:01 5062Quantum中的L3模型实战 ... -
在OpenStack使用XenServer资源池浅析
2012-12-13 13:33 3061在OpenStack使用XenServer资源池浅析 ... -
使用Komodo远程调试python(OpenStack)
2012-12-10 14:42 7195使用Komodo远程调试python(OpenStack) ... -
如何在openstack环境中实现定制化功能
2012-12-03 20:02 2765本博客欢迎转发,但请保留原作者(@孔令贤HW)信息!内容系本 ... -
由浅入深(源码)分析nova的资源刷新机制
2012-11-30 17:06 5136本博客欢迎转发,但请保留原作者(@孔令贤HW)信息!内容系本 ... -
【转】Ubuntu12.04 OpenStack Folsom 安装(VLAN模式)
2012-11-27 16:45 4012Ubuntu12.04 OpenStack Folsom ... -
【openstack】Nova中的policy
2012-11-10 13:32 3995Nova中的policy 本博 ...
相关推荐
- 消息服务器:安装并配置消息队列服务(如RabbitMQ或Qpid)。 3. 添加身份认证服务(Keystone): - 安装和配置Keystone。 - 创建租户(项目)、用户和角色。 - 创建服务实体和API端点。 - 验证Keystone操作...
OpenStack Kilo版本是一个重要的里程碑,在这个版本中引入了许多新特性以及对现有功能的重大改进。本文档为Red Hat Enterprise Linux 7、CentOS 7及Fedora 20等操作系统上的OpenStack Kilo安装提供了详细的指导。 #...
OpenStack 中还包含两个组件:消息队列服务和数据库。这两个组件方便异步编排复杂的任务通过消息传递和信息共享。 OpenStack 项目架构可以概括为三句话:终端用户通过 nova-api 接口与 OpenStack 计算交互。...
需要配置计算驱动(如libvirt或KVM)、网络模型(FlatDHCP或VLAN)、Nova与数据库和消息队列(如RabbitMQ)的连接,以及与Keystone的集成。 七、dashboard配置 Horizon是OpenStack的Web界面,即dashboard。安装...
这里值得注意的是,虽然默认情况下 OpenStack 使用 Qpid 作为消息队列服务,但可以根据需求选择使用 RabbitMQ 作为替代方案。 ##### 4. 设置安全限制 为了确保系统的安全性,需要对 Qpid 进行一定的配置,并调整 ...
11. nova-compute 会从对应的消息队列中获取创建虚拟机请求的消息。 12. nova-conductor 根据消息查询虚拟机对应的信息。 13. nova-conductor 从数据库中获得虚拟机对应信息。 14. nova-conductor 把虚拟机信息通过...
这些组件通过消息队列(通常使用RabbitMQ)进行通信,确保数据的一致性和事务的可靠性。 ##### 5.2 OpenStack Compute的部署模式 OpenStack Compute支持多种部署模式,包括单节点部署、多节点集群部署等。在大型...
安装这些RPM包时,通常需要按照特定顺序执行,首先安装基础依赖,然后是数据库服务(如MySQL或PostgreSQL),接着是消息队列服务(如RabbitMQ),最后才是OpenStack的各个服务组件。安装过程中需要配置各个服务的...
5. **消息队列**:Nova使用RabbitMQ作为消息队列,实现服务间的异步通信。服务之间的通信基于AMQP协议,可以在`nova/objects`和`nova/conductor`等目录中找到相关实现。 6. **配置文件**:Nova的配置文件通常位于`...
- 安装RabbitMQ作为OpenStack组件之间的消息传递系统。 - 配置Web监控插件以监控队列状态。 #### 五、认证服务Keystone - **安装配置**: - 下载并安装Keystone服务。 - 创建配置文件,配置服务地址等信息。 ...
它使用Nailgun服务生成包含节点和角色信息的JSON文件,然后将这个文件发送到RabbitMQ的消息队列中。Astute的工作进程在收到这些信息后,会在Cobbler中部署到每个节点。 可用性区域(Availability Zone)是OpenStack...
5. Queue: Queue 是 Nova 的消息队列,负责为各种模块之间的通信提供一个集线器。 在 OpenStack 的数据库中,所有的数据都存储在 SQL 数据库中。OpenStack 支持多种数据库管理系统,包括 MySQL、PostgreSQL、SQLite...
Ceilometer 是 OpenStack 项目中的一个重要组成部分,主要用于监控 OpenStack 云环境中的各种资源和服务。它提供了丰富的接口来收集度量数据(Metrics)、事件(Events)和报警(Alarms)。在 OpenStack Mitaka 版本...
4. **数据库和消息队列**:OpenStack服务之间的通信通常依赖于数据库(如MySQL或MongoDB)和消息队列(如RabbitMQ)。需要为每个服务设置相应的数据库和队列连接。 5. **配置服务**:在/etc目录下创建各服务的配置...
13. **云平台的硬件和软件依赖**:OpenStack云平台的正常运行需要依赖于特定的硬件和软件配置,例如使用yum进行软件包管理、依赖于MySQL数据库存储数据、使用rabbitmq作为消息队列服务和memcached作为缓存服务等。...
本节课程主要讲解了 OpenStack 云计算平台中的消息队列服务安装和配置,使用 RabbitMQ 消息队列服务。课程的主要目的是让学生能够安装和配置 RabbitMQ 消息队列服务,了解 OpenStack 中的消息队列服务的重要性。 一...
基础环境配置涵盖了网络设置、时间同步(使用NTP服务)、安全设置、数据库和消息队列服务器的安装和配置。 身份服务(Identity Service)是OpenStack的核心组件之一,用于管理用户、租户(项目)、角色以及定义服务...
- 在计算节点上安装`openstack-nova-compute`,配置与控制节点的连接,确保与数据库和消息队列的通信。 4. **OpenStack-placement模块**: - placement服务跟踪资源供应和使用,帮助scheduler做出决策。 - 部署...
- 消息队列配置:OpenStack各个服务之间进行通信的后端系统,常用的消息队列服务包括RabbitMQ和Qpid。 - Identity服务的添加:Identity服务是整个OpenStack系统身份认证和授权的核心组件。在安装OpenStack的其它组件...
8. **数据库和消息队列服务**:OpenStack组件之间通过消息队列(如RabbitMQ)进行通信,并使用数据库(如MySQL或MongoDB)存储状态信息。配置这些服务以支持OpenStack组件。 9. **验证和测试**:部署完成后,通过...