一、本文目的
介紹如何在同一臺虛擬機上搭建高可用的Activemq服務,集羣數量包含3個Activemq,當Activemq可用數>=2時,整個集羣可用。
本文Activemq的集羣數量爲3個,分別命名爲mq1,mq2,mq3
二、概念介紹
1、僞集羣
集羣搭建在同一臺虛擬機上,3個Activemq分別使用不同的端口提供服務,啓用1個爲Master,其它2個爲Slaver,同一時間僅Master隊列提供服務
2、高可用
3個Activemq服務,同一時間僅Master隊列提供服務,當Master隊列掛掉後,其它2個Slaver自動選舉出1個成爲Master,整個隊列服務依然可用。當掛掉的隊列重新恢復後,自動加入集羣。當集羣僅剩下1個隊列時,整個隊列不可用。
3、Activemq集羣數據存儲方式
a) kahaDB:文件共享,默認方式
b) JDBC:數據庫共享,支持MySql、Sql Server、Oracle等
c) LevelDB:數據共享,本文使用方式,比kahaDB更快,基於索引
三、Activemq僞集羣的搭建
1、Activemq的端口介紹
Activemq默認主要使用2個端口,8161(Web管理控制檯端口)、61616(提供消息隊列服務的端口),如果需要搭建集羣,還需要開放集羣間通訊的端口(主要用於選舉Master)
2、Activemq集羣端口的分配
Web管理控制檯 | 消息服務接口 | 集羣通訊接口 | |
mq1 | 8161 | 51511 | 61601 |
mq2 | 8162 | 51512 | 61602 |
mq3 | 8163 | 51513 | 61603 |
服務接口沒有使用默認的61611是因爲activemq默認還會使用61613,61614等端口,如何開放端口及配置控制檯端口請自行百度
3、修改activemq配置
a) 安裝activemq,本文使用Activemq版本爲5.11.1,安裝過程略
b) 修改配置文件activemq.xml,路徑爲conf/activemq.xml
1、broker(所有activemq的brokerName必須一致,才能加入同一個集羣)
1 |
|
2、配置levelDB,加載<broker>節點內
bind:集羣間通訊的ip和端口
zkAddress:ZooKeeper地址,多個可用,逗號分隔
hostname:主機名,可在/etc/hosts中進行配置
zkPath:zkPath目錄,可在ZooInspetor中進行查看
1 2 3 4 5 6 7 8 9 10 11 |
|
4、啓動activemq
/usr/local/src/activemq1/bin/activemq start
可通過/usr/local/src/activemq1/data/activemq.log查看啓動日誌
5、關於管控臺
雖然3個activemq都啓動了,但是同一時間只有Master對應的管控臺可用,Slaver對應的管控臺不可用
四、結合ZooInspector測試(推薦使用dubbokeeper中查看zookeeper的一個UI插件,https://github.com/dubboclub/dubbokeeper)
1、打開ZooInspector(可自行搜索下載或從羣中下載),輸入ZooKeeper地址進行監控,如果3個activemq都啓動成功,則顯示如下:
2、Java測試代碼
代碼可參考:http://www.cnblogs.com/gossip/p/5970090.html
a) 配置集羣IP(這裏3個activemq的端口分別是51511,51512,51513)
1 2 3 4 5 6 7 8 |
|
b) 測試代碼
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
|
3、啓動Java程序併發送消息
4、關閉Master隊列(注意此時的Master隊列爲mq2)
a) 此時的ZooInspetor
5、重啓mq2隊列(重啓後mq2加入隊列成爲Slaver,但是mq1還是Master,隊列不受影響)
6、關閉mq1、mq2,僅剩mq3(由於只有一個隊列,無法進行選舉,所以整個隊列都無法提供服務)
7、重啓mq1(重啓mq1後,mq1和mq3選舉了Master隊列,從而重新對外提供服務)
a) ZooInspecto顯示mq1被選舉爲Master
b) 程序重新向隊列消息,數據並沒有中斷
五、總結
本文演示了activemq僞集羣的搭建過程及高可用的測試過程,通過舉一反三可以將activemq部署到不同的機器上,從而實現相同的功能。
遺留問題:ZooInspetor的activemq編號是自動生成的,很難發現其對應的隊列,請問有沒有可以自定義編號的方法,謝謝。
六、參考資料