图一 图一说明:
1、集群一包含3个队列:Amq1、Amq2、Amq3;集群二包含2个队列:Bmq1、Bmq2
2、生产者一生产的消息可以同时发送到群集1、集群2,生产者二也一样
3、消费者一可以同时从集群1、集群2消费消息,消费者二也一样
4、某一个集群挂了,生产者和消费者可以不间断使用其它集群发送,消费消息
一、本文目的
本介绍多个集群的搭建和使用,并通过负载均衡方式使用同一生产者往多个集群发送消息或使用同一消费者从多个集群消费消息。
二、概念说明
1、多个集群
图一中,集群1包含三个activemq,集群2包含2个activemq,两个集群间数据可以共用
2、负载均衡
图一中,生产者1发送的消息可根据集群的负载分别发送到集群1或集群2,当其中一个集群挂掉时,生产者1仍然会向集群2发送消息
图一中,消费者1,消费者2都可以从集群1,集群2中消费消息,当其中一个集群挂掉时,消费者仍然能从另外一个集群消息消息
3、集群间的通讯:使用networkConnector配置
三、Activemq集群的搭建
注意:集群1和集群2中broker的name不能一样,zkPath不能一样
2、本文中主要搭建2个集群,集群1包含3个activemq、集群2包含2个activemq
IP:192.168.146.129 |
集群A | 控制台 | 服务接口 | 集群通讯接口 |
Amq1 | 8161 | 51511 | 61601 |
Amq2 | 8162 | 51512 | 61602 |
Amq3 | 8163 | 51513 | 61603 |
四、Activemq集群之间通讯
Activemq集群搭建有多个方法,本文主要是通过配置networkConnectors实现,该配置放在<broker>节点下,原理为集群1配置连接集群2的所有activemq,反之亦然。配置如下:
这也是最大的缺点,扩展性比较差
1、集群1的每个activemq配置如下:(集群1的url包含集群2所有的队列信息,端口为队列的服务端口)
<networkConnectors>
<networkConnector uri="static:(tcp://192.168.146.130:51511,tcp://192.168.1.101:51512)"/>
</networkConnectors>
2、集群2的每个activemq配置如下:(集群2的url包含集群1所有的队列信息,端口为队列的服务端口)
<networkConnectors> <networkConnector uri="static:(tcp://192.168.146.129:51511,tcp://192.168.146.129:51512,tcp://192.168.146.129:51513)"/>
</networkConnectors>
五、消息生产者向多个集群发送消息
本例使用的是点对点消息队列的demo,使用方法请参考:
http://www.cnblogs.com/gossip/p/5970090.html
需要注意的几点:
1、各个集群只有Master节点的控制台才能使用
2、ActiveMQConnectionFactory的brokerURL必须包含所有集群队列节点的url,包括集群1和集群2,之前以为只需要包含某一个集群的url,搞了半天发现没效果
测试集群的高可用性:
1、集群1和集群2都注册到了ZooKeeper,都有各自的Master节点
2、两个集群中都只有Master节点的管控台才可用(下图为集群中Master队列收到的消息)
3、消息随机送到不同集群的Master队列中
4、手动停止集群2的Master队列,生产者卡顿了一下后继续往集群1发送消息,中间的消息并没有中断
5、重新启动集群2的Master队列后,生产者又重新向集群2的Master队列发送消息
六、消费者从多个集群消费消息
1、只有1个消费者时,随机从两个集群中消费消息
2、启动两个不同的消费者,他们都同时从集群1、集群2的消费消息。停止其中一个消费者后不影响另外一个消费者
3、关闭集群2的一个队列后(集群2只有两个队列,关闭其中1个后,整个集群都失效了),两个消费者都只从集群1消费消息
七、总结
上文中主要介绍了单个Activemq集群的高可用,一般应用已经足够。本文更进一步,作为高性能和扩展性的应用,通过多个集群的方式扩展队列,使得消息可以同时发送到多个队列,也可以通过多个消费者消费同一队列的消息。
八、参考资料