一. zookeeper安裝(集羣):http://www.cnblogs.com/wangfajun/p/8692117.html √html
二. ActiveMq配置:node
1. ActiveMq集羣部署規劃:linux
環境:Centos6.六、JDK1.7web
版本:ActiveMq 5.11.1apache
zookeeper集羣環境:10.0.70.12:218一、10.0.70.13:2182、10.0.70.14:2183dom
主機 | 集羣端口 | 消息端口 | 管控臺端口 | ActiveMq節點安裝目錄 |
10.0.70.12 | 62621 | 51511 | 8161 | /home/fajun/activemq/node-01 |
10.0.70.13 | 62622 | 51512 | 8162 | /home/fajun/activemq/node-02 |
10.0.70.14 | 62623 | 51513 | 8163 | /home/fajun/activemq/node-03 |
2. 防火牆開放對應上表格管控臺端口tcp
3. 分別在三臺主機上建立/home/fajun/activemq目錄測試
$ mkdir /home/fajun/activemq
4. 上傳apache-activemq-5.11.1-bin.tar.gz到三臺主機的/home/fajun/activemq目錄下spa
$ cd /home/fajun/activemq $ tar -zxvf apache-activemq-5.11.1-bin.tar.gz $ mv apache-activemq-5.11.1 node-0X(X表明節點0、一、2,下同)
5. 修改三臺主機管控臺端口(/home/fajun/activemq/node-0X/conf/jetty.xml),默認端口8161:3d
node-01管控臺端口:
<bean id="jettyPort" class="org.apache.activemq.web.WebConsolePort" init-method="start"> <!-- the default port number for the web console --> <property name="host" value="0.0.0.0"/> <property name="port" value="8161"/> </bean>
node-02管控臺端口:
<bean id="jettyPort" class="org.apache.activemq.web.WebConsolePort" init-method="start"> <!-- the default port number for the web console --> <property name="host" value="0.0.0.0"/> <property name="port" value="8162"/> </bean>
node-03管控臺端口:
<bean id="jettyPort" class="org.apache.activemq.web.WebConsolePort" init-method="start"> <!-- the default port number for the web console --> <property name="host" value="0.0.0.0"/> <property name="port" value="8163"/> </bean>
6. 集羣配置:
在3個ActiveMQ節點中配置conf/activemq.xml中的持久化適配器。
修改其中bind、zkAddress、hostname和zkPath。
注意:每一個ActiveMQ的brokerName必須相同,不然不能加入集羣。
node-01中的持久化配置:
<broker xmlns="http://activemq.apache.org/schema/core" brokerName="MandaoDubbo" dataDirectory="${activemq.data}"> <!--kahaDB directory="${activemq.data}/kahadb"/ -->
<persistenceAdapter> <replicatedLevelDB directory="${activemq.data}/leveldb" replicas="3" bind="tcp://0.0.0.0:62621" zkAddress="10.0.70.12:2181,10.0.70.13:2182,10.0.70.14:2183" hostname="10.0.70.12" zkPath="/activemq/leveldb-stores" />
</persistenceAdapter> </broker>
node-02中的持久化配置:
<broker xmlns="http://activemq.apache.org/schema/core" brokerName="MandaoDubbo" dataDirectory="${activemq.data}"> <!--kahaDB directory="${activemq.data}/kahadb"/ -->
<persistenceAdapter> <replicatedLevelDB directory="${activemq.data}/leveldb" replicas="3" bind="tcp://0.0.0.0:62622" zkAddress="10.0.70.12:2181,10.0.70.13:2182,10.0.70.14:2183" hostname="10.0.70.13" zkPath="/activemq/leveldb-stores" />
</persistenceAdapter>
</broker>
node-03中的持久化配置:
<broker xmlns="http://activemq.apache.org/schema/core" brokerName="MandaoDubbo" dataDirectory="${activemq.data}"> <!--kahaDB directory="${activemq.data}/kahadb"/ -->
<persistenceAdapter> <replicatedLevelDB directory="${activemq.data}/leveldb" replicas="3" bind="tcp://0.0.0.0:62623" zkAddress="10.0.70.12:2181,10.0.70.13:2182,10.0.70.14:2183" hostname="10.0.70.14" zkPath="/activemq/leveldb-stores" />
</persistenceAdapter>
</broker>
<transportConnectors>
<!-- DOS protection, limit concurrent connections to 1000 and frame size to 100MB -->
<transportConnector name="openwire" uri="tcp://0.0.0.0:51511?maximumConnections=1000&wireFormat.maxFrameSize=104857600"/>
<transportConnector name="amqp" uri="amqp://0.0.0.0:5672?maximumConnections=1000&wireFormat.maxFrameSize=104857600"/>
<transportConnector name="stomp" uri="stomp://0.0.0.0:61613?maximumConnections=1000&wireFormat.maxFrameSize=104857600"/>
<transportConnector name="mqtt" uri="mqtt://0.0.0.0:1883?maximumConnections=1000&wireFormat.maxFrameSize=104857600"/>
<transportConnector name="ws" uri="ws://0.0.0.0:61614?maximumConnections=1000&wireFormat.maxFrameSize=104857600"/>
</transportConnectors>
<transportConnectors>
<!-- DOS protection, limit concurrent connections to 1000 and frame size to 100MB -->
<transportConnector name="openwire" uri="tcp://0.0.0.0:51512?maximumConnections=1000&wireFormat.maxFrameSize=104857600"/>
<transportConnector name="amqp" uri="amqp://0.0.0.0:5672?maximumConnections=1000&wireFormat.maxFrameSize=104857600"/>
<transportConnector name="stomp" uri="stomp://0.0.0.0:61613?maximumConnections=1000&wireFormat.maxFrameSize=104857600"/>
<transportConnector name="mqtt" uri="mqtt://0.0.0.0:1883?maximumConnections=1000&wireFormat.maxFrameSize=104857600"/>
<transportConnector name="ws" uri="ws://0.0.0.0:61614?maximumConnections=1000&wireFormat.maxFrameSize=104857600"/>
</transportConnectors>
node-03中的消息端口配置:
<transportConnectors>
<!-- DOS protection, limit concurrent connections to 1000 and frame size to 100MB -->
<transportConnector name="openwire" uri="tcp://0.0.0.0:51513?maximumConnections=1000&wireFormat.maxFrameSize=104857600"/>
<transportConnector name="amqp" uri="amqp://0.0.0.0:5672?maximumConnections=1000&wireFormat.maxFrameSize=104857600"/>
<transportConnector name="stomp" uri="stomp://0.0.0.0:61613?maximumConnections=1000&wireFormat.maxFrameSize=104857600"/>
<transportConnector name="mqtt" uri="mqtt://0.0.0.0:1883?maximumConnections=1000&wireFormat.maxFrameSize=104857600"/>
<transportConnector name="ws" uri="ws://0.0.0.0:61614?maximumConnections=1000&wireFormat.maxFrameSize=104857600"/>
</transportConnectors>
8.設置開機啓動:
# vi /etc/rc.local
su - fajun -c '/home/fajun/activemq/node-01/bin/activemq start' su - fajun -c '/home/fajun/activemq/node-02/bin/activemq start' su - fajun -c '/home/fajun/activemq/node-03/bin/activemq start'
9. 按順序啓動3個ActiveMq節點:
$ /home/fajun/activemq/node-01/bin/activemq start
$ /home/fajun/activemq/node-02/bin/activemq start
$ /home/fajun/activemq/node-03/bin/activemq start
監聽日誌:
$ tail -f /home/fajun/activemq/node-01/data/activemq.log
$ tail -f /home/fajun/activemq/node-02/data/activemq.log
$ tail -f /home/fajun/activemq/node-03/data/activemq.log
11. 集羣可用性測試:
ActiveMQ的客戶端只能訪問Master的Broker,其餘處於Slave的Broker不能訪問。
因此客戶端鏈接Broker應該使用failover協議:
failover:(tcp://10.0.70.12:51511,tcp://10.0.70.13:51512,tcp://10.0.70.14:51513)?randomize=false
日誌分析:12的Mq嘗試重連,發現連不上,接着重連上了13上的Mq節點(說明13推舉成了Master)繼續消費,消息並無中斷,309是12還沒宕掉時消費的的日誌,310是新的Master(13)消費的日誌。
結論:集羣環境中的某一個Mq節點宕掉,不影響消息消費
模擬場景2:
當前環境:12的Mq節點已停、13上的Mq節點(Master)正常運行,14上的Mq節點(Slave)正常運行
模擬線上環境操做:停掉13上的Mq節點
日誌分析:控制檯日誌卡着不動了,沒有任何消息能被消費
結論:只有一臺Mq節點正常運行,集羣Mq推算不出新的Master,將會一直等集羣中的其餘Mq節點恢復
模擬場景3:
模擬線上環境操做:啓動13上的Mq節點
如今14(Slave)是運行的,但此刻並無選舉出Master,我如今,
日誌分析:過了十幾秒,重連上了14,而後繼續消費:
結論:集羣環境超過半數Mq節點運行正常,那麼整個集羣環境就是正常的
上面是咱們模擬了Mq節點出現問題,消息消費的一些狀況,因爲ActiveMQ集羣的高可用,依賴於ZooKeeper集羣的高可用,那麼咱們如今來模擬,zookeeper節點出現異常,將會對ActiveMq有什麼影響
日誌分析:14上的Mq節點變成了Master,繼續消費消息,消息依然被連續消費
日誌分析:控制檯日誌卡着不動了,linux上我看了下3臺Mq節點的狀態,發現14上的Mq節點也掛掉了
結論:zk節點超過半數異常,則整個Mq集羣環境將處於異常狀態
日誌分析:消費正常
結論:超過半數zk節點運行正常,Mq集羣環境也會運行正常
警告: 請使用者注意。replicatedLevelDB不支持延遲或者計劃任務消息。
這些消息存儲在另外的LevelDB文件中,若是使用延遲或者計劃任務消息,將不會複製到slave Broker上,不能實現消息的高可用。