標籤:
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,繼續為用戶端提供Message Service,:
實踐時,我們使用兩個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代碼
- <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代碼
- <span style="color: #ff0000;"><persistenceAdapter>
- <kahaDB directory="E:/XXX/XXX/XXX/cluster/shared_file/data/kahadb" />
- </persistenceAdapter></span>
然後修改ActiveMQ執行個體的服務連接埠和jetty的服務連接埠,防止連接埠佔用異常。啟動三個ActiveMQ執行個體,就可以進行測試了。
以上配置只能在一台機器進行,如果各個ActiveMQ執行個體需要運行在不同的機器,就需要用到Distributed File System了。
(3)JDBC Master Slave
JDBC Master Slave模式和Shared File Sysytem Master Slave模式的原理是一樣的,只是把共用檔案系統換成了共用資料庫。我們只需在所有的ActiveMQ的主設定檔中(${ACTIVEMQ_HOME}/conf/activemq.xml)添加資料來源,所有的資料來源都指向同一個資料庫,如:
Xml代碼
- <bean id="mysql-ds" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
- <property name="driverClassName" value="com.mysql.jdbc.Driver"/>
- <property name="url" value="jdbc:mysql://localhost:3306/cluster_jdbc?relaxAutoCommit=true"/>
- <property name="username" value="root"/>
- <property name="password" value="root"/>
- <property name="maxActive" value="200"/>
- <property name="poolPreparedStatements" value="true"/>
- </bean>
然後修改持久化適配器。這種方式的叢集相對Shared File System Master Slave更加簡單,更加容易地進行分布式部署,但是如果資料庫失效,那麼所有的ActiveMQ執行個體都將失效。
以上三種方式的叢集都不支援負載平衡,但可以解決單點故障的問題,以保證Message Service的可靠性。
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代碼
- <span style="color: #ff0000;"><networkConnectors>
- <networkConnector uri="static:failover://(tcp://localhost:61616)" duplex="true" />
- </networkConnectors></span>
上面這段配置需要加在<persistenceAdapter>節點的前面。然後在消費者應用中設定brokerURL的值如:
Xml代碼
- <property name="brokerURL" value="<span style="color: #ff0000;">failover:(tcp://localhost:61617)</span>?initialReconnectDelay=100" />
Static Discovery叢集方式有些缺點,如不能解決單點故障問題,若某個Broker失效時,有可能造成資料的丟失,動態添加節點不夠智能化。
更加詳細的說明與配置請參考:http://activemq.apache.org/networks-of-brokers.html
(2)Dynamic Discovery叢集
Dynamic Discovery叢集方式在配置ActiveMQ執行個體時,不需要知道所有其它執行個體的URI地址,只需在所有執行個體的${ACTIVEMQ_HOME}/conf/activemq.xml檔案中添加以下內容:
Xml代碼
- <span style="color: #ff0000;"><networkConnectors>
- <networkConnector uri="multicast://default" />
- </networkConnectors></span>
同時在<transportConnectors>節點中添加以下紅色部分內容:
Xml代碼
- <transportConnectors>
- <transportConnector name="openwire" uri="tcp://0.0.0.0:61616" <span style="color: #ff0000;">discoveryUri="multicast://default"</span> />
- </transportConnectors>
這樣就可以實現訊息在所有ActiveMQ執行個體之間進行路由。Dynamic Discovery叢集方式的缺點和Static Discovery一樣。
從以上的分析可以看出,Master-Slave模式不支援負載平衡,但可以通過訊息的即時備份或共用保證Message Service的可靠性,Broker Cluster模式支援負載平衡,可以提高訊息的消費能力,但不能保證訊息的可靠性。所以為了支援負載平衡,同時又保證訊息的可靠性,我們可以採用Msater-Slave+Broker Cluster的模式。
ActiveMQ叢集應用