ActiveMQ的 HR + LB (高可用 + 负载均衡)部署方案

本文参考自:http://blog.csdn.net/jason5186/article/details/18703151

http://www.open-open.com/lib/view/open1400126457817.html

 

一、ActiveMq的多种部署方法

 

1、Master-Slave部署方式(HR模式)

1)shared filesystem Master-Slave部署方式

         主要是通过共享存储目录来实现master和slave的热备,所有的ActiveMQ应用都在不断地获取共享目录的控制权,哪个应用抢到了控制权,它就成为master

2)shared database Master-Slave方式

与shared filesystem方式类似,只是共享的存储介质由文件系统改成了数据库而已

3)Replicated LevelDB Store方式

这种主备方式是ActiveMQ5.9以后才新增的特性,使用ZooKeeper协调选择一个node作为master。被选择的master broker node开启并接受客户端连接

2、Broker-Cluster部署方式(负载均衡模式)

前面的Master-Slave的方式虽然能解决多服务热备的高可用问题,但无法解决负载均衡和分布式的问题。Broker-Cluster的部署方式就可以解决负载均衡的问题。

Broker-Cluster部署方式中,各个broker通过网络互相连接,并共享queue。当broker-A上面指定的queue-A中接收到一个message处于pending状态,而此时没有consumer连接broker-A时。如果cluster中的broker-B上面由一个consumer在消费queue-A的消息,那么broker-B会先通过内部网络获取到broker-A上面的message,并通知自己的consumer来消费。

1)static Broker-Cluster部署(静态部署)

在activemq.xml文件中静态指定Broker需要建立桥连接的其他Broker:

(1)、首先在Broker-A节点中添加networkConnector节点:

 

 

 

<networkConnectors> 

                <networkConnector   uri="static:(tcp:// 127.0.0.1:61617)" duplex="false"/>

</networkConnectors>

修改Broker-A节点对外提供的端口

 

<transportConnectors>

         <transportConnectorname="openwire"uri="tcp://127.0。0.1:61616?maximumConnections=1000&amp;wireFormat.maxFrameSize=104857600"/>

</transportConnectors>

(2)、在Broker-B节点中添加networkConnector节点:

<networkConnectors> 

                <networkConnector   uri="static:(tcp:// 0.0.0.0:61616)" duplex="false"/>

</networkConnectors>

修改Broker-A节点中的服务提供端口为61617:

<transportConnectors>

         <transportConnectorname="openwire"uri="tcp://127.0.0.1:61617?maximumConnections=1000&amp;wireFormat.maxFrameSize=104857600"/>

</transportConnectors>

(3)、分别启动Broker-A和Broker-B

 

2)Dynamic Broker-Cluster部署(动态部署)

         在activemq.xml文件中不直接指定Broker需要建立桥连接的其他Broker,由activemq在启动后动态查找:

(1)、  首先在Broker-A节点中添加networkConnector节点:

<networkConnectors> 

                <networkConnectoruri="multicast://default"

           dynamicOnly="true"

           networkTTL="3"

           prefetchSize="1"

           decreaseNetworkConsumerPriority="true" />

</networkConnectors>

(2)、修改Broker-A节点中的服务提供端口为61616:

<transportConnectors>

         <transportConnectorname="openwire"uri="tcp://127.0.0.1:61616? " discoveryUri="multicast://default"/>

</transportConnectors>

(3)、在Broker-B节点中添加networkConnector节点:

<networkConnectors> 

                <networkConnectoruri="multicast://default"

           dynamicOnly="true"

           networkTTL="3"

           prefetchSize="1"

           decreaseNetworkConsumerPriority="true" />

</networkConnectors>

(4)、修改Broker-B节点中的服务提供端口为61617:

<transportConnectors>

         <transportConnectorname="openwire"uri="tcp://127.0.0.1:61617" discoveryUri="multicast://default"/>

</transportConnectors>

(5)、启动Broker-A和Broker-B

3、Master-Slave与Broker-Cluster相结合的部署方式(HR + LB)

可以看到Master-Slave的部署方式虽然解决了高可用的问题,但不支持负载均衡,Broker-Cluster解决了负载均衡,但当其中一个Broker突然宕掉的话,那么存在于该Broker上处于Pending状态的message将会丢失,无法达到高可用的目的。

(1)如图所示:这里以Broker-A + Broker-B建立cluster,Broker-C作为Broker-B的slave为例

(这里采用的是 shared database Master-Slave  +static Broker-Cluster 部署方式)

(2)首先在Broker-A节点中添加networkConnector节点:

<networkConnectors> 

                <networkConnector   uri="masterslave:(tcp://127.0.0.1:61617,tcp:// 127.0.0.1:61618)"  duplex="false"/>

</networkConnectors>

(3)修改Broker-A节点中的服务提供端口为61616:

<transportConnectors>

         <transportConnectorname="openwire"uri="tcp://127.0.0.1:61616?maximumConnections=1000&amp;wireFormat.maxFrameSize=104857600"/>

</transportConnectors>

(4)在Broker-B节点中添加networkConnector节点:

<networkConnectors> 

                <networkConnector   uri="static:(tcp:// 127.0.0.1:61616)" duplex="false"/>

</networkConnectors>

(5)修改Broker-B节点中的服务提供端口为61617:

<transportConnectors>

         <transportConnectorname="openwire"uri="tcp://127.0.0.1:61617?maximumConnections=1000&amp;wireFormat.maxFrameSize=104857600"/>

</transportConnectors>

(6)修改Broker-B节点中的持久化方式:

      <persistenceAdapter>

           <kahaDB directory="X:\\shareBrokerData"
                                  enableIndexWriteAsync="true"
                                  enableJournalDiskSyncs="false" />

        </persistenceAdapter>

(7)在Broker-C节点中添加networkConnector节点:

<networkConnectors> 

                <networkConnector   uri="static:(tcp:// 127.0.0.1:61616)" duplex="false"/>

</networkConnectors>

(8)修改Broker-C节点中的服务提供端口为61618:

<transportConnectors>

         <transportConnectorname="openwire"uri="tcp://127.0.0.1:61618?maximumConnections=1000&amp;wireFormat.maxFrameSize=104857600"/>

</transportConnectors>

(9)修改Broker-C节点中的持久化方式:

      <persistenceAdapter>

         <kahaDB directory="X:\\shareBrokerData"
                                  enableIndexWriteAsync="true"
                                  enableJournalDiskSyncs="false" />

       </persistenceAdapter>

(10)分别启动broker-A、broker-B、broker-C,因为是broker-B先启动,所以”shareBrokerData”目录被lock住,broker-C将一直处于挂起状态,当人为停掉broker-B之后,broker-C将获取目录“shareBrokerData”的控制权,重新与broker-A组成cluster提供服务。

(11)、测试结果

1)LB测试结果:启动2个接受者

2)HR测试结果;干掉61617(Master),61618会自动启动,同时reciver2会变动

3)LB再次测试:多启动几个reciver

 

 

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值