[openstack]配置高可用RabbitMQ

来源:互联网 发布:淘宝联盟设置推广位 编辑:程序博客网 时间:2024/05/16 05:52

声明:

本博客欢迎转发,但请保留原作者信息!内容系本人学习、研究和总结,如有雷同,实属荣幸!

原文地址:http://blog.csdn.net/gtt116/



概述

Havana的nova已经支持使用RabbitMQ的高可用队列。此文章介绍高可用队列的特点,如何配置nova使用高可用队列,及测试结果。

高可用队列

RabbitMQ的高可用首先要用到集群模式(Cluster),在集群中的所有RabbitMQ实例互相感知对方的存在。RabbitMQ的高可用为Active/Active模式,多个RabbitMQ实例相互之间做镜像,即一条消息发给任意一个RabbitMQ实例后,RabbitMQ会负责将此消息同步到集群中的所有节点。如此RabbitMQ的客户端可以有两种使用方式:一种在RabbitMQ前部署Haproxy,向客户端隐藏集群的具体地址。另一种直接由客户端选择任意一个RabbitMQ实例连接,如果发生连接中断则选择另外一个MQ实例。

配置方法

在RabbitMQ3.X之前,申明一个高可用队列是客户端的责任,即一个RabbitMQ集群中,可以有非高可用队列和高可用队列同时存在。但是在RabbitMQ3.X之后,申请高可用的责任在服务端,即RabbitMQ的配置管理员一旦配置了高可用,那么所有的队列都成为高可用队列。由于我们使用的是RabbitMQ的2.8.4(debian), 2.7.1(ubuntu)。故本文介绍的高可用方案使用前一种申明方式。

部署nova使用高可用队列主要两个步骤:
1. 配置RabbitMQ集群
确保所有RabbitMQ服务不在运行,之后同步集群中所有RabbitMQ服务器上的cookie:
  1. sudo service rabbitmq-server stop  
  2. scp /var/lib/rabbitmq/.erlang.cookie \  
  3. root@rabbit2:/var/lib/rabbitmq/.erlang.cookie  
  4. sudo service rabbitmq-server start  

建立集群
  1. rabbitmqctl stop_app  
  2. rabbitmqctl cluster rabbit@rabbit1  
  3. rabbitmqctl start_app  

完成后可以在集群中任意一台RabbitMQ上看到集群状态
  1. $ sudo rabbitmqctl cluster_status  
  2. Cluster status of node rabbit@rabbit1 ...  
  3. [{nodes,[{disc,[rabbit@rabbit1]},{ram,[rabbit@rabbit2]}]},  
  4.  {running_nodes,[rabbit@rabbit2,rabbit@rabbit1]}]  
  5. ...done.  
2. 配置nova
编辑nova.conf
  1. rabbit_hosts = rabbit1:5672,rabbit2:5672  
  2. rabbit_host = rabbit1  
  3. rabbit_ha_queues = true  

如果配置了rabbit_hosts,那么nova将会按照顺序连接一个RabbitMQ服务,如果正在使用的MQ服务断开则依次尝试连接下一个,由于所有MQ的消息都是同步的,所以消息不会丢失。
如果配置了rabbit_host,那么需要在集群前架设haproxy,保证集群VIP服务正常。

之后重启nova的所有服务即可。

测试结果

按照如上配置方法,测试havana的nova,确认在某MQ停服的情况下nova的反应。

Case1:nova-api使用rabbit1,其他nova-X服务使用rabbit2

此case意在验证rabbitmq集群的同步功能,是否会对nova造成影响。

配置RabbitMQ集群,并且nova.conf中开启rabbit_ha_queues = true。nova-api使用的rabbit_host=rabbit1, 其他nova-X使用的rabbit_host=rabbit2,注意这里没有配置rabbit_hosts。之后正常使用nova服务,所有操作都正常执行。说明MQ的镜像模式可以支持nova的消息通信。

Case2:配置nova使用rabbit_hosts

此case意在观察MQ集群出现问题时nova的反应。同样配置RabbitMQ集群,配置nova.conf的rabbit_hosts=rabbit1:5672, rabbit2:5672。正常开启nova服务,观察到nova-X服务首先连接rabbit1服务,当关闭rabbit1服务后,连接断开,再次尝试连接rabbit1,失败后开始尝试连接rabbit2,之后保持连接rabbit2并正常服务。说明nova可以自行判断MQ服务的状态,并且自动重连,可以在不部署Haproxy的情况下使用高可用MQ。


总结

havana nova对高可用RabbitMQ的支持比较好,基本可以满足高可用需求,对于RabbitMQ的集群既可以部署haproxy,也可以直接配置rabbit_hosts,让nova自动重连。从方便运维的角度出发,减少不必要的依赖,减少出问题的可能,所以建议直接使用nova的rabbit_hosts。


参考资料

* http://previous.rabbitmq.com/v2_8_x/ha.html|http://previous.rabbitmq.com/v2_8_x/ha.html
* http://www.rabbitmq.com/ha.html|http://www.rabbitmq.com/ha.html
* http://docs.openstack.org/high-availability-guide/content/_configure_rabbitmq.html|http://docs.openstack.org/high-availability-guide/content/_configure_rabbitmq.html
0 0
原创粉丝点击