ActiveMQ進行高可用架構可以採用主從方式(Master-Slave)或負載均衡(集羣)方式。
1. 主從模式
Master-Slave方式中,只能是Master提供服務,Slave是實時地備份Master的數據,以保證消息的可靠性。當Master失效時,Slave會自動升級爲Master,客戶端會自動連接到Slave上工作。主從模式,可以使用如下方式實現:
1.1. 基於共享文件(Shared File System Master Slave)
這種方式Slave的個數沒有限制,哪個ActiveMQ實例先獲取共享文件的鎖,那個實例就是Master,其它的ActiveMQ實例就是Slave,噹噹前的Master失效,其它的Slave就會去競爭共享文件鎖,誰競爭到了誰就是Master。此模式結構圖如下:
1.2. 基於數據庫(JDBC Master Slave)
JDBC Master Slave模式和Shared File Sysytem Master Slave模式的原理是一樣的,只是把共享文件系統換成了共享數據庫。
1.3. 基於zookeeper
此種模式通過zookeeper做爲服務選取器來選擇activemq作爲master,稍後會進行具體介紹。
2. Broker集羣模式
此種配置是一個消費者連接到多個broker集羣的中的一個broker,當該broker出問題時,消費者自動連接到其他一個正常的broker。消費者使用 failover:// 協議來連接broker。broker之間的通過靜態發現(static discovery)和動態發現(dynamic discovery)來維持彼此發現,下面來介紹靜態發現和動態發現的機制。
2.1. Static Discovery集羣
靜態發現通過配置固定的broker uri來發現彼此,配置語法如下:
static:(uri1,uri2,uri3,...)?options
例如:
static:(tcp://localhost:61616,tcp://remotehost:61617?trace=false,vm://localbroker)?initialReconnectDelay=100
2.2. Dynamic Discovery集羣
動態發現機制是在各個broker啓動時通過Fanout transport來發現彼此。在配置ActiveMQ實例時,不需要知道所有其它實例的URI地址,只需在所有實例的${ACTIVEMQ_HOME}/conf/activemq.xml文件中添加以下內容:
<networkConnectors>
<networkConnector uri="multicast://default" />
</networkConnectors>
同時在<transportConnectors>節點中添加以下部分內容:
<transportConnectors>
<transportConnector name="openwire" uri="tcp://0.0.0.0:61616" discoveryUri="multicast://default" />
</transportConnectors>
3. 網絡連接(Network Connectors)模式集羣
多個broker組成集羣,當其中一個broker的消費者出問題導致消息堆積無法消費掉時,通過ActiveMQ支持的Network of Broker方案可將該broker堆積的消息轉發到其他有消費者的broker。該方案主要有以下兩種配置方式:
3.1. 基於固定地址
3.1. 基於組播發現
4. 基於ZooKeeper的高可用詳解
整體的系統結構如下圖所示:
ActiveMQ提供了隊列、本地持久化的功能,ZooKeeper提供了主從選舉的功能,通過zookeeper選取activemq leader的形式實現當某個activemq節點出問題時,保證系統的可用性。
4.1. ZooKeeper部署
配置zoo.cfg文件,修改dataDir地址和集羣服務地址
在dataDir路徑下創建myid文件,注意與server.x中的x保持一致。
4.2. ActiveMQ配置
修改persistenceAdapter標籤,使用LevelDB,並配置與zookeeper連接信息,其中hostname爲本機地址。
4.3. 驗證測試
在瀏覽器地址欄分別輸入:
http://192.168.1.104:8161/admin/queues.jsp
http://192.168.1.106:8161/admin/queues.jsp
http://192.168.1.108:8161/admin/queues.jsp
因爲使用zookeeper做負載均衡,三臺只有一臺是master,其他兩臺處於等待狀態,所以只有其中一臺提供服務,但一旦這臺服務器宕機以後,會有另外一臺頂替上來,所以其他幾個ip地址是打不開的,只有一臺能打開。在客戶端使用的時候,使用 failover進行配置的,如下:
mq.broker.url=failover:(tcp://192.168.1.104:61616,tcp://192.168.1.106:61616,tcp://192.168.1.108:61616)?initialReconnectDelay=1000
(關注微信公衆號,獲取更多內容)