ActiveMQ+ZooKeeper 僞集羣整合

前言

本案例使用的是僞集羣方式,即在一臺主機上部署3個activemq服務(端口不一樣)+3個zookeeper服務(端口不一樣)。html

真集羣部署請看:ActiveMQ+ZooKeeper集羣整合
若是須要了解ActiveMQ集羣部署的總體概念,能夠參考我這篇文章:ActiveMQ集羣總體認識node

原理簡介:
通常在部署ActiveMQ集羣的時候,更傾向於使用基於ZooKeeper的Replicated LevelDB Store方式,該方式是Master Slave部署方案的其中一種策略,也是在多臺主機實現ActiveMQ集羣的主流部署方式。 此教程只保證了高可用性。要想保證負載均衡得再結合Broker Clusters 部署方案,配置網絡鏈接器。web

工做流程:
在ZooKeeper中管理多個Broker節點,根據 Master選舉策略讓其中一個 Broker選舉爲Master(只有Master才具有對外提供服務的能力),剩下Broker爲slave。
編碼時,client端(消費者)經過failover協議來鏈接ActiveMQ集羣。apache

1、服務端配置

1. ZooKeeper僞集羣配置

-- 服務端口 集羣通訊端口 節點目錄/opt/下
zk1 2181 2887:3887 /zookeeper/zk1
zk2 2182 2888:3888 /zookeeper/zk2
zk3 2183 2889:3889 /zookeeper/zk3
集羣通訊端口:第一個端口是master和slave之間的通訊端口,默認是2888;第二個端口是leader選舉的端口,集羣剛啓動的時候選舉或者leader掛掉以後進行新的選舉的端口默認是3888。

在/opt/zookeeper下複製3個zookeeper服務,並分別配置它們的文件conf/zoo.cfg:vim

  • zk1
    zk1/conf/zoo.cfg:segmentfault

    # zookeeper的數據存儲和日誌存儲目錄(若是目錄不存在就新建)
    dataDir=/opt/zookeeper/zk1/data
    dataLogDir=/opt/zookeeper/zk1/log
    
    #服務端口
    clientPort=2181
    
    # zk集羣之間的通訊地址
    server.1=localhost:2887:3887
    server.2=localhost:2888:3888
    server.3=localhost:2889:3889

    建立zk1/data/myid文件,填入數字1:服務器

    # 因爲該zk1是server.1,因此在myid中設置數字1
    $ vim /opt/zookeeper/zk1/data/myid
  • zk2
    zk2/conf/zoo.cfg:網絡

    # zookeeper的數據存儲和日誌存儲目錄(若是目錄不存在就新建)
    dataDir=/opt/zookeeper/zk2/data
    dataLogDir=/opt/zookeeper/zk2/log
    
    #服務端口
    clientPort=2182
    
    # zk集羣之間的通訊地址
    server.1=localhost:2887:3887
    server.2=localhost:2888:3888
    server.3=localhost:2889:3889

    建立zk2/data/myid文件,填入數字1:負載均衡

    # 因爲該zk2是server.2,因此在myid中設置數字2
    $ vim /opt/zookeeper/zk2/data/myid
  • zk3
    zk3/conf/zoo.cfg:tcp

    # zookeeper的數據存儲和日誌存儲目錄(若是目錄不存在就新建)
    dataDir=/opt/zookeeper/zk3/data
    dataLogDir=/opt/zookeeper/zk3/log
    
    #服務端口
    clientPort=2183
    
    # zk集羣之間的通訊地址
    server.1=localhost:2887:3887
    server.2=localhost:2888:3888
    server.3=localhost:2889:3889

    建立zk3/data/myid文件,填入數字3:

    # 因爲該zk3是server.3,因此在myid中設置數字3
    $ vim /opt/zookeeper/zk3/data/myid

1.2 分別啓動zookeeper服務

$ /opt/zookeeper/zk1/bin/zkServer.sh start # 啓動zk1服務
$ /opt/zookeeper/zk2/bin/zkServer.sh start # 啓動zk2服務
$ /opt/zookeeper/zk3/bin/zkServer.sh start # 啓動zk3服務

$ /opt/zookeeper/zk1/bin/zkServer.sh status # 查看zk1服務狀態
$ /opt/zookeeper/zk2/bin/zkServer.sh status # 查看zk2服務狀態
$ /opt/zookeeper/zk3/bin/zkServer.sh status # 查看zk3服務狀態

2. ActiveMQ僞集羣配置

2.1 修改ActiveMQ配置文件conf/activemq.xmlconf/jetty.xml

-- 服務端口 jetty控制檯端口 節點目錄/opt/下
node1 61616 8161 /activemq/node1
node2 61617 8162 /activemq/node2
node3 61618 8163 /activemq/node3

