構(gòu)建ActiveMQ集群

ActiveMQ的集群方式綜述

ActiveMQ的集群方式主要由兩種:Master-Slave和Broker Cluster

Master-Slave

Master-Slave方式中,只能是Master提供服務(wù)慨仿,Slave是實時地備份Master的數(shù)據(jù)蹄梢,以保證消息的可靠性。當(dāng)Master失效時,Slave會自動升級為Master刊咳,客戶端會自動連接到Slave上工作秘遏。Master-Slave模式分為四類:Pure Master Slave、Shared File System Master Slave和JDBC Master Slave鹿寻,以及Replicated LevelDB Store方式 睦柴。

Master-Slave方式都不支持負(fù)載均衡,但可以解決單點故障的問題毡熏,以保證消息服務(wù)的可靠性坦敌。

Broker Cluster

Broker Cluster主要是通過network of Brokers在多個ActiveMQ實例之間進(jìn)行消息的路由。Broker Cluster模式支持負(fù)載均衡痢法,可以提高消息的消費能力狱窘,但不能保證消息的可靠性。所以為了支持負(fù)載均衡财搁,同時又保證消息的可靠性蘸炸,我們往往會采用Msater-Slave+Broker Cluster的模式。

注意:

以下的測試均在一臺機器上進(jìn)行尖奔,為避免多個ActiveMQ****之間在啟動時發(fā)生端口沖突搭儒,需要修改每個ActiveMQ****的配置文件中MQ****的服務(wù)端口。如果實際部署在不同的機器提茁,端口的修改是不必要的淹禾。

Pure Master Slave方式

ActiveMQ5.8以前支持,自從Activemq5.8開始茴扁,Activemq的集群實現(xiàn)方式取消了傳統(tǒng)的Pure Master Slave方式铃岔,并從Activemq5.9增加了基于zookeeper+leveldb的實現(xiàn)方式。

[圖片上傳失敗...(image-9d56e8-1553515192235)]

使用兩個ActiveMQ服務(wù)器峭火,一個作為Master毁习,Master不需要做特殊的配置智嚷;另一個作為Slave,配置activemq.xml文件纺且,在<broker>節(jié)點中添加連接到Master的URI和設(shè)置Master失效后不關(guān)閉Slave纤勒。具體配置參考頁面:http://activemq.apache.org/pure-master-slave.html

Shared File System Master Slave方式

就是利用共享文件系統(tǒng)做ActiveMQ集群,是基于ActiveMQ的默認(rèn)數(shù)據(jù)庫kahaDB完成的隆檀,kahaDB的底層是文件系統(tǒng)摇天。這種方式的集群,Slave的個數(shù)沒有限制恐仑,哪個ActiveMQ實例先獲取共享文件的鎖泉坐,那個實例就是Master,其它的ActiveMQ實例就是Slave裳仆,當(dāng)當(dāng)前的Master失效腕让,其它的Slave就會去競爭共享文件鎖,誰競爭到了誰就是Master歧斟。這種模式的好處就是當(dāng)Master失效時不用手動去配置纯丸,只要有足夠多的Slave。

如果各個ActiveMQ實例需要運行在不同的機器静袖,就需要用到分布式文件系統(tǒng)了觉鼻。

Shared JDBC Master Slave

JDBC Master Slave模式和Shared File Sysytem Master Slave模式的原理是一樣的,只是把共享文件系統(tǒng)換成了共享數(shù)據(jù)庫队橙。我們只需在所有的ActiveMQ的主配置文件中activemq.xml添加數(shù)據(jù)源坠陈,所有的數(shù)據(jù)源都指向同一個數(shù)據(jù)庫。

然后修改持久化適配器捐康。這種方式的集群相對Shared File System Master Slave更加簡單仇矾,更加容易地進(jìn)行分布式部署,但是如果數(shù)據(jù)庫失效解总,那么所有的ActiveMQ實例都將失效贮匕。

配置修改清單

1、開啟網(wǎng)絡(luò)監(jiān)控功能(useJmx="true")

<broker xmlns="http://activemq.apache.org/schema/core" brokerName="localhost" dataDirectory="${activemq.data}" useJmx="true">

2花枫、數(shù)據(jù)庫持久化配置刻盐,注釋掉之前kahadb消息存儲器

<persistenceAdapter>

<jdbcPersistenceAdapter dataDirectory="${activemq.data}" dataSource="#mysql-ds" createTablesOnStartup="false" useDatabaseLock="true"/>  

</persistenceAdapter>

3、增加數(shù)據(jù)源mysql-ds

4乌昔、修改客戶端上連接url為類似于failover:(tcp://0.0.0.0:61616,tcp://0.0.0.0:61617,tcp://0.0.0.0:61618)?randomize=false

注:默認(rèn)情況下隙疚,failover機制從URI列表中隨機選擇出一個URI進(jìn)行連接,這可以有效地控制客戶端在多個broker上的負(fù)載均衡磕道,但是,要使客戶端首先連接到主節(jié)點行冰,并在主節(jié)點不可用時只連接到輔助備份代理溺蕉,需要設(shè)置randomize = false伶丐。

5、可以看到只有一臺MQ成為Master疯特,其余兩臺成為slave并會嘗試成為Master哗魂,并不斷重試。且兩臺slave的管理控制臺將無法訪問漓雅。

測試方法
  1.     先啟動生產(chǎn)者录别,發(fā)送幾條消息
    
  2.     啟動消費者,可看到接收到的消息
    
  3.     關(guān)閉消費者
    
  4.     生產(chǎn)者繼續(xù)發(fā)送幾條消息-消息A
    
  5.     停止broker01(可看到生產(chǎn)者端顯示連接到broker02(tcp://0.0.0.0:61617)了邻吞,同時運行broker02的Shell也顯示其成為了Master)
    
  6.     生產(chǎn)者繼續(xù)發(fā)送幾條消息-消息B
    
  7.     啟動消費者
    
  8.     消費者接收了消息A和消息B组题,可見broker02接替了broker01的工作,而且儲存了之前生產(chǎn)者經(jīng)過broker01發(fā)送的消息
    
  9.     關(guān)閉消費者
    
  10. 生產(chǎn)者繼續(xù)發(fā)送幾條消息-消息C
    
  11. 停止broker02(可看到生產(chǎn)者端顯示連接到broker03(tcp://0.0.0.0:61618)了抱冷,同時運行broker03的Shell也顯示其成為了Master)
    
  12. 生產(chǎn)者繼續(xù)發(fā)送幾條消息-消息D
    
  13. 啟動消費者
    
  14. 消費者接收了消息C和消息D崔列,可見broker03接替了broker02的工作,而且儲存了之前生產(chǎn)者經(jīng)過broker02發(fā)送的消息
    
  15. 再次啟動broker01旺遮,生產(chǎn)者或消費者均未顯示連接到broker01(tcp://0.0.0.0:61616)赵讯,表明broker01此時只是個Slave
    

Replicated LevelDB Store

ActiveMQ5.9以后才新增的特性,使用ZooKeeper協(xié)調(diào)選擇一個node作為master耿眉。被選擇的master broker node開啟并接受客戶端連接边翼。 其他node轉(zhuǎn)入slave模式,連接master并同步他們的存儲狀態(tài)鸣剪。slave不接受客戶端連接讯私。所有的存儲操作都將被復(fù)制到連接至Master的slaves。

如果master死了西傀,得到了最新更新的slave被允許成為master斤寇。推薦運行至少3個replica nodes。

配置修改清單

1拥褂、 使用性能比較好的LevelDB替換掉默認(rèn)的KahaDB

<persistenceAdapter>

<replicatedLevelDB

directory="${activemq.data}/leveldb"

replicas="3"

bind="tcp://0.0.0.0:62623"

zkAddress="127.0.0.1:2181"

hostname="localhost"

zkPath="/activemq/leveldb-stores"/>

</persistenceAdapter>

配置項說明:

  • directory:持久化數(shù)據(jù)存放地址
  • replicas:集群中節(jié)點的個數(shù)
  • bind:集群通信端口
  • zkAddress:ZooKeeper集群地址
  • hostname:當(dāng)前服務(wù)器的IP地址娘锁,如果集群啟動的時候報未知主機名錯誤,那么就需要配置主機名到IP地址的映射關(guān)系饺鹃。
  • zkPath:ZooKeeper數(shù)據(jù)掛載點

2莫秆、修改客戶端上連接url為failover:(tcp://0.0.0.0:61616,tcp://0.0.0.0:61617,tcp://0.0.0.0:61618)?randomize=false

3、可以看到只有一臺MQ成為Master悔详,其余兩臺成為slave镊屎。且兩臺slave的管理控制臺將無法訪問。

LevelDB解釋

Leveldb是一個google實現(xiàn)的非常高效的kv數(shù)據(jù)庫茄螃,目前的版本1.2能夠支持billion級別的數(shù)據(jù)量了缝驳。 在這個數(shù)量級別下還有著非常高的性能,采用單進(jìn)程的服務(wù),性能非常之高用狱,在一臺4核Q6600的CPU機器上运怖,每秒鐘寫數(shù)據(jù)超過40w,而隨機讀的性能每秒鐘超過10w夏伊。由此可以看出摇展,具有很高的隨機寫,順序讀/寫性能溺忧,但是隨機讀的性能很一般咏连,也就是說,LevelDB很適合應(yīng)用在查詢較少鲁森,而寫很多的場景祟滴。LevelDB應(yīng)用了LSM (Log Structured Merge) 策略,通過一種類似于歸并排序的方式高效地將更新遷移到磁盤刀森,降低索引插入開銷踱启。

限制:1、非關(guān)系型數(shù)據(jù)模型(NoSQL)研底,不支持sql語句埠偿,也不支持索引;2榜晦、一次只允許一個進(jìn)程訪問一個特定的數(shù)據(jù)庫冠蒋;3、沒有內(nèi)置的C/S架構(gòu)乾胶,但開發(fā)者可以使用LevelDB庫自己封裝一個server抖剿;

測試方法

同Shared JDBC Master Slave 測試方法

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市识窿,隨后出現(xiàn)的幾起案子斩郎,更是在濱河造成了極大的恐慌,老刑警劉巖喻频,帶你破解...
    沈念sama閱讀 218,284評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件缩宜,死亡現(xiàn)場離奇詭異,居然都是意外死亡甥温,警方通過查閱死者的電腦和手機锻煌,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,115評論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來姻蚓,“玉大人宋梧,你說我怎么就攤上這事≌玻” “怎么了捂龄?”我有些...
    開封第一講書人閱讀 164,614評論 0 354
  • 文/不壞的土叔 我叫張陵释涛,是天一觀的道長。 經(jīng)常有香客問我跺讯,道長枢贿,這世上最難降的妖魔是什么殉农? 我笑而不...
    開封第一講書人閱讀 58,671評論 1 293
  • 正文 為了忘掉前任刀脏,我火速辦了婚禮,結(jié)果婚禮上超凳,老公的妹妹穿的比我還像新娘愈污。我一直安慰自己,他們只是感情好轮傍,可當(dāng)我...
    茶點故事閱讀 67,699評論 6 392
  • 文/花漫 我一把揭開白布暂雹。 她就那樣靜靜地躺著,像睡著了一般创夜。 火紅的嫁衣襯著肌膚如雪杭跪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,562評論 1 305
  • 那天驰吓,我揣著相機與錄音涧尿,去河邊找鬼。 笑死檬贰,一個胖子當(dāng)著我的面吹牛姑廉,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播翁涤,決...
    沈念sama閱讀 40,309評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼桥言,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了葵礼?” 一聲冷哼從身側(cè)響起号阿,我...
    開封第一講書人閱讀 39,223評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎鸳粉,沒想到半個月后扔涧,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,668評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡赁严,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,859評論 3 336
  • 正文 我和宋清朗相戀三年扰柠,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片疼约。...
    茶點故事閱讀 39,981評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡卤档,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出程剥,到底是詐尸還是另有隱情劝枣,我是刑警寧澤汤踏,帶...
    沈念sama閱讀 35,705評論 5 347
  • 正文 年R本政府宣布,位于F島的核電站舔腾,受9級特大地震影響溪胶,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜稳诚,卻給世界環(huán)境...
    茶點故事閱讀 41,310評論 3 330
  • 文/蒙蒙 一哗脖、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧扳还,春花似錦才避、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,904評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至俏让,卻和暖如春楞遏,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背首昔。 一陣腳步聲響...
    開封第一講書人閱讀 33,023評論 1 270
  • 我被黑心中介騙來泰國打工寡喝, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人沙廉。 一個月前我還...
    沈念sama閱讀 48,146評論 3 370
  • 正文 我出身青樓拘荡,卻偏偏與公主長得像,于是被迫代替她去往敵國和親撬陵。 傳聞我的和親對象是個殘疾皇子珊皿,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,933評論 2 355

推薦閱讀更多精彩內(nèi)容