1. 程式人生 > >JMS學習十二(Spring+ActiveMQ叢集配置)

JMS學習十二(Spring+ActiveMQ叢集配置)

ActiveMQ叢集

        ActiveMQ具有強大和靈活的叢集功能,但在使用的過程中會發現很多的缺點,ActiveMQ的叢集方式主要由兩種:Master-Slave和Broker Cluster。

1、Master-Slave

        Master-Slave方式中,只能是Master提供服務,Slave是實時地備份Master的資料,以保證訊息的可靠性。當Master失效時,Slave會自動升級為Master,客戶端會自動連線到Slave上工作。Master-Slave模式分為三類:Pure Master Slave、Shared File System Master Slave和JDBC Master Slave。

(1)Pure Master Slave

    需要兩個Broker,一個作為Master,另一個作為Slave,執行時,Slave通過網路實時從Master處複製資料,同時,如果Slave和Master失去連線,Slave就會自動升級為Master,繼續為客戶端提供訊息服務,如圖所示:

    實踐時,我們使用兩個ActiveMQ伺服器,一個作為Master,Master不需要做特殊的配置;另一個作為Slave,配置${ACTIVEMQ_HOME}/conf/activemq.xml檔案,在<broker>節點中新增連線到Master的URI和設定Master失效後不關閉Slave,如下:

Xml程式碼  收藏程式碼
<broker xmlns="http://activemq.apache.org/schema/core" brokerName="pure_slave" masterConnectorURI="tcp://0.0.0.0:61616"   shutdownOnMasterFailure="false" dataDirectory="${activemq.base}">  

 同時修改Slave的服務埠,如:

Xml程式碼  收藏程式碼
<transportConnectors>  
            <transportConnector name="openwire" uri="tcp://0.0.0.0:61617"/>  
</transportConnectors>

為了看到實踐的效果,Master和Slave的訊息持久化介質都是採用MySQL,並且Master和Slave分別連線不同的資料庫。

    在訊息生產者應用和訊息消費者應用的Spring配置檔案中新增以下紅色內容:

Xml程式碼  收藏程式碼
  1. <property name="brokerURL" value="failover:(tcp://localhost:61616,tcp://localhost:61617)?initialReconnectDelay=100" />  
    配置完成後,我們可以通過以下步驟來進行測試:

A、啟動Master和Slave,啟動訊息生產者應用,並分別傳送一些Queue訊息和Topic訊息,如果此時訂閱Topic訊息的消費者設定了clientID,我們就可以在Master的資料庫和Slave的資料庫中看到尚未消費的訊息,包括Queue和Topic的訊息;

B、啟動消費者應用,可以接收到訊息;

C、關閉消費者,生產者繼續傳送一些訊息A;

D、停止Master;

E、生產者繼續傳送訊息B;

F、啟動消費者應用,消費者可以接收到訊息A和訊息B,說明Slave接替了Master的工作並複製了Master的訊息。

    這種方式只能兩臺機器做叢集,可以起到很好的雙機熱備功能,但只能失效一次,只能停機恢復Master-Slave結構。

(2)Shared File System Master Slave

        Shared File System Master Slave就是利用共享檔案系統做ActiveMQ叢集,是基於ActiveMQ的預設資料庫kahaDB完成的,kahaDB的底層是檔案系統。這種方式的叢集,Slave的個數沒有限制,哪個ActiveMQ例項先獲取共享檔案的鎖,那個例項就是Master,其它的ActiveMQ例項就是Slave,噹噹前的Master失效,其它的Slave就會去競爭共享檔案鎖,誰競爭到了誰就是Master。這種模式的好處就是當Master失效時不用手動去配置,只要有足夠多的Slave。Shared File System Master Slave模式如圖所示:

    本例子是在一臺機器上執行三個ActiveMQ例項,需要對ActiveMQ的配置檔案做一些簡單的配置,就是把持久化介面卡的儲存目錄改為本地磁碟的一個固定目錄,三個例項共享這個目錄,如下:

Xml程式碼  收藏程式碼
<persistenceAdapter>  
    <kahaDB directory="E:/XXX/XXX/XXX/cluster/shared_file/data/kahadb" />  
</persistenceAdapter>

然後修改ActiveMQ例項的服務埠和jetty的服務埠,防止端口占用異常。啟動三個ActiveMQ例項,就可以進行測試了。

    以上配置只能在一臺機器進行,如果各個ActiveMQ例項需要執行在不同的機器,就需要用到分散式檔案系統了。

(3)JDBC Master Slave

        JDBC Master Slave模式和Shared File Sysytem Master Slave模式的原理是一樣的,只是把共享檔案系統換成了共享資料庫。我們只需在所有的ActiveMQ的主配置檔案中(${ACTIVEMQ_HOME}/conf/activemq.xml)新增資料來源,所有的資料來源都指向同一個資料庫,如:

Xml程式碼  收藏程式碼
  1. <bean id="mysql-ds" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">  
  2.         <property name="driverClassName" value="com.mysql.jdbc.Driver"/>  
  3.         <property name="url" value="jdbc:mysql://localhost:3306/cluster_jdbc?relaxAutoCommit=true"/>  
  4.         <property name="username" value="root"/>  
  5.         <property name="password" value="root"/>  
  6.         <property name="maxActive" value="200"/>  
  7.         <property name="poolPreparedStatements" value="true"/>  
  8. </bean>  

 然後修改持久化介面卡。這種方式的叢集相對Shared File System Master Slave更加簡單,更加容易地進行分散式部署,但是如果資料庫失效,那麼所有的ActiveMQ例項都將失效。

    以上三種方式的叢集都不支援負載均衡,但可以解決單點故障的問題,以保證訊息服務的可靠性。

