声明:
本博客欢迎转发,但请保留原作者信息!内容系本人学习、研究和总结,如有雷同,实属荣幸!
原文地址: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:- sudo service rabbitmq-server stop
- scp /var/lib/rabbitmq/.erlang.cookie \
- root@rabbit2:/var/lib/rabbitmq/.erlang.cookie
- sudo service rabbitmq-server start
建立集群
- rabbitmqctl stop_app
- rabbitmqctl cluster rabbit@rabbit1
- rabbitmqctl start_app
完成后可以在集群中任意一台RabbitMQ上看到集群状态
- $ sudo rabbitmqctl cluster_status
- Cluster status of node rabbit@rabbit1 ...
- [{nodes,[{disc,[rabbit@rabbit1]},{ram,[rabbit@rabbit2]}]},
- {running_nodes,[rabbit@rabbit2,rabbit@rabbit1]}]
- ...done.
2. 配置nova
编辑nova.conf- rabbit_hosts = rabbit1:5672,rabbit2:5672
- rabbit_host = rabbit1
- 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