天天看點

ActiveMQ從入門到精通(三)利用Zookeeper實作ActiveMQ的高可用

話不多說,先來看一張ActiveMQ官方提供的架構圖:

<a href="https://s5.51cto.com/wyfs02/M00/8F/34/wKioL1jXr5Li62TyAAE_KWap_pg504.png" target="_blank"></a>

Master/Slave broker的資訊要注冊到ZK

注意到隻有Master對外提供了服務,Slave是待機狀态。當Master出現故障,ZK内部的選舉機制,會讓一個Slave更新成Master對外提供服務。

關于ZK,以後部落客會有專題進行介紹,這裡不做詳細講解,隻需要了解通過ZK的協調、選舉、容錯機制等會實作ActiveMQ的高可用。

既然要做到高可用,那麼ZK也得是高可用的,是以這裡的搭建方案是這樣的:

<a href="https://s5.51cto.com/wyfs02/M01/8F/34/wKioL1jXr9GyjWd1AABcYGDubWE287.png" target="_blank"></a>

第一步:JDK環境

<a href="https://s5.51cto.com/wyfs02/M02/8F/36/wKiom1jXr_TiqOqrAAAaOf8DsBs655.png" target="_blank"></a>

保證這3台機器都安裝了JDK,并配置了JAVA環境變量。

第二步:配置Zookeeper

<a href="https://s5.51cto.com/wyfs02/M02/8F/34/wKioL1jXsDDjKt1oAAAWOUY_BZw130.png" target="_blank"></a>

為什麼要配置ZK環境變量呢?很簡單,我想在指令行下直接使用ZK相關的指令,而不是進入到安裝ZK目錄下的bin,更不想用絕對路徑。

<a href="https://s2.51cto.com/wyfs02/M00/8F/36/wKiom1jXsFnTX9scAAB1pNZQYLQ310.png" target="_blank"></a>

注意dataDir目錄的指定;注意2181是外部通路ZK的端口;

2888:3888是ZK叢集内部通信(比如ZK原子廣播消息)的端口,注意server.X的定義,這是将ZK叢集中的執行個體進行編号,實際上需要在dataDir目錄中建立myid檔案,并與之保持一緻。

<a href="https://s1.51cto.com/wyfs02/M00/8F/34/wKioL1jXsIXQ5LRnAAAHLU0W4og456.png" target="_blank"></a>

第三步:啟動ZK

<a href="https://s2.51cto.com/wyfs02/M01/8F/36/wKiom1jXsLDxCFbpAABUCOMc1Yk291.png" target="_blank"></a>

可以通過netstat指令檢視2722程序,發現ZK的端口是2181,這和zoo.cfg的配置是一緻的。讓3台機器的ZK都啟動起來。

<a href="https://s4.51cto.com/wyfs02/M01/8F/34/wKioL1jXsNXTU0p4AAAusjZWeKI223.png" target="_blank"></a>

第四步:ActiveMQ主從配置

注意了,由于我将在3台實體機上搭建一台Master,2台Slave,是以我這邊不需要對端口配置檔案進行改動。比如WEB管控台的jetty.xml。

<a href="https://s4.51cto.com/wyfs02/M02/8F/36/wKiom1jXsQGAljYxAAAYPx3pa68680.png" target="_blank"></a>

3台機器應該對外隻有一個統一的名稱,就是這個brokerName。3台機器都修改成一個名稱即可。

這裡持久化,我将采用LevelDB,是以需要修改持久化配置:

<a href="https://s4.51cto.com/wyfs02/M00/8F/34/wKioL1jXsXSRDpjyAAAvao12GQ4122.png" target="_blank"></a>

注意bind位址,其實是ActiveMQ叢集内部通信的TCP端口,和ActiveMQ對外提供的消息端口(預設61616)不要搞混了。

hostname即本機的主機名稱。

給出ZK叢集的清單以及zkPath。zkPath下面其實存放着ActiveMQ的節點,在後續你會看到。

啟動3台機器上的ActiveMQ,然後利用ZooInspector你可以看到:

<a href="https://s5.51cto.com/wyfs02/M02/8F/34/wKioL1jXsYuBzIvbAACFvTTa2o0409.png" target="_blank"></a>

此時此刻,基于ZK的ActiveMQ的高可用方案就做好了。那麼JAVA端通路ActiveMQ有什麼變化麼?其實就是在建立ConnectionFactory的時候給定的URL有變化:

failover:(tcp://192.168.99.121:61616,tcp://192.168.99.122:61616,tcp://192.168.99.123:61616)?Randomize=false

就是一個失敗轉移協定!

上面隻是做了一個ActiveMQ的高可用方案,那麼ActiveMQ叢集呢?其實所謂的ActiveMQ叢集就是多個ActiveMQ高可用之間産生關聯:

<a href="https://s1.51cto.com/wyfs02/M01/8F/36/wKiom1jXsciDGUC-AABHFyt66Nw706.png" target="_blank"></a>

高可用的ActiveMQ-1,ActiveMQ-2,...,ActiveMQ-N就可以組建ActiveMQ叢集

在配置上很簡單,其實就是ActiveMQ-1要知道ActiveMQ-2的資訊而已,這裡大家可以自行百度,不在示範了。

整個ActiveMQ從入門到精通系列就結束了,希望對大家有幫助!

本文轉自zfz_linux_boy 51CTO部落格,原文連結:http://blog.51cto.com/zhangfengzhe/1910511,如需轉載請自行聯系原作者