2、Broker Cluster

        Broker Cluster主要是通過network of Brokers在多個ActiveMQ例項之間進行訊息的路由。Broker的叢集分為Static Discovery和Dynamic Discovery兩種。

(1)Static Discovery叢集

Static Discovery叢集就是通過硬編碼的方式使用所有已知ActiveMQ例項節點的URI地址。如:訊息生產者應用連線一個ActiveMQ例項,我們暫時稱為MQ1,所有的訊息都由該例項提供;兩個訊息消費者應用分別連線另外兩個ActiveMQ例項,分別為MQ2和MQ3,兩個訊息消費者需要消費MQ1上的訊息,但它們連線的都不是MQ1,可以通過Static Discovery方式把MQ1上的訊息路由到MQ2和MQ3,為了保證消費者不因某個節點的失效而導致不能消費訊息,在消費者應用中需要配置所有節點的URI。

    生產者ActiveMQ例項不需要特殊的配置,所有的消費者ActiveMQ例項需要新增networkConnectors節點,連線到生產者MQ例項,如:

Xml程式碼  收藏程式碼
<networkConnectors>  
<networkConnector uri="static:failover://(tcp://localhost:61616)" duplex="true" />  
</networkConnectors>

上面這段配置需要加在<persistenceAdapter>節點的前面。然後在消費者應用中設定brokerURL的值如:

Xml程式碼  收藏程式碼
  1. <property name="brokerURL" value="<span style="color: #ff0000;">failover:(tcp://localhost:61617)</span>?initialReconnectDelay=100/>  
        Static Discovery叢集方式有些缺點,如不能解決單點故障問題,若某個Broker失效時,有可能造成資料的丟失,動態新增節點不夠智慧化。

(2)Dynamic Discovery叢集

        Dynamic Discovery叢集方式在配置ActiveMQ例項時,不需要知道所有其它例項的URI地址,只需在所有例項的${ACTIVEMQ_HOME}/conf/activemq.xml檔案中新增以下內容:

Xml程式碼  收藏程式碼
<networkConnectors>  
<networkConnector uri="multicast://default" />  
</networkConnectors>

 

 同時在<transportConnectors>節點中新增以下紅色部分內容:

Xml程式碼  收藏程式碼
  1. <transportConnectors>  
  2. <transportConnector name="openwire" uri="tcp://0.0.0.0:61616" <span style="color: #ff0000;">discoveryUri="multicast://default"</span> />  
  3. </transportConnectors>  

這樣就可以實現訊息在所有ActiveMQ例項之間進行路由。Dynamic Discovery叢集方式的缺點和Static Discovery一樣。

    從以上的分析可以看出,Master-Slave模式不支援負載均衡,但可以通過訊息的實時備份或共享保證訊息服務的可靠性,Broker Cluster模式支援負載均衡,可以提高訊息的消費能力,但不能保證訊息的可靠性。所以為了支援負載均衡,同時又保證訊息的可靠性,我們可以採用Msater-Slave+Broker Cluster的模式。

/************************** 個人總結***************************/

通過前面的學習,想實現叢集還是很簡單的,具體如下

1、如果想使用Broker相互資料的獲取則在訊息伺服器的activemq.xml配置檔案中配置networkConnection,而如果使用Master-Slave的方式則將持久化配置到資料庫或者同一個檔案地址。

2、訊息生產者和消費者連線訊息服務使用failover(失效轉移)。這樣其實簡單的叢集就ok了,其實上文講的很清楚,看看就ok了!

原文地址:http://bh-keven.iteye.com/blog/1617788

這也是最後一篇文章了吧activemq相關的能參考的文章列一下,這裡不包括我自己的哈哈!

ActiveMQ相關文章:

topic訊息模型持久訂閱: http://blog.csdn.net/zhu_tianwei/article/details/46303347
訊息過濾 : http://blog.csdn.net/zbw18297786698/article/details/52999451
資料庫持久化: http://www.cnblogs.com/xinhuaxuan/p/6128380.html
訊息持久化 使用記憶體:http://www.gaofi.cn/note/detail/61
activemq 支援的傳輸協議:http://blog.csdn.net/vtopqx/article/details/51787717
ssl傳輸方式:http://blog.csdn.net/xiaoming444/article/details/3979521
activemq 訊息broker叢集方式:http://www.cnblogs.com/leihenqianshang/articles/5623858.html
activemq broker 學習:http://manzhizhen.iteye.com/blog/2116920
activemq 兩種叢集方式:http://www.open-open.com/lib/view/open1400126457817.html
spring+active例項:http://www.cnblogs.com/xinhuaxuan/p/6111604.html
spring+active例項:http://blog.csdn.net/zbw18297786698/article/details/53140294
activemq + spring整合方式1 :http://www.cnblogs.com/xinhuaxuan/p/6111604.html
activemq + spring整合方式2:http://blog.csdn.net/zbw18297786698/article/details/53140294
activemq 官網是這種方式:http://blog.csdn.net/he90227/article/details/51241597     http://activemq.apache.org/spring-support.html
active+spring 監聽講解很清楚:http://blog.csdn.net/haoxingfeng/article/details/9167895
active+spring 訊息持久化:http://blog.csdn.net/s296850101/article/details/52382720 
active+spring 訊息持久化:http://greemranqq.iteye.com/blog/2167158    
activemq+spring 的叢集配置:http://bh-keven.iteye.com/blog/1617788