1. 程式人生 > >ActiveMQ高可用+負載均衡+測試

ActiveMQ高可用+負載均衡+測試

1.為了讓各位更加深入瞭解,我們再重複搭建一個ActiveMQ偽叢集,過程和真實情況下的三個獨立ip的叢集搭建方式一模一樣,如下:

ActiveMQ 高可用叢集安裝、配置(偽叢集)

(ZooKeeper +LevelDB)

1、ActiveMQ 叢集部署規劃:

環境:CentOS 6.6 x64JDK7

版本:ActiveMQ 5.11.1

ZooKeeper 叢集環境:192.168.1.81:2181,192.168.1.82:2182,192.168.1.83:2183

ZooKeeper叢集部署請參考《高可用架構篇--01節--ZooKeeper

叢集的安裝、配置、高可用測試》

主機

叢集埠

訊息埠

管控臺端口

節點安裝目錄

192.168.1.101

63631

53531

8361

/home/wusc/activemq/node-01

192.168.1.101

63632

53532

8362

/home/wusc/activemq/node-02

192.168.1.101

63633

53533

8363

/home/wusc/activemq/node-03

2、防火牆開啟對應的埠

## mq cluster

-A INPUT -m state --state NEW -m tcp -p tcp --dport 8361 -jACCEPT -A INPUT -m state --state NEW -m tcp -p tcp --dport 8362 -j ACCEPT -AINPUT -m state --state NEW -m tcp -p tcp --dport 8363 -j ACCEPT -A INPUT -mstate --state NEW -m tcp -p tcp --dport 53531 -j ACCEPT -A INPUT -m state--state NEW -m tcp -p tcp --dport 53532 -j ACCEPT -A INPUT -m state --state NEW-m tcp -p tcp --dport 53533 -j ACCEPT -A INPUT -m state --state NEW -m tcp -ptcp --dport 63631 -j ACCEPT -A INPUT -m state --state NEW -m tcp -p tcp --dport63632 -j ACCEPT -A INPUT -m state --state NEW -m tcp -p tcp --dport 63633 -jACCEPT -A INPUT -m state --state NEW -m tcp -p tcp --dport 63631 -j ACCEPT

3、分別在三臺主機中建立/home/wusc/activemq目錄

$ mkdir /home/wusc/activemq

上傳 apache-activemq-5.11.1-bin.tar.gz /home/wusc/activemq目錄

4、解壓並按節點命名

$ cd /home/wusc/activemq

$ tar -xvfapache-activemq-5.11.1-bin.tar.gz

$ mvapache-activemq-5.11.1 node-0X     #(X代表節點號 1、2、3,下同)

5、修改管理控制檯埠(預設為 8161)可在 conf/jetty.xml 中修改,如下:

Node-01 管控臺端口:

<beanid="jettyPort"class="org.apache.activemq.web.WebConsolePort"init-method="start"> <!-- the default port number for the webconsole -->

<property name="host"value="0.0.0.0"/>

<property name="port" value="8361"/>

</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"/> <propertyname="port" value="8362"/>

</bean>

Node-03 管控臺端口:

<beanid="jettyPort"class="org.apache.activemq.web.WebConsolePort"init-method="start"> <!-- the default port number for the webconsole -->

<property name="host"value="0.0.0.0"/>

<property name="port" value="8363"/>

</bean>

6、叢集配置:

在 3 個 ActiveMQ 節點中配置 conf/activemq.xml中的持久化介面卡。修改其中 bind、zkAddress、 hostname 和 zkPath。注意:每個ActiveMQBrokerName必須相同,否則不能加入叢集。 Node-01 中的持久化配置:

<brokerxmlns="http://activemq.apache.org/schema/core" brokerName="DubboEdu2"dataDirectory="${activemq.data}"> <persistenceAdapter>

<!-- kahaDB directory="${activemq.data}/kahadb"/-->

<replicatedLevelDB

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

replicas="3"

bind="tcp://0.0.0.0:63631"

zkAddress="192.168.1.81:2181,192.168.1.82:2182,192.168.1.83:2183"

hostname="edu-mq-01"

zkPath="/activemq2/leveldb-stores"

/>

</persistenceAdapter>

</broker>

Node-02 中的持久化配置:

<brokerxmlns="http://activemq.apache.org/schema/core" brokerName="DubboEdu2"dataDirectory="${activemq.data}"> <persistenceAdapter>

<!-- kahaDB directory="${activemq.data}/kahadb"/-->

<replicatedLevelDB

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

replicas="3"

bind="tcp://0.0.0.0:63632"

zkAddress="192.168.1.81:2181,192.168.1.82:2182,192.168.1.83:2183"

hostname="edu-mq-01"

zkPath="/activemq2/leveldb-stores"

/>

</persistenceAdapter>

</broker>

Node-03 中的持久化配置:

<brokerxmlns="http://activemq.apache.org/schema/core" brokerName="DubboEdu2"dataDirectory="${activemq.data}">

<persistenceAdapter>

<!-- kahaDB directory="${activemq.data}/kahadb"/-->

<replicatedLevelDB

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

replicas="3"

bind="tcp://0.0.0.0:63633"

zkAddress="192.168.1.81:2181,192.168.1.82:2182,192.168.1.83:2183"

hostname="edu-mq-01"

zkPath="/activemq2/leveldb-stores"

/>

</persistenceAdapter>

</broker>

修改各節點的訊息埠(注意,避免埠衝突):

Node-01 中的訊息埠配置:

<transportConnectors>

<!-- DOS protection, limit concurrent connections to 1000and frame size to 100MB -->

<transportConnector name="openwire"uri="tcp://0.0.0.0:53531?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 1000and frame size to 100MB -->

<transportConnector name="openwire"uri="tcp://0.0.0.0:53532?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 1000and frame size to 100MB -->

<transportConnector name="openwire"uri="tcp://0.0.0.0:53533?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>

7、按順序啟動 3 個 ActiveMQ 節點:

$ /home/wusc/activemq/node-01/bin/activemqstart

$ /home/wusc/activemq/node-02/bin/activemqstart

$ /home/wusc/activemq/node-03/bin/activemqstart

8、叢集的節點狀態分析:

叢集啟動後對 ZooKeeper 資料的抓圖,可以看到 ActiveMQ 的有 3 個節點,分別是 00000000000,00000000001,00000000002

以下第一張圖展現了00000000000 的值,可以看到 elected 的值是不為空,說明這個節點是 Master,其他兩個節點是 Slave。

 

9、叢集可用性測試(配置和測試程式碼,請看視訊):

ActiveMQ 的客戶端只能訪問 Master的 Broker,其他處於 Slave 的Broker 不能訪問。所以客戶端連

接 Broker 應該使用 failover 協議。

failover:(tcp://192.168.1.101:53531,tcp://192.168.1.101:53532,tcp://192.168.1.101:53533)?ran

domize=false

10、叢集高可用測試:

當一個 ActiveMQ 節點掛掉,或者一個ZooKeeper 節點掛掉,ActiveMQ 服務依然正常運轉。如果僅剩一個 ActiveMQ 節點,因為不能選舉 Master,ActiveMQ 不能正常運轉;同樣的,如果ZooKeeper僅剩一個節點活動,不管ActiveMQ 各節點是否存活,ActiveMQ 也不能正常提供服務

11、設定開機啟動:

# vi /etc/rc.local

su - wusc -c '/home/wusc/activemq/node-01/bin/activemq start' su- wusc -c '/home/wusc/activemq/node-02/bin/activemq start' su - wusc -c'/home/wusc/activemq/node-03/bin/activemq start'

2.要讓兩個ActiveMQ叢集能夠實現負載均衡只需要在config目錄下的activemq.xml中配置橋接網路轉移地址,這樣消費端就可以同時消費兩個叢集中訊息佇列的請求資訊,具體·的配置如下:

宣告:在每一個叢集的節點中都要在activemq.xml檔案中配置轉移地址,且如下內容配置在<persistenceAdapter>節點之前

叢集 1 連結叢集 2:

<networkConnectors>

<networkConnector

uri="static:(tcp://192.168.1.101:53531,tcp://192.168.1.101:53532,tcp://192.168.1.101:53533)"

duplex="false"/>

</networkConnectors>

叢集 2 連結叢集 1:

<networkConnectors>

<networkConnector

uri="static:(tcp://192.168.1.81:51511,tcp://192.168.1.82:51512,tcp://192.168.1.83:51513)"

duplex="false"/>

</networkConnectors>

下一篇:我們繼續翻譯redis高可用叢集環境的搭建過程