ActiveMQ 官方提供三種 Master/Slave 方案:
| 方案 | 共享存儲 | 特點 |
|---|---|---|
| Shared File System | NFS/SAN | 簡單,但單點風險在文件系統 |
| JDBC Database | 數據庫 | 成熟穩定,性能受限於 DB |
| ZooKeeper + LevelDB | 本地 LevelDB + ZK 協調 | 無單點、高性能、自動故障轉移 |
分別啟動 3 個 ZK 實例,端口 2181/2182/2183,構成集群。確保 ZK 健康運行。
修改 conf/activemq.xml,啟用 replicatedLevelDB:
<broker xmlns="https://activemq.apache.org/schema/core" brokerName="localhost" dataDirectory="${activemq.data}">
<persistenceAdapter>
<replicatedLevelDB
directory="activemq-data"
replicas="3"
bind="tcp://0.0.0.0:0"
zkAddress="127.0.0.1:2181,127.0.0.1:2182,127.0.0.1:2183"
zkSessionTimeout="2s"
zkPath="/activemq/leveldb-stores"
/>
</persistenceAdapter>
<transportConnectors>
<transportConnector name="openwire" uri="tcp://0.0.0.0:61616?maximumConnections=1000&wireFormat.maxFrameSize=104857600"/>
<!-- 其他協議連接器... -->
</transportConnectors>
</broker>
複製 activemq1 目錄為 activemq2、activemq3,修改各自 transportConnectors 端口避免衝突(如 61617/61618、5673/5674 等)。
./activemq.sh console 前台運行觀察日誌);/activemq/leveldb-stores 臨時節點。手動殺掉 Master 進程,觀察剩餘兩節點日誌:幾秒內自動選出新 Master,客戶端連接自動切換(需配置 failover:(tcp://host1:61616,tcp://host2:61616,tcp://host3:61616))。
| 模式 | 吞吐量 | 備註 |
|---|---|---|
| 單節點 | ~8,000 msg/s | 無 HA 開銷 |
| ZK + Replicated LevelDB | ~500 msg/s | 複製同步開銷大,網絡/磁盘 IO 為瓶頸 |
結論:HA 方案顯著提升可用性,但吞吐量下降約 16 倍。生產環境需根據業務對一致性與性能的權衡選型,或優化磁盤(SSD)、網絡(萬兆)、調整 sync 策略。