1. 程式人生 > >zookeeper+activemq配置訊息中介軟體叢集 伺服器配置

zookeeper+activemq配置訊息中介軟體叢集 伺服器配置


摘要 自從activemq5.9.0開始,activemq的叢集實現方式取消了傳統的Master-Slave方式,增加了基於zookeeper+leveldb的實現方式,其他兩種方式:目錄共享和資料庫共享依然存在。本文主要闡述基於zookeeper和leveldb搭建activemq叢集,這裡需要特別提醒,本文實現的叢集僅提供主備功能,避免單點故障,沒有負載均衡功能。

 自從activemq5.9.0開始,activemq的叢集實現方式取消了傳統的Master-Slave方式,增加了基於zookeeper+leveldb的實現方式,其他兩種方式:目錄共享和資料庫共享依然存在。本文主要闡述基於zookeeper和leveldb搭建activemq叢集,這裡需要特別提醒,本文實現的叢集僅提供主備功能,避免單點故障,沒有負載均衡功能。

    下面開始我們的征途。

一、搭建zookeeper叢集

    本文使用zookeeper3.4.6,3臺虛擬機器:192.168.2.161, 192.168.2.145, 192.168.2.146,zookeeper使用其預設埠:2181。

    zookeeper叢集搭建完成之後,我順便搭建了兩套監控系統:taokeeper-monitor和node-zookeeper-browser。前者是淘寶開源的一套監控zookeeper的系統,用了之後感覺得到的有效資訊不多,而且叢集趨勢圖總是不顯示;後者是用nodejs實現的zookeeper節點資料檢視系統,雖然頁面不太美觀,但是實用。

                                                                圖 1. taokeeper-monitor介面

                                                                圖 2. node-zookeeper-browser介面

二、搭建activemq叢集

1、安裝

activemq本身的安裝過程很簡單,本文不詳述,可參照官方的Getting-started

2、配置

在三臺機器上完成activemq安裝之後,開始叢集配置,通過配置使三個activemq例項組成叢集。下面的配置在三個例項上保持一致,除了標紅部分,主要修改配置檔案conf/activemq.xml。

    (1)broker-name的統一

        將broker標籤的brokerName屬性設定為統一的值,我將這個值設定為“test”,只有三個例項的brokerName一致,zookeeper才能識別它們屬於同一個叢集。

    (2)persistenceAdapter的配置

        persistenceAdapter設定持久化方式,主要有三種方式:kahaDB(預設方式)、資料庫持久化、levelDB(v5.9.0提供支援)。

        本文采用levelDB來進行持久化,並使用zookeeper實現叢集的高可用,配置如下:

        首先註釋掉原來kahaDB的持久化方式,然後配置levelDB+zookeeper的持久化方式。

?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 <!-- <persistenceAdapter> <kahaDB directory="${activemq.data}/kahadb"/> </persistenceAdapter> --> <persistenceAdapter> <replicatedLevelDB directory="${activemq.data}/leveldb" replicas="3" bind="tcp://0.0.0.0:0" zkAddress="192.168.2.161:2181,192.168.2.145:2181,192.168.2.146:2181" hostname="192.168.2.161" sync="local_disk" zkPath="/activemq/leveldb-stores" /> </persistenceAdapter>

注意上述配置中的hostname屬性值,不同的activemq例項對應不同的hostname值,其他兩個例項配置的hostname值分別為:192.168.2.145, 192.168.2.146。

3、問題與解決方案

配置完成之後啟動zookeeper叢集,然後依次啟動三個activemq例項,啟動之後報錯:"activemq LevelDB IOException handler"。

    原因:版本5.10.0存在的依賴衝突。

    解決方案:

        (1)移除lib目錄中的pax-url-aether-1.5.2.jar包;

        (2)註釋掉配置檔案中的日誌配置;

?
1 2 3 4 <bean id="logQuery" class="org.fusesource.insight.log.log4j.Log4jLogQuery" lazy-init="false" scope="singleton" init-method="start" destroy-method="stop"> </bean>

4、測試

    任意停掉三個例項中的任意一個,activemq服務依然正常運轉。