ActiveMQ 是Apache出品,最流行的,能力强劲的开源消息总线。彻底支持JMS1.1和J2EE 1.4规范的JMS Provider实现node
利用官方提供的基于network的cluster方案。数据库
基于cluster的方案,用的版本比较旧5.6,其network之间通道存在tcp半链接问题,致使集群频频出现问题。服务器
目前是,直接采用一台MQ进行业务操做,按现有业务,能够支持现有的高并发。网络
实际上,目前迫切须要的是进行MQ的高可用,即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来消费。负载均衡
<networkConnectors> <networkConnector uri="static:(tcp:// 0.0.0.0:61617)"duplex="false"/> </networkConnectors>
<networkConnectors> <networkConnectoruri="multicast://default" dynamicOnly="true" networkTTL="3" prefetchSize="1" decreaseNetworkConsumerPriority="true" /> </networkConnectors>
主要是经过共享存储目录来实现master和slave的热备,全部的ActiveMQ应用都在不断地获取共享目录的控制权,哪一个应用抢到了控制权,它就成为master。tcp
多个共享存储目录的应用,谁先启动,谁就能够最先取得共享目录的控制权成为master,其余的应用就只能做为slave。ide
与shared filesystem方式相似,只是共享的存储介质由文件系统改为了数据库而已。高并发
这种主备方式是ActiveMQ5.9之后才新增的特性,使用ZooKeeper协调选择一个node做为master。被选择的master broker node开启并接受客户端链接。性能
其余node转入slave模式,链接master并同步他们的存储状态。slave不接受客户端链接。全部的存储操做都将被复制到链接至Master的slaves。
若是master死了,获得了最新更新的slave被容许成为master。fialed node可以从新加入到网络中并链接master进入slave mode。全部须要同步的disk的消息操做都将等待存储状态被复制到其余法定节点的操做完成才能完成。因此,若是你配置了replicas=3,那么法定大小是(3/2)+1=2. Master将会存储并更新而后等待 (2-1)=1个slave存储和更新完成,才汇报success。至于为何是2-1,熟悉Zookeeper的应该知道,有一个node要做为观擦者存在。
单一个新的master被选中,你须要至少保障一个法定node在线以可以找到拥有最新状态的node。这个node将会成为新的master。所以,推荐运行至少3个replica nodes,以防止一个node失败了,服务中断。
所以,咱们把MASTER/SLAVE和BROKER CLUSTER二者相结合,能够获得一个彻底解决方案:即又能够作到集群又能够作到任何一个BROKER若是发生宕机节点消息也不丢失。
根据以上方案,结合优缺点,最终咱们须要实现集群的高可用和负载均衡,因此结合后,基于zookeeper+network的集群解决方案,具体以下图所示:
集群链接方式以下图:
针对如今线上使用MQ的现状分析,目前须要首先考虑支持高可用,因此以上方案可进行逐步实施:
1 对现有的MQ升级到最新版本,并测试验证对5.6的兼容性 2 搭建基于zookeeper的Master-Slave集群GA-MQ。 3 在高可用集群GA-MQ和原有MQ之间创建network链接。 4 切换线上生产者到新的集群GA-MQ 5 切换线上消费者到新的集群GA-MQ 6 等待原有MQ消息彻底处理完成后,关闭服务。 7 搭建GB-MQ集群,并按照业务进行负载划分。 8 在GA-MQ和GB-MQ之间创建network链接,实现最终方案。
以上每一步,都须要进行严格的测试验证,才可进行生产环境的切换。