ActiveMQ+ZooKeeper 偽叢集整合

funnyok發表於2021-09-09

前言

本案例使用的是偽叢集方式,即在一臺主機上部署3個activemq服務(埠不同)+3個zookeeper服務(埠不同)。

真叢集部署請看:
如果需要了解ActiveMQ叢集部署的整體概念,可以參考我這篇文章:

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

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

一、服務端配置

1. ZooKeeper偽叢集配置

-- 服務埠 叢集通訊埠 節點目錄/opt/下
zk1 2181 2887:3887 /zookeeper/zk1
zk2 2182 2888:3888 /zookeeper/zk2
zk3 2183 2889:3889 /zookeeper/zk3

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

  • zk1
    zk1/conf/zoo.cfg:


    # 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:


    # 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協議,註釋其它協議 --&gt
    
        <!-- node1服務埠使用預設埠61616 --&gt
        
        <!--
        
        
        
        
        --&gt
    <!-- 持久化的部分為ZooKeeper叢集連線地址--&gt  
      
          
    <!-- 
    # 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
    # 更多參考:
    --&gt

    /opt/activemq/conf/jetty.xml:


    
        
         <!-- 在這裡修改埠為8161,預設就是8161 --&gt
    
  • node2
    /opt/activemq/node2/conf/activemq.xml:


    
        <!-- 服務埠改為61617 --&gt
        <!-- 持久化的部分為ZooKeeper叢集連線地址--&gt  
      
          
    

    /opt/activemq/conf/jetty.xml:


    
        
         <!-- 在這裡修改埠為8162,預設是8161 --&gt
    
  • node3
    /opt/activemq/node3/conf/activemq.xml:


    
        <!-- 服務埠改為61618 --&gt
        <!-- 持久化的部分為ZooKeeper叢集連線地址--&gt  
      
          
    

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


    
        
         <!-- 在這裡修改埠為8163,預設是8161 --&gt
    

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,監聽情況

三、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


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/3137/viewspace-2800740/,如需轉載,請註明出處,否則將追究法律責任。

相關文章