您的位置:首页 > 运维架构 > 网站架构

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

2016-11-14 17:32 309 查看
本文参考自: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&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&wireFormat.maxFrameSize=104857600"/>
</transportConnectors>
(3)、分别启动Broker-A和Broker-B

2)Dynamic Broker-Cluster部署(动态部署)
         在activemq.xml文件中不直接指定Broker需要建立桥连接的其他Broker,由activemq在启动后动态查找:

4000
(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&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&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&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

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: