ActiveMQ高可用+負載均衡+測試
1.為了讓各位更加深入瞭解,我們再重複搭建一個ActiveMQ偽叢集,過程和真實情況下的三個獨立ip的叢集搭建方式一模一樣,如下:
ActiveMQ 高可用叢集安裝、配置(偽叢集)
(ZooKeeper +LevelDB)
1、ActiveMQ 叢集部署規劃:
環境:CentOS 6.6 x64、JDK7
版本: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。注意:每個ActiveMQ的BrokerName必須相同,否則不能加入叢集。 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&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-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&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 1000and frame size to 100MB -->
<transportConnector name="openwire"uri="tcp://0.0.0.0:53533?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>
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高可用叢集環境的搭建過程