一、activemq官網:http://activemq.apache.org/html
二、解壓壓縮包:mysql
同時只有一個mq對外提供服務,當master掛掉的狀況,slave會自動頂上成爲mastersql
使用ActiveMq自帶默認數據庫kahaDB,底層是文件系統,各個slave去競爭獲取共享文件的鎖(資源必定要共享:如下主從模式同樣),誰搶到了就是誰作master,提供服務,其餘作備份,當master掛掉,存活的slave再去競爭鎖,成爲新一代master。數據庫
a、新建,修改數據存放位置apache
修改conf/activema.xml服務器
b、將activemq複製兩份,啓動。網絡
後啓動mq日誌:負載均衡
能夠看到後啓動mq屬於salve。tcp
打開mq控制面板spa
當咱們把第一臺mq關閉,第二臺獲取鎖提供服務
刷新頁面,服務依然能夠繼續提供。
該模式與以上模式相同,將kahaDB文件系統換成數據庫共享。
修改 activemq.xml,修改模式,添加數據源
將mysql驅動,以及鏈接池jar包添加到lib目錄下
使用zookeeper管理選舉一個節點做爲master (注:mq5.9之後版本才能使用)
修改activemq.xml
我這裏zookeeper採用集羣模式,單機模式直接直接填寫 127.0.0.1:2181.
Broker-Cluster部署方式中,各個broker經過網絡互相鏈接,並共享queue,提供了2中部署方式:
static Broker-Cluster和Dynamic Broker-Cluster
只要咱們知道了想要使用的broker的地址,就能夠使用static配置方式。
Static connector
用來建立網絡中多個broker的靜態配置。協議使用組合URI,即URI中包含其餘URI。格式以下:
static:(uri1,uri2,uri3,...) ?key=value
XML中配置示例:
1. <networkConnectors>
2. <networkConnector name="local network"
3. uri="static://(tcp://remotehost1:61616,tcp://remotehost2:61616)"/>
4. </networkConnectors>
分別在兩臺服務器上配置activemq-1,activemq-2
activemq-1:activemq.xml
activemq-2:activemq.xml
acvivemq-1: data/activemq.log
acvivemq-2: data/activemq.log
能夠看到已經創建網絡鏈接。
Dynamic Discovery集羣方式在配置ActiveMQ實例時,不須要知道全部其它實例的URI地址
activemq-1與activemq-2:activemq.xml
官網配置說明:http://activemq.apache.org/networks-of-brokers.html
能夠看到Master-Slave的部署方式雖然解決了高可用的問題,但不支持負載均衡,Broker-Cluster解決了負載均衡,但當其中一個Broker忽然宕掉的話,那麼存在於該Broker上處於Pending狀態的message將會丟失,沒法達到高可用的目的。
這裏以Broker-A + Broker-B創建cluster,Broker-C做爲Broker-B的slave爲例:
1)首先在Broker-A節點中添加networkConnector節點:
<networkConnectors>
<networkConnector uri="masterslave:(tcp://0.0.0.0:61617,tcp:// 0.0.0.0:61618)" duplex="false"/>
</networkConnectors>
2)修改Broker-A節點中的服務提供端口爲61616:
<transportConnectors>
<transportConnectorname="openwire"uri="tcp://0.0.0.0:61616?maximumConnections=1000&wireFormat.maxFrameSize=104857600"/>
</transportConnectors>
3)在Broker-B節點中添加networkConnector節點:
<networkConnectors>
<networkConnector uri="static:(tcp:// 0.0.0.0:61616)"duplex="false"/>
</networkConnectors>
4)修改Broker-B節點中的服務提供端口爲61617:
<transportConnectors>
<transportConnectorname="openwire"uri="tcp://0.0.0.0:61617?maximumConnections=1000&wireFormat.maxFrameSize=104857600"/>
</transportConnectors>
5)修改Broker-B節點中的持久化方式:
<persistenceAdapter>
<kahaDB directory="/localhost/kahadb"/>
</persistenceAdapter>
6)在Broker-C節點中添加networkConnector節點:
<networkConnectors>
<networkConnector uri="static:(tcp:// 0.0.0.0:61616)"duplex="false"/>
</networkConnectors>
7)修改Broker-C節點中的服務提供端口爲61618:
<transportConnectors>
<transportConnectorname="openwire"uri="tcp://0.0.0.0:61618?maximumConnections=1000&wireFormat.maxFrameSize=104857600"/>
</transportConnectors>
8)修改Broker-C節點中的持久化方式:
<persistenceAdapter>
<kahaDB directory="/localhost/kahadb"/>
</persistenceAdapter>
9)分別啓動broker-A、broker-B、broker-C,由於是broker-B先啓動,因此「/localhost/kahadb」目錄被lock住,broker-C將一直處於掛起狀態,當人爲停掉broker-B以後,broker-C將獲取目錄「/localhost/kahadb」的控制權,從新與broker-A組成cluster提供服務。