ActiveMQ+ZooKeeper搭建高可用集群


一、說明

  實際的應用中,一般為了應用的高可用性,都會搭建集群環境去處理。部署多台應用,這樣,即使一台有問題,其他熱備應用可以立馬頂上,繼續提供服務。

  ActiveMQ的集群部署,基於zookeeper的應用程序協調服務和levelDB的持久化方案。

  本文中,基於一個系統環境,搭建偽集群模式,通過不同端口的配置,達到集群安裝的效果。

  基本環境:jdk-7u80-linux-x64.tar.gz、Centos 6.9、zookeeper-3.4.12.tar.gz、apache-activemq-5.9.1-bin.tar.gz、Xshell。

  應用部署:zookeeper啟動3個應用實例,ActiveMQ部署3套應用實例,構成最小單元的集群部署

  其中zookeeper的集群搭建,參見之前文章:https://www.cnblogs.com/eric-fang/p/9283904.html

二、ActiveMQ的集群配置

  ActiveMQ的主從模型,是一種高可用的解決方案,在zookeeper中注冊若干的ActiveMQ Broker,其中只有一台作為主機master對外提供服務,其他作為備份slave保持待機。當master出現問題導致宕機不能正常提供服務的時候,zookeeper通過內部選舉,在眾多slave中推舉出一台作為master繼續對外提供服務。

  1、安裝ActiveMQ

    上傳apache-activemq-5.9.1-bin.tar.gz至linux,解壓,然后修改拷貝,整出三份應用實例:

  

  2、修改配置

    2.1、修改服務端口(activemq.xml)

      分別修改對外提供的openwire服務端口為61616、61617、61618。待修改的地方如下:

<transportConnectors>
            <!-- DOS protection, limit concurrent connections to 1000 and frame size to 100MB -->
            <transportConnector name="openwire" uri="tcp://0.0.0.0:61616?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>

    2.2、修改持久化策略(activemq.xml)

      修改 persistenceAdapter 標簽中的內容,其中相關屬性說明如下:

      replicas - 當前主從模型中的節點數,根據實際配置

      bind - 主從實例間的通訊端口。分別配置為62626、62627、62628

      zkAddress - zookeeper應用的安裝位置

      zkPath - ActiveMQ的主從信息保存在zookeeper中的什么目錄

      hostname - ActiveMQ實例安裝的實際linux主機名。可在 /etc/hosts 中進行配置,設置格式:ip 主機名,例如127.0.0.1 mq-server

<persistenceAdapter>
                <replicatedLevelDB
                         directory="${activemq.data}/levelDB"
                         replicas="3"
                         bind="tcp://0.0.0.0:62626"
                         zkAddress="172.17.0.4:2181,172.17.0.4:2182,172.17.0.4:2183"
                         zkPath="/activemq/leveldb-stores"
                         hostname="mq-server"
                />
        </persistenceAdapter>

    2.3、修改broker標簽屬性(activemq.xml)

<broker xmlns="http://activemq.apache.org/schema/core" brokerName="mq-cluster" dataDirectory="${activemq.data}">

    所有的主從節點,上述的brokerName必須一致。

    2.4、修改控制台訪問端口(jetty.xml)

      分別修改jetty的訪問端口為:8161、8162、8163

<bean id="jettyPort" class="org.apache.activemq.web.WebConsolePort" init-method="start">
             <!-- the default port number for the web console -->
        <property name="port" value="8161"/>
    </bean>

  2、啟動ActiveMQ應用

    配置完成后,分別啟動3個ActiveMQ應用,啟動命令:${activemq-home}/bin/activemq start。啟動后,可以jps看是否存在,也可以查看日志文件,日志目錄:${activemq-home}/data/activemq.log

  3、查驗ActiveMQ的狀態

    可以在zookeeper中查驗ActiveMQ的主從狀態

    3.1、${zookeeper-home}/bin/zkCli.sh

    

    3.2、ls /activemq/leveldb-stores 查看ActiveMQ節點注冊信息。

    

    3.3、get /activemq/leveldb-stores/000000000037 可以查驗當前哪台ActiveMQ作為主機提供服務,其中主節點的address和elected一定非null,有數據。

  

三、集群的使用

  ActiveMQ使用的時候,就是在設置brokerURL的時候,設置為失敗轉移即可:

failover:(tcp://111.231.51.200:61616,tcp://111.231.51.200:61617,tcp://111.231.51.200:61618)?initialReconnectDelay=1000

四、可能遇到問題

  配置過程中個,3個 zk 應用和3個 ActiveMQ應用啟動正常,從 zk 中查看ActiveMQ的主從也選舉OK,但是,在訪問ActiveMQ控制台以及發送消息的時候,就是不通。查看端口占用的,ActiveMQ提供服務的應用端口居然也沒有正常監聽。查看從應用的日志( ${activemq-home/data/activemq.log} ),發現一直報錯:

  

看錯誤,未知主機錯誤。解決辦法:vi /etc/hosts

增加配置:127.0.0.1 cfang  

 再回頭查看日志,下面不會繼續報錯,正常組成主從,主服務端口監聽正常。

 


免責聲明!

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



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