ActiveMQ集羣方案

ActiveMQ集羣方案

本人最近使用VM搭建ActiveMQ集羣成功了,寫篇文章記錄下。集羣方案介紹。

MasterSlave模式

至少需要3個節點,利用ZooKeeper從衆多節點中選舉一個Master節點,其他爲Slave節點。只有Master節點對外提供服務,使用LevelDB存儲消息,當主節點宕機後,其他節點會選舉出一個新的節點成爲Master節點,繼續對外提供服務。

  • 優點:實現高可用,排除單節點故障導致的服務中斷。
  • 缺點:無法實現負載均衡,各個節點的消息無法同步。

BrokerCluster模式

不同節點的Broker之間通過networkConnectors (網絡連接器)方式同步消息,使得不同節點的消費者可以互相消費消息。

網絡連接器:主要用於配置ActiveMQ服務器與服務器之間的網絡通信方式,用於同步消息。分爲靜態和動態。

  • 靜態連接器:指定iP地址
<networkConnectors>

    <networkConnector uri="static:(tcp://xxx,tcp://xxx)"/>

</networkConnectors>
  • 動態連接器:廣播
<networkConnectors>

    <networkConnector uri="multicast://xxx"/>

</networkConnectors>
  • 優點:實現負載均衡,多個Broker之間同步消息。
  • 缺點:不能高可用。

將兩者結合可以同時實現高可用和負載均衡,一舉兩得。

集羣規劃

VM創建三臺服務器,每臺服務器運行兩個activemq實例,分別爲:activemq1和activemq2。

activemq1: 192.168.254.132,192.168.254.133,192.168.254.134

activemq2: 192.168.254.132,192.168.254.133,192.168.254.134

MasterSlave集羣

在192.168.254.132上操作

解壓安裝包
tar -zxvf apache-activemq-5.15.8-bin.tar.gz

mv apache-activemq-5.15.8 activemq1 #broker-a集羣

cp –r activemq1 activemq2 #broker-b集羣

修改activemq1的activemq.xml文件

vi activemq1/conf/activemq.xml

  • broker-a
配置brokerName
<broker xmlns="http://activemq.apache.org/schema/core" brokerName="broker-a" dataDirectory="${activemq.data}">

配置LevelDB消息持久化
<persistenceAdapter>
            <replicatedLevelDB directory="${activemq.data}/leveldb"
                    replicas="3"
                    bind="tcp://0.0.0.0:0"
                    zkAddress="192.168.254.132:2181,192.168.254.133:2181,192.168.254.134:2181"
                    zkPassword=""
                    hostname="192.168.254.132"
                    sync="local_disk"
                    zkPath="/activemq/leveldb-stores"/>
        </persistenceAdapter>

修改消息傳輸端口
<transportConnectors>
            <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>

修改activemq2的activemq.xml文件

vi activemq2/conf/activemq.xml

  • broker-b
配置brokerName
<broker xmlns="http://activemq.apache.org/schema/core" brokerName="broker-b" dataDirectory="${activemq.data}">

配置LevelDB消息持久化
<persistenceAdapter>
            <replicatedLevelDB directory="${activemq.data}/leveldb"
                    replicas="3"
                    bind="tcp://0.0.0.0:0"
                    zkAddress="192.168.254.132:2181,192.168.254.133:2181,192.168.254.134:2181"
                    zkPassword=""
                    hostname="192.168.254.132"
                    sync="local_disk"
                    zkPath="/activemq/leveldb-stores"/></persistenceAdapter>

修改消息傳輸端口
<transportConnectors>
            <transportConnector name="openwire" uri="tcp://0.0.0.0:61617?maximumConnections=1000&amp;wireFormat.maxFrameSize=104857600"/>
            <transportConnector name="amqp" uri="amqp://0.0.0.0:6672?maximumConnections=1000&amp;wireFormat.maxFrameSize=104857600"/>
            <transportConnector name="stomp" uri="stomp://0.0.0.0:61713?maximumConnections=1000&amp;wireFormat.maxFrameSize=104857600"/>
            <transportConnector name="mqtt" uri="mqtt://0.0.0.0:2883?maximumConnections=1000&amp;wireFormat.maxFrameSize=104857600"/>
            <transportConnector name="ws" uri="ws://0.0.0.0:61714?maximumConnections=1000&amp;wireFormat.maxFrameSize=104857600"/>
</transportConnectors>

brokerName一致纔會認爲是同一個集羣,且至少有3個纔會成功,否則無法選舉主節點,導致沒有broker可以提供服務。

BrokerCluster集羣

  • broker-a
配置靜態連接器
<networkConnectors>
         <networkConnector uri="static:(tcp://192.168.254.132:61616,tcp://192.168.254.133:61616,tcp://192.168.254.134:61616)" duplex="false"/>
</networkConnectors>

  • broker-b
配置靜態連接器
<networkConnectors>
         <networkConnector uri="static:(tcp://192.168.254.132:61617,tcp://192.168.254.133:61617,tcp://192.168.254.134:61617)" duplex="false"/>
</networkConnectors>

然後使用如下命令把activemq1、activemq2目錄分別拷貝到192.168.254.133,192.168.254.134。

scp –r /usr/local/activemq1/ 192.168.254.133:/usr/local/

scp –r /usr/local/activemq1/ 192.168.254.134:/usr/local/

scp –r /usr/local/activemq2/ 192.168.254.133:/usr/local/

scp –r /usr/local/activemq2/ 192.168.254.134:/usr/local/

啓動集羣

啓動broker-a (3個節點)和 broker-b(3個節點)

每臺服務器執行以下命令:

activemq1/bin/activemq start

activemq2/bin/activemq start

驗證集羣

  • 使用命令jps 或者 activemq status 查看服務是否運行

  • jps
    jps

  • activemq status
    activemq status

  • 使用ZooViewer工具登錄ZooKeeper集羣,查看ActiveMQ集羣配置信息
    ZooViewer

可以看到broker-a和broker-b集羣的主節點是192.168.254.134

客戶端連接

消息生產者和消費者的URL配置:

failover:(tcp://zzh01:61616,tcp://zzh02:61616,tcp://zzh03:61616)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章