基於zookeeper(集群)+LevelDB的ActiveMq高可用集群安裝、配置、測試


一. zookeeper安裝(集群):http://www.cnblogs.com/wangfajun/p/8692117.html 

二. ActiveMq配置:

1. ActiveMq集群部署規划:

  環境:Centos6.6、JDK1.7

  版本:ActiveMq 5.11.1

  zookeeper集群環境:10.0.70.12:2181、10.0.70.13:218210.0.70.14:2183

主機 集群端口 消息端口 管控台端口 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. 防火牆開放對應上表格管控台端口

3. 分別在三台主機上創建/home/fajun/activemq目錄

$ mkdir /home/fajun/activemq

4. 上傳apache-activemq-5.11.1-bin.tar.gz到三台主機的/home/fajun/activemq目錄下

$ cd /home/fajun/activemq

$ tar -zxvf apache-activemq-5.11.1-bin.tar.gz

$ mv apache-activemq-5.11.1 node-0X(X代表節點0、1、2,下同)

5. 修改三台主機管控台端口(/home/fajun/activemq/node-0X/conf/jetty.xml),默認端口8161:

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>
7. 修改各節點的消息端口(注意,避免端口沖突),默認消息端口61616
node-01中的消息端口配置:
<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&amp;wireFormat.maxFrameSize=104857600"/>
    <transportConnector name="amqp" uri="amqp://0.0.0.0:5672?maximumConnections=1000&amp;wireFormat.maxFrameSize=104857600"/>
    <transportConnector name="stomp" uri="stomp://0.0.0.0:61613?maximumConnections=1000&amp;wireFormat.maxFrameSize=104857600"/>
    <transportConnector name="mqtt" uri="mqtt://0.0.0.0:1883?maximumConnections=1000&amp;wireFormat.maxFrameSize=104857600"/>
    <transportConnector name="ws" uri="ws://0.0.0.0:61614?maximumConnections=1000&amp;wireFormat.maxFrameSize=104857600"/>
</transportConnectors>
node-02中的消息端口配置:
<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&amp;wireFormat.maxFrameSize=104857600"/>
    <transportConnector name="amqp" uri="amqp://0.0.0.0:5672?maximumConnections=1000&amp;wireFormat.maxFrameSize=104857600"/>
    <transportConnector name="stomp" uri="stomp://0.0.0.0:61613?maximumConnections=1000&amp;wireFormat.maxFrameSize=104857600"/>
    <transportConnector name="mqtt" uri="mqtt://0.0.0.0:1883?maximumConnections=1000&amp;wireFormat.maxFrameSize=104857600"/>
    <transportConnector name="ws" uri="ws://0.0.0.0:61614?maximumConnections=1000&amp;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&amp;wireFormat.maxFrameSize=104857600"/>
    <transportConnector name="amqp" uri="amqp://0.0.0.0:5672?maximumConnections=1000&amp;wireFormat.maxFrameSize=104857600"/>
    <transportConnector name="stomp" uri="stomp://0.0.0.0:61613?maximumConnections=1000&amp;wireFormat.maxFrameSize=104857600"/>
    <transportConnector name="mqtt" uri="mqtt://0.0.0.0:1883?maximumConnections=1000&amp;wireFormat.maxFrameSize=104857600"/>
    <transportConnector name="ws" uri="ws://0.0.0.0:61614?maximumConnections=1000&amp;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
10.集群的節點狀態分析:
集群啟動后對ZooKeeper數據的抓圖,可以看到ActiveMQ的有3個節點,分別是000000000004,00000000003,00000000002。
以下第一張圖展現了00000000002的值,可以看到elected的值是不為空,說明這個節點是Master,其他兩個節點是Slave。

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
Ps : ActiveMq(下面簡稱Mq節點)分為Master[主]、Slave[從]
模擬場景1
當前環境:10.0.70.12、10.0.70.13、10.0.70.14 上的Mq節點都是正常運行的(下面簡稱12、13、14),12是Master  
模擬線上環境異常:停掉12上的Mq節點

日志分析: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

當前環境:12、13上的Mq節點已停、14上的Mq節點(Slave)正常運行(場景2中,14上的Mq並沒有被選為Master)

模擬線上環境操作:啟動13上的Mq節點

現在14(Slave)是運行的,但此刻並沒有選舉出Master,我現在,

日志分析:過了十幾秒,重連上了14,然后繼續消費

結論:集群環境超過半數Mq節點運行正常,那么整個集群環境就是正常的

 

上面是我們模擬了Mq節點出現問題,消息消費的一些情況,由於ActiveMQ集群的高可用,依賴於ZooKeeper集群的高可用,那么我們現在來模擬,zookeeper節點出現異常,將會對ActiveMq有什么影響

 

Ps : zookeeper(下面簡稱zk節點) 分為Leader[主]、follower[從]
模擬場景1
當前環境:12、13、14上的zk節點、Mq節點都正常運行,13上的zk節點是Leader 、13上的Mq節點是Master
模擬線上環境操作:停掉13上的zk節點:

日志分析:14上的Mq節點變成了Master,繼續消費消息,消息依然被連續消費

結論:一台zk節點宕掉,雖然Mq會重新選舉新的Master節點,單Mq節點不會出現異常,不影響Mq節點消費消息
模擬場景2
當前環境:12、14上的zk節點都正常運行,13上的zk節點已停 |  14上的Mq節點是Master,12、13上的Mq節點(Slave)運行正常
模擬線上環境操作:停掉12上的zk節點:

日志分析:控制台日志卡着不動了,linux上我看了下3台Mq節點的狀態,發現14上的Mq節點也掛掉了

結論:zk節點超過半數異常,則整個Mq集群環境將處於異常狀態

模擬場景2
當前環境:12、13上的zk節點都停了,14上的zk節點運行正常 | 14上的Mq節點掛了,12、13上的Mq節點(Slave)運行正常
模擬線上環境操作:啟動12上的zk節點:

日志分析:消費正常

結論:超過半數zk節點運行正常,Mq集群環境也會運行正常

模擬場景3
當前環境:所有上的zk節點都是停掉了| 所有Mq節點運行異常
模擬線上環境操作:依次啟動所有zk節點:
日志分析:沒有任何消息被消費
結論:當zk節點都處於異常狀態,重啟過后,Mq節點將運行異常,需要重啟Mq節點,才能恢復。
 

警告: 請使用者注意。replicatedLevelDB不支持延遲或者計划任務消息。

這些消息存儲在另外的LevelDB文件中,如果使用延遲或者計划任務消息,將不會復制到slave Broker上,不能實現消息的高可用。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM