官方主從實現的文檔:
http://activemq.apache.org/masterslave.html
一、activeMQ主要的幾類部署方式比較
1、默認的單機部署(kahadb)
activeMQ的默認存儲的單機方式,以本地kahadb文件的方式存儲,所以性能指標完全依賴本地磁盤IO,不能提供高可用。
2、基於zookeeper的主從(levelDB Master/Slave)
5.9.0新推出的主從實現,基於zookeeper來選舉出一個master,其他節點自動作為slave實時同步消息。
因為有實時同步數據的slave的存在,master不用擔心數據丟失,所以leveldb會優先采用內存存儲消息,異步同步到磁盤。所以該方式的activeMQ讀寫性能都最好,特別是寫性能能夠媲美非持久化消息。
優點:
實現高可用和數據安全
性能較好
缺點:
因為選舉機制要超過半數,所以最少需要3台節點,才能實現高可用。
可以基於postgres、mysql、oracle等常用數據庫。
每個節點啟動都會爭搶數據庫鎖,從而保證master的唯一性,其他節點作為備份,一直等待數據庫鎖的釋放。
因為所有消息讀寫,其實都是數據庫操作,activeMQ節點本身壓力很小,性能完全取決於數據庫性能。
優點:
實現高可用和數據安全
簡單靈活,2台節點就可以實現高可用
缺點:
穩定性依賴數據庫
性能依賴數據庫
二、性能測試:
用同一台測試機作為master。測試代碼為java,使用activemq-client-5.11.1提供的client,每個線程用一個連接反復寫/讀,所有線程完畢后,匯總測試結果。
每秒寫/讀吞吐量測試結果如下(測試機性能較差,測試結果僅僅用來做3種部署方式的橫向比較):
150/500表示每秒寫入150條,讀取500條消息。
|
單線程 |
10線程
|
20線程 |
40線程
|
單機(kahadb)
|
150/500
|
350/2000
|
500/2000
|
480/2000
|
基於zk的主從(leveldb)
|
180/3000
|
600/5500
|
1400/6000
|
3200/4500
|
基於共享數據庫的主從
|
160/300
|
250/1050
|
250/1150
|
250/1200
|
三、災備方案(兩種方式都已經測試通過)
1、leveldb方式
需要3台節點,2台在主機房,1台在備機房,主機房的節點權重設的比備機房節點高。
當master節點故障:
因為權重的關系,主機房另一個節點會自動被選舉為新的master。
當主機房故障:
需要啟動備用機房時,先更改備機房節點配置,把集群規模從3改成1,這樣1個節點可以臨時提供服務(此時不再保證高可用)。
2、共享數據庫方式
3台節點即可,2台在主機房,1台在備機房,備機房節點指向災備activeMQ數據庫,平時要關閉。
當master節點故障:
主機房的另一個節點會自動取得數據庫鎖,成為新的master。
當主機房故障:
需要啟動備用機房時,先完成activeMQ數據庫的切換,然后啟動災備activeMQ節點即可臨時外提供服務(此時不再保證高可用)。