ActiveMQ+ZooKeeper搭建高可用集羣

1、說明html

  實際的應用中,通常爲了應用的高可用性,都會搭建集羣環境去處理。部署多臺應用,這樣,即便一臺有問題,其餘熱備應用能夠立馬頂上,繼續提供服務。java

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

  本文中,基於一個系統環境,搭建僞集羣模式,經過不一樣端口的配置,達到集羣安裝的效果。web

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

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

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

2、ActiveMQ的集羣配置spa

  ActiveMQ的主從模型,是一種高可用的解決方案,在zookeeper中註冊若干的ActiveMQ Broker,其中只有一臺做爲主機master對外提供服務,其餘做爲備份slave保持待機。當master出現問題致使宕機不能正常提供服務的時候,zookeeper經過內部選舉,在衆多slave中推舉出一臺做爲master繼續對外提供服務。3d

  一、安裝ActiveMQ日誌

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

  

  二、修改配置

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

      分別修改對外提供的openwire服務端口爲6161六、6161七、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.二、修改持久化策略(activemq.xml)

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

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

      bind - 主從實例間的通信端口。分別配置爲6262六、6262七、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.三、修改broker標籤屬性(activemq.xml)

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

    全部的主從節點,上述的brokerName必須一致。

    2.四、修改控制檯訪問端口(jetty.xml)

      分別修改jetty的訪問端口爲:816一、816二、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>

  二、啓動ActiveMQ應用

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

  三、查驗ActiveMQ的狀態

    能夠在zookeeper中查驗ActiveMQ的主從狀態

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

    

    3.二、ls /activemq/leveldb-stores 查看ActiveMQ節點註冊信息。

    

    3.三、get /activemq/leveldb-stores/000000000037 能夠查驗當前哪臺ActiveMQ做爲主機提供服務,其中主節點的address和elected必定非null,有數據。

  

3、集羣的使用

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

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

4、可能遇到問題

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

  

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

增長配置:127.0.0.1 cfang  

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

相關文章
相關標籤/搜索