Skip to main content

🧣 Master-Slave 高可用

本章節解析 ActiveMQ Classic 的 Master-Slave 架構。透過共享儲存(檔案系統或資料庫),Slave Broker 在 Master 故障時自動接管,確保訊息服務不中斷。

環境

  • windows10 ~ 11 (win64)
  • ActiveMQ 5.16.6
  • 兩台以上伺服器(或本機多實例測試)

1. 架構概覽

模式共享方式適用
Shared File SystemNFS / SAN 掛載同一目錄內網檔案共享
Shared DatabaseMySQL / PostgreSQL已有 DB 基礎設施

2. Shared File System 設定

2.1 Master activemq.xml

<broker xmlns="http://activemq.apache.org/schema/core" brokerName="master" dataDirectory="/shared/activemq-data">
<persistenceAdapter>
<kahaDB directory="/shared/activemq-data/kahadb"/>
</persistenceAdapter>
<transportConnectors>
<transportConnector name="openwire" uri="tcp://0.0.0.0:61616"/>
</transportConnectors>
</broker>

2.2 Slave activemq.xml

<broker xmlns="http://activemq.apache.org/schema/core" brokerName="slave" dataDirectory="/shared/activemq-data">
<persistenceAdapter>
<kahaDB directory="/shared/activemq-data/kahadb"/>
</persistenceAdapter>
<transportConnectors>
<transportConnector name="openwire" uri="tcp://0.0.0.0:61617"/>
</transportConnectors>
</broker>

Slave 啟動時會偵測到 lock 被 Master 持有,進入待機狀態。Master 關閉後 Slave 取得 lock 並接管。

3. Shared Database 設定

Slave 與 Master 使用相同的 jdbcPersistenceAdapter 設定(參見 jdbcPersistence),lease-database-locker 確保同一時間只有一個 Broker 寫入。

4. 客戶端 Failover

String url = "failover:(tcp://master-host:61616,tcp://slave-host:61617)?randomize=false";
ActiveMQConnectionFactory factory = new ActiveMQConnectionFactory(url);

詳見 connectionFailover

5. 與多實例的差異

項目createMoreActiveMQ 多實例Master-Slave
目的同一機器跑多個獨立 Broker高可用備援
儲存各自獨立共享
訊息不互通同一份資料

6. 常見問題與排查

現象可能原因處理方式
Slave 無法啟動Master 仍持有 lock確認 Master 已正常關閉
雙 Master 同時寫入NFS lock 不可靠改用 Shared Database 方案
切換後 Client 斷線未使用 Failover URI客戶端配置 failover
資料不一致共享目錄未真正共享確認兩端掛載同一路徑

7. 與其他文章的關聯