在/opt/activemq/複製3個activemq服務,並分別配置它們的文件conf/activemq.xml和conf/jetty.xml:
conf/jetty.xml:

  • node1
    /opt/activemq/node1/conf/activemq.xml:

    <!-- activemq支持5種協議:openwire、amqp、 stomp、mqtt、ws,這裏咱們只使用openwire協議,註釋其它協議 -->
    <transportConnectors>
        <!-- node1服務端口使用默認端口61616 -->
        <transportConnector name="openwire" uri="tcp://0.0.0.0:61616?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>
    
    <!-- 持久化的部分爲ZooKeeper集羣鏈接地址-->  
    <persistenceAdapter>  
        <replicatedLevelDB  
          directory="${activemq.data}/leveldb"  
          replicas="3"  
          bind="tcp://0.0.0.0:0"  
          zkAddress="localhost:2181,localhost:2182,localhost:2183"   
          zkPath="/opt/activemq/leveldb-stores"  
          hostname="localhost"  
          />  
    </persistenceAdapter>
    <!-- 
    # directory: 存儲數據的路徑
    # replicas:集羣中的節點數【(replicas/2)+1公式表示集羣中至少要正常運行的服務數量】,3臺集羣那麼容許1臺宕機, 另外兩臺要正常運行  
    # bind:當該節點成爲master後,它將綁定已配置的地址和端口來爲複製協議提供服務。還支持使用動態端口。只需使用tcp://0.0.0.0:0進行配置便可,默認端口爲61616。 
    # zkAddress:ZK的ip和port, 若是是集羣,則用逗號隔開(這裏做爲簡單示例ZooKeeper配置爲單點, 這樣已經適用於大多數環境了, 集羣也就多幾個配置) 
    # zkPassword:當鏈接到ZooKeeper服務器時用的密碼,沒有密碼則不配置。 
    # zkPah:ZK選舉信息交換的存貯路徑,啓動服務後actimvemq會到zookeeper上註冊生成此路徑   
    # hostname: ActiveMQ所在主機的IP
    # 更多參考:http://activemq.apache.org/replicated-leveldb-store.html
    -->

    /opt/activemq/conf/jetty.xml:

    <bean id="jettyPort" class="org.apache.activemq.web.WebConsolePort" init-method="start">
        <property name="host" value="0.0.0.0"/>
        <property name="port" value="8161"/> <!-- 在這裏修改端口爲8161,默認就是8161 -->
    </bean>
  • node2
    /opt/activemq/node2/conf/activemq.xml:

    <transportConnectors>
        <!-- 服務端口改成61617 -->
        <transportConnector name="openwire" uri="tcp://0.0.0.0:61617?maximumConnections=1000&amp;wireFormat.maxFrameSize=104857600"/>
    </transportConnectors>
    
    <!-- 持久化的部分爲ZooKeeper集羣鏈接地址-->  
    <persistenceAdapter>  
        <replicatedLevelDB  
          directory="${activemq.data}/leveldb"  
          replicas="3"  
          bind="tcp://0.0.0.0:0"  
          zkAddress="localhost:2181,localhost:2182,localhost:2183"   
          zkPath="/opt/activemq/leveldb-stores"  
          hostname="localhost"  
          />  
    </persistenceAdapter>

    /opt/activemq/conf/jetty.xml:

    <bean id="jettyPort" class="org.apache.activemq.web.WebConsolePort" init-method="start">
        <property name="host" value="0.0.0.0"/>
        <property name="port" value="8162"/> <!-- 在這裏修改端口爲8162,默認是8161 -->
    </bean>
  • node3
    /opt/activemq/node3/conf/activemq.xml:

    <transportConnectors>
        <!-- 服務端口改成61618 -->
        <transportConnector name="openwire" uri="tcp://0.0.0.0:61618?maximumConnections=1000&amp;wireFormat.maxFrameSize=104857600"/>
    </transportConnectors>
    
    <!-- 持久化的部分爲ZooKeeper集羣鏈接地址-->  
    <persistenceAdapter>  
        <replicatedLevelDB  
          directory="${activemq.data}/leveldb"  
          replicas="3"  
          bind="tcp://0.0.0.0:0"  
          zkAddress="localhost:2181,localhost:2182,localhost:2183"   
          zkPath="/opt/activemq/leveldb-stores"  
          hostname="localhost"  
          />  
    </persistenceAdapter>

    /opt/activemq/node3/conf/jetty.xml:

    <bean id="jettyPort" class="org.apache.activemq.web.WebConsolePort" init-method="start">
        <property name="host" value="0.0.0.0"/>
        <property name="port" value="8163"/> <!-- 在這裏修改端口爲8163,默認是8161 -->
    </bean>

2.2 依次啓動activemq服務

$ /opt/activemq/node1/bin/activemq start # 啓動節點node1服務
$ /opt/activemq/node2/bin/activemq start # 啓動節點node2服務
$ /opt/activemq/node3/bin/activemq start # 啓動節點node3服務

$ ps -ef|grep activemq # 檢查進程是否運行,即activemq是否啓動成功
$ netstat -anp|grep 61616 # 查看服務端口61616,監聽狀況
$ netstat -anp|grep 61617 # 查看服務端口61617,監聽狀況
$ netstat -anp|grep 61618 # 查看服務端口61618,監聽狀況

3、Client使用

該zookeeper+activemq的集羣Master Slave部署方案,可以提供(3-1)/2的容錯率,即3臺服務器容許宕機一臺,而不影響整個集羣的對外提供服務。

編寫代碼鏈接時使用failover策略:

String url = failover:(tcp://192.168.100.142:61616,tcp://192.168.100.142:61617,tcp://192.168.100.142:61618)?initialReconnectDelay=1000
相關文章
相關標籤/搜索