rabbitmq High Availability
每个rabbitmq node运行RabbitMQ application,共享用户virtual hosts, queues, exchanges, etc.
一个nodes组称之为一个集群。
所有的RabbitMQ broker上的操作所需要的data/state都是全节点复制,唯一的例外是message queues,,它只存放在创建它的node上,但对所有节点可见/可取。
为了复制message queues到所有节点需要打开mirrored queues。
下面创建一个RabbitMQ brokers集群,打开mirrored queues。
3个节点:
node1 10.15.85.141
node2 10.15.85.142
node3 10.15.85.143
注意:这并非完整的HA方案,仅仅是为了演示非单点故障。
1. 第一步:停掉node-01上的所有OpenStack services
2. 拷贝erlang cookie到其他2个节点:
% scp /var/lib/rabbitmq/.erlang.cookie root@node-:/var/lib/rabbitmq/.erlang.cookie
% scp /var/lib/rabbitmq/.erlang.cookie root@node-:/var/lib/rabbitmq/.erlang.cookie 确保权限为: user 'rabbitmq', group 'rabbitmq'
% chown rabbitmq:rabbitmq /var/lib/rabbitmq/.erlang.cookie
% chmod /var/lib/rabbitmq/.erlang.cookie
3. 启动node-02 和 node-03的RabbitMQ service
% chkconfig rabbitmq-server on
% service rabbitmq-server start
现在有个3个RabbitMQ brokers,下一步就是组建集群并开通 mirrored queues。
4. 让node 2/3加入到node1:
On node-:
# rabbitmqctl stop_app
Stopping node 'rabbit@node-02' ...
...done. # rabbitmqctl join_cluster rabbit@node-
Clustering node 'rabbit@node-02' with 'rabbit@node-01' ...
...done. # rabbitmqctl start_app
Starting node 'rabbit@node-02' ...
...done. On node-:
# rabbitmqctl stop_app
Stopping node 'rabbit@node-03' ...
...done. # rabbitmqctl join_cluster rabbit@node-
Clustering node 'rabbit@node-03' with 'rabbit@node-01' ...
...done. # rabbitmqctl start_app
Starting node 'rabbit@node-03' ...
...done.
现在有了3个节点的RabbitMQ cluster. 查看集群状态:
# rabbitmqctl cluster_status
Cluster status of node 'rabbit@node-01' ...
[{nodes,[{disc,['rabbit@node-01','rabbit@node-02',
'rabbit@node-03']}]},
{running_nodes,['rabbit@node-03','rabbit@node-02',
'rabbit@node-01']},
{partitions,[]}]
...done.
RabbitMQ clustering不能处理网络分割,也就是说不能跨WAN使用, shovel or federation plugins可以解决这个问题。
4.1 集群节点可以随时stop/start
node2$ rabbitmqctl stop node2$ rabbitmq-server --detached
4.2 集群节点可以随时退出和加入
node2$ rabbitmqctl stop_app node2$ rabbitmqctl reset node2$ rabbitmqctl start_app
现在node2独立了。
也可以从node1上移除node2:
node2$ rabbitmqctl stop_app node1$ rabbitmqctl forget_cluster_node rabbit@node2
注意:这时node2 依然认为它和node1是一个集群,直接重启它会出错,需要reset它:
node2$ rabbitmqctl reset
4.3 为了实验,一个机器上可以运行多个RabbitMQ nodes,前提是每个node的名字和ip/port不同。
详见:
http://www.rabbitmq.com/clustering.html
5. 创建policy来 Enable mirrored queues
% rabbitmqctl set_policy HA '^(?!amq\.).*' '{"ha-mode": "all"}'
详细配置见:
http://www.rabbitmq.com/ha.html
6. 既然消息队列可以从3个任意的RabbitMQ brokers访问,在节点1上setup一个LB HAProxy:
Install haproxy on node-.
% yum install haproxy
Edit /etc/haproxy/haproxy.cfg and create a simple TCP proxy for RabbitMQ.
global
daemon defaults
mode tcp
maxconn
timeout connect 5s
timeout client 100s
timeout server 100s listen rabbitmq 10.15.85.141:
mode tcp
balance roundrobin
server node- 10.15.85.141: check inter 5s rise fall
server node- 10.15.85.142: check inter 5s rise fall
server node- 10.15.85.143: check inter 5s rise fall
haproxy位于10.15.85.141:5670
到这个proxy的连接会round-robin到3个节点上。
7.启动haproxy
% service haproxy start
8.让OpenStack service指向haproxy
Neutron:
openstack-config --set /etc/neutron/neutron.conf DEFAULT rabbit_host 10.15.85.141
openstack-config --set /etc/neutron/neutron.conf DEFAULT rabbit_port
Nova:
openstack-config --set /etc/nova/nova.conf DEFAULT rabbit_host 10.15.85.141
openstack-config --set /etc/nova/nova.conf DEFAULT rabbit_port
Glance:
openstack-config --set /etc/glance/glance-api.conf DEFAULT rabbit_host 10.15.85.141
openstack-config --set /etc/glance/glance-api.conf DEFAULT rabbit_port
Cinder:
openstack-config --set /etc/cinder/cinder.conf DEFAULT rabbit_host 10.15.85.141
openstack-config --set /etc/cinder/cinder.conf DEFAULT rabbit_port
Ceilometer:
openstack-config --set /etc/ceilometer/ceilometer.conf DEFAULT rabbit_host 10.15.85.141
openstack-config --set /etc/ceilometer/ceilometer.conf DEFAULT rabbit_port
9 最后把这个集群写入到配置文件/etc/rabbitmq/rabbitmq.config,这样node启动时会自动创建该集群
[{rabbit,
[{cluster_nodes, {['rabbit@node-01', 'rabbit@node-02', 'rabbit@node-03'], ram}}]}].
注意:有很多旧文档依然推荐用pacemake和DRBD作为rabbitmq的HA方案,有了queue mirror技术,这个已经过时了。
详见:
http://www.rabbitmq.com/pacemaker.html
High availability with Pacemaker and DRBD
参考:
https://www.rdoproject.org/RabbitMQ
http://blog.flux7.com/blogs/tutorials/how-to-creating-highly-available-message-queues-using-rabbitmq
rabbitmq High Availability的更多相关文章
- RabbitMQ概念及环境搭建(四)RabbitMQ High Availability
#################################################### RabbitMQ High Availability #################### ...
- RabbitMQ学习之集群消息可靠性测试
之前介绍过关于消息发送和接收的可靠性:RabbitMQ学习之消息可靠性及特性 下面主要介绍一下集群环境下,rabbitmq实例宕机的情况下,消息的可靠性.验证rabbitmq版本[3.4.1]. 集群 ...
- ActiveMQ, Qpid, HornetQ and RabbitMQ in Comparison
国内私募机构九鼎控股打造APP,来就送 20元现金领取地址:http://jdb.jiudingcapital.com/phone.html内部邀请码:C8E245J (不写邀请码,没有现金送)国内私 ...
- Exploring Message Brokers: RabbitMQ, Kafka, ActiveMQ, and Kestrel--reference
[This article was originally written by Yves Trudeau.] http://java.dzone.com/articles/exploring-mess ...
- rabbitmq Clustering Guide--官方
官方文档地址:http://www.rabbitmq.com/documentation.html A RabbitMQ broker is a logical grouping of one or ...
- Kafka、ActiveMQ、RabbitMQ、RocketMQ 区别以及高可用原理
为什么使用消息队列 其实就是问问你消息队列都有哪些使用场景,然后你项目里具体是什么场景,说说你在这个场景里用消息队列是什么? 面试官问你这个问题,期望的一个回答是说,你们公司有个什么业务场景,这个业务 ...
- FW 构建OpenStack的高可用性(HA,High Availability)
原文地址:http://blog.csdn.net/hilyoo/article/details/7704280 1.CAP理论 1) CAP 理论给出了3个基本要素: 一致性 ( Consisten ...
- RabbitMQ脑裂问题解决方案调查
现象: RabbitMQ GUI上显示 Network partition detectedMnesia reports that this RabbitMQ cluster has experien ...
- Openstack关于Regions和Availability Zones
在AWS中有Region和Availability Zones的概念,并且在openstack中也实现了两者,只是不太容易看出来. 此文主要介绍他们的概念和关系,以及在openstack中的实现. 如 ...
随机推荐
- 深度扫盲O2O
http://www.ftchinese.com/interactive/5038?i=3 http://www.ftchinese.com/interactive/5038?i=3
- buffer/interger overflow /return-to-libc攻击实验
buffer/interger overflow /return-to-libc攻击实验 http://blog.sina.com.cn/s/blog_70dd16910100rdgn.html ht ...
- Java 之 Servlet
JavaWeb 三大组件: Servlet, Filter, Listener. Servlet 的作用是处理请求,服务器会把接收到的请求交给 Servlet 来处理.在 Servlet 中通常需要: ...
- springmvc控制器controller单例问题
springmvc controller默认的是单例singleton的,具体可以查看注解scope可以一目了然. 单例的原因有二: 1.为了性能. 2.不需要多例. 1.这个不用废话了,单例不用每次 ...
- 我的Android进阶之旅------>android Button上面的英文字符串自动大写的问题解决
今天碰到一个关于Button的问题:android Button上面的英文字符串会自动变成大写,运行的Android 5.1版本,如下图所示: 图1:Button 图2:TextView 这个Butt ...
- Python游戏引擎开发(五):Sprite精灵类和鼠标事件
本次来实现Sprite类和鼠标事件. 说起这个Sprite啊,涉及过2D游戏研究领域的看官应该都听说过它. 它中文原意是"精灵",只是在不同人的眼中,它所表示的意义不同. 比方说在 ...
- Python3+Selenium3自动化测试-(一)
完成环境的安装并测试之后,我们对Selenium有了一定的了解了,接下来我们继续驱动浏览器做一些基本操作: 窗口尺寸设置.网页截图.刷新.前进和后退 窗口尺寸设置 在测试过程中,我们可能会要求打开浏览 ...
- 怎样将Excel包含某字符的单元格填充颜色
在处理数据的时候,xmyanke想将Excel中包含某字符的单元格填充蓝色,比较容易看清,弄了好一阵子都没完成,最后试用条件格式处理了一下,终于实现了. 比如要将A1到A12区间包含数字1的单元格填充 ...
- zz Qt下 QString转char*和char []
以下内容为转载:http://www.cnblogs.com/Romi/archive/2012/03/12/2392478.html -------------------------------- ...
- c++中的构造函数初始化列表
三种情况下,必须在构造函数初始化列表中初始化成员: 1.const成员 2.引用成员 3.没有默认构造函数的成员