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鏈接,實現最終方案。
以上每一步,都須要進行嚴格的測試驗證,纔可進行生產環境的切換。