一. 简介
activemq高可用集群只能系统的可用性,如果需要提高并发,则需要搭建负载均衡。
实现负载,就是俩个高可用集群,每个集群的主节点来负载均衡。
zookeeper集群的安装说明,请参照笔者的另一篇博客: linux下安装zookeeper集群
activemq高可用集群的搭建说明,请参照笔者的另一篇博客:linux下搭建activemq高可用集群
二. 集群部署说明
2.1 节点信息
2.2 安装activemq
给三台服务器按照上面的顺序分别安装六台activemq.
activemq的安装说明,请参照笔者的另一篇博客: linux下安装activemq
注:此时将mq安装在了/usr/local/env/activemq目录下,如下图:
三. 搭建高可用集群clusterA和clusterB
3.1 配置高可用clusterA
3.1.1 修改activemq.xml
1) 修改brokerName为“clusterA”
注: MqA1, MqA2, MqA3的均修改如下:
2) 为persistenceAdapter添加replicatedLevelDB元素
MqA1:
<persistenceAdapter>
<!-- <kahaDB directory="${activemq.data}/kahadb"/> -->
<!-- activemq zookeeper high availiability -->
<replicatedLevelDB
directory="${activemq.data}/leveldb"
replicas="3"
bind="tcp://0.0.0.0:62624"
zkAddress="182.61.53.64:2181,182.61.61.90:2181,182.61.32.229:2181"
hostname="182.61.53.64"
zkPath="/activemq/leveldb-stores"
/>
</persistenceAdapter>
MqA2:
<persistenceAdapter>
<!-- <kahaDB directory="${activemq.data}/kahadb"/> -->
<!-- activemq zookeeper high availiability -->
<replicatedLevelDB
directory="${activemq.data}/leveldb"
replicas="3"
bind="tcp://0.0.0.0:62625"
zkAddress="182.61.53.64:2181,182.61.61.90:2181,182.61.32.229:2181"
hostname="182.61.61.90"
zkPath="/activemq/leveldb-stores"
/>
</persistenceAdapter>
MqA3:
<persistenceAdapter>
<!-- <kahaDB directory="${activemq.data}/kahadb"/> -->
<!-- activemq zookeeper high availiability -->
<replicatedLevelDB
directory="${activemq.data}/leveldb"
replicas="3"
bind="tcp://0.0.0.0:62626"
zkAddress="182.61.53.64:2181,182.61.61.90:2181,182.61.32.229:2181"
hostname="182.61.32.229"
zkPath="/activemq/leveldb-stores"
/>
</persistenceAdapter>
3) 修改消息端口uri
MqA1:
MqA2:
MqA3:
3.1.2 修改jetty.xml
1) 修改控制台访问端口
MqA1:
MqA2:
MqA3:
3.1.3 测试clusterA集群高可用
测试代码请参照:linux下搭建activemq高可用集群 中的测试代码。
3.2 配置高可用clusterB
3.2.1 修改activemq.xml
1) 修改brokerName为“clusterB”
注: MqB1, MqB2, MqB3的均修改如下:
2) 为persistenceAdapter添加replicatedLevelDB元素
MqB1:
<persistenceAdapter>
<!-- <kahaDB directory="${activemq.data}/kahadb"/> -->
<!-- activemq zookeeper high availiability -->
<replicatedLevelDB
directory="${activemq.data}/leveldb"
replicas="3"
bind="tcp://0.0.0.0:62627"
zkAddress="182.61.53.64:2181,182.61.61.90:2181,182.61.32.229:2181"
hostname="182.61.53.64"
zkPath="/activemq/leveldb-stores"
/>
</persistenceAdapter>
MqB2:
<persistenceAdapter>
<!-- <kahaDB directory="${activemq.data}/kahadb"/> -->
<!-- activemq zookeeper high availiability -->
<replicatedLevelDB
directory="${activemq.data}/leveldb"
replicas="3"
bind="tcp://0.0.0.0:62628"
zkAddress="182.61.53.64:2181,182.61.61.90:2181,182.61.32.229:2181"
hostname="182.61.61.90"
zkPath="/activemq/leveldb-stores"
/>
</persistenceAdapter>
MqB3:
<persistenceAdapter>
<!-- <kahaDB directory="${activemq.data}/kahadb"/> -->
<!-- activemq zookeeper high availiability -->
<replicatedLevelDB
directory="${activemq.data}/leveldb"
replicas="3"
bind="tcp://0.0.0.0:62629"
zkAddress="182.61.53.64:2181,182.61.61.90:2181,182.61.32.229:2181"
hostname="182.61.32.229"
zkPath="/activemq/leveldb-stores"
/>
</persistenceAdapter>
3) 修改消息端口uri
MqB1:
MqB2:
MqB3:
3.2.2 修改jetty.xml
1) 修改控制台访问端口
MqB1:
MqB2:
MqB3:
3.2.3 测试clusterB集群高可用
测试代码请参照:linux下搭建activemq高可用集群 中的测试代码。
四. 搭建负载均衡集群
注: 要让两个ActiveMQ集群能够实现负载均衡只需要在config目录下的activemq.xml中配置桥接网络转移地址,这样消费端就可以同时消费两个集群中消息队列的请求信息。networkConnectors元素要在persistenceAdapter元素之前。
4.1 在clusterA集群中配置clusterB集群的桥接地址
注: MqA1, MqA2, MqA3的均修改如下:
<!-- loadbalance networkconnector to clusterB -->
<networkConnectors>
<networkConnector
uri="static:(tcp://182.61.53.64:51517,tcp://182.61.61.90:51518,tcp://182.61.32.229:51519)"
duplex="false"
/>
</networkConnectors>
4.2 在clusterB集群中配置clusterA集群的桥接地址
注: MqB1, MqB2, MqB3的均修改如下:
<!-- loadbalance networkconnector to clusterB -->
<networkConnectors>
<networkConnector
uri="static:(tcp://182.61.53.64:51514,tcp://182.61.61.90:51515,tcp://182.61.32.229:51516)"
duplex="false"
/>
</networkConnectors>
4.3. 测试
4.3.1 启动mq
分别启动MqA1,MqA2,MqA3,MqB1,MqB2,MqB3六台activemq
此时,可以看到:MqA2(90:8165) 和 MqB1(64:8167) 为主节点
4.3.2 代码测试
测试代码请参照:linux下搭建activemq高可用集群 中的测试代码。
1) 此时,要将所有的activemq连接信息都添加到配置文件中,如下:
2) 测试结果:
发送100条MQ消息,有时候是clusterA主节点(http://182.61.61.90:8165)来发送,有时候是clusterB主节点(http://182.61.53.64:8167)来发送。
发了6次100条的,其中5次是http://182.61.61.90:8165发送的,1次是http://182.61.53.64:8167发送的。如下:
五. 总结
之前一直以为是 我给一个队列发送1000条消息,mq负载均衡集群A的主节点会负载400条,集群B的主节点会负载剩下的600条。但是现在看来,同一个queue, mq负载均衡只会由一个集群的主节点来全部消费消息,负载主要体现在是由集群A的主节点来消费消息还是由集群B的主节点来消费消息。 唉,上周都配好了,一直感觉有问题,果然是思路的问题。
猜测应该是 比方说 我发了10个队列,各自100条消息, mq负载均衡会给集群A的主节点5个队列,给集群B的主节点5个队列,这才是负载均衡,是针对队列/主题来的,一个队列/主题的所有消息只能由一台mq来消费。