天天看點

ActiveMQ的多種部署方式--ActiveMQ學習之二

 單點的ActiveMQ作為企業應用無法滿足高可用和叢集的需求,是以ActiveMQ提供了master-slave、broker cluster等多種部署方式,但通過分析多種部署方式之後我認為需要将兩種部署方式相結合才能滿足我們公司分布式和高可用的需求,是以後面就重點将解如何将兩種部署方式相結合。

1、Master-Slave部署方式

1)shared filesystem Master-Slave部署方式

         主要是通過共享存儲目錄來實作master和slave的熱備,所有的ActiveMQ應用都在不斷地擷取共享目錄的控制權,哪個應用搶到了控制權,它就成為master。

         多個共享存儲目錄的應用,誰先啟動,誰就可以最早取得共享目錄的控制權成為master,其他的應用就隻能作為slave。

ActiveMQ的多種部署方式--ActiveMQ學習之二

2)shared database Master-Slave方式

         與shared filesystem方式類似,隻是共享的存儲媒體由檔案系統改成了資料庫而已。

3)Replicated LevelDB Store方式

         這種主備方式是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失敗了,服務中斷。

ActiveMQ的多種部署方式--ActiveMQ學習之二
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:// 0.0.0.0:61617)"duplex="false"/>

</networkConnectors>

2、  修改Broker-A節點中的服務提供端口為61616:

<transportConnectors>

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

</transportConnectors>

3、  在Broker-B節點中添加networkConnector節點:

<networkConnectors> 

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

</networkConnectors>

4、  修改Broker-A節點中的服務提供端口為61617:

<transportConnectors>

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

</transportConnectors>

5、分别啟動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://0.0.0.0: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://0.0.0.0:61617" discoveryUri="multicast://default"/>

</transportConnectors>

5、啟動Broker-A和Broker-B

2、Master-Slave與Broker-Cluster相結合的部署方式

         可以看到Master-Slave的部署方式雖然解決了高可用的問題,但不支援負載均衡,Broker-Cluster解決了負載均衡,但當其中一個Broker突然宕掉的話,那麼存在于該Broker上處于Pending狀态的message将會丢失,無法達到高可用的目的。

         由于目前ActiveMQ官網上并沒有一個明确的将兩種部署方式相結合的部署方案,是以我嘗試者把兩者結合起來部署:

ActiveMQ的多種部署方式--ActiveMQ學習之二

1、部署的配置修改

         這裡以Broker-A + Broker-B建立cluster,Broker-C作為Broker-B的slave為例:

1)首先在Broker-A節點中添加networkConnector節點:

<networkConnectors> 

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

</networkConnectors>

2)修改Broker-A節點中的服務提供端口為61616:

<transportConnectors>

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

</transportConnectors>

3)在Broker-B節點中添加networkConnector節點:

<networkConnectors> 

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

</networkConnectors>

4)修改Broker-B節點中的服務提供端口為61617:

<transportConnectors>

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

</transportConnectors>

5)修改Broker-B節點中的持久化方式:

      <persistenceAdapter>

           <kahaDB directory="/localhost/kahadb"/>

        </persistenceAdapter>

6)在Broker-C節點中添加networkConnector節點:

<networkConnectors> 

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

</networkConnectors>

7)修改Broker-C節點中的服務提供端口為61618:

<transportConnectors>

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

</transportConnectors>

8)修改Broker-B節點中的持久化方式:

      <persistenceAdapter>

           <kahaDB directory="/localhost/kahadb"/>

       </persistenceAdapter>

9)分别啟動broker-A、broker-B、broker-C,因為是broker-B先啟動,是以“/localhost/kahadb”目錄被lock住,broker-C将一直處于挂起狀态,當人為停掉broker-B之後,broker-C将擷取目錄“/localhost/kahadb”的控制權,重新與broker-A組成cluster提供服務。