ActiveMQ如何集羣

一、本文目的

        介紹如何在同一臺虛擬機上搭建高可用的Activemq服務,集羣數量包含3個Activemq,當Activemq可用數>=2時,整個集羣可用。

        本文Activemq的集羣數量爲3個,分別命名爲mq1,mq2,mq3

 

二、概念介紹

1、僞集羣

      集羣搭建在同一臺虛擬機上,3個Activemq分別使用不同的端口提供服務,啓用1個爲Master,其它2個爲Slaver,同一時間僅Master隊列提供服務

2、高可用

      3個Activemq服務,同一時間僅Master隊列提供服務,當Master隊列掛掉後,其它2個Slaver自動選舉出1個成爲Master,整個隊列服務依然可用。當掛掉的隊列重新恢復後,自動加入集羣。當集羣僅剩下1個隊列時,整個隊列不可用。

3、Activemq集羣數據存儲方式

      a) kahaDB:文件共享,默認方式

      b) JDBC:數據庫共享,支持MySql、Sql Server、Oracle等

      c) LevelDB:數據共享,本文使用方式,比kahaDB更快,基於索引

 

三、Activemq僞集羣的搭建

1、Activemq的端口介紹

      Activemq默認主要使用2個端口,8161(Web管理控制檯端口)、61616(提供消息隊列服務的端口),如果需要搭建集羣,還需要開放集羣間通訊的端口(主要用於選舉Master)

 

2、Activemq集羣端口的分配

  Web管理控制檯 消息服務接口 集羣通訊接口
mq1 8161 51511 61601
mq2 8162 51512 61602
mq3 8163 51513 61603

服務接口沒有使用默認的61611是因爲activemq默認還會使用61613,61614等端口,如何開放端口及配置控制檯端口請自行百度

 

3、修改activemq配置

a) 安裝activemq,本文使用Activemq版本爲5.11.1,安裝過程略

b) 修改配置文件activemq.xml,路徑爲conf/activemq.xml

     1、broker(所有activemq的brokerName必須一致,才能加入同一個集羣)

1

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

    2、配置levelDB,加載<broker>節點內

           bind:集羣間通訊的ip和端口

           zkAddress:ZooKeeper地址,多個可用,逗號分隔

           hostname:主機名,可在/etc/hosts中進行配置

           zkPath:zkPath目錄,可在ZooInspetor中進行查看

1

2

3

4

5

6

7

8

9

10

11

<persistenceAdapter>

         <!-- kahaDB directory="${activemq.data}/kahadb"/ -->

         <replicatedLevelDB

             directory="${activemq.data}/leveldb"

             replicas="3"

             bind="tcp://127.0.0.1:61601"

             zkAddress="192.168.146.130:2181"

             hostname="V1"

             zkPath="/activemq/leveldb-stores"

             />

     </persistenceAdapter>

4、啓動activemq

      /usr/local/src/activemq1/bin/activemq start

      可通過/usr/local/src/activemq1/data/activemq.log查看啓動日誌

 

5、關於管控臺

       雖然3個activemq都啓動了,但是同一時間只有Master對應的管控臺可用,Slaver對應的管控臺不可用

 

四、結合ZooInspector測試(推薦使用dubbokeeper中查看zookeeper的一個UI插件,https://github.com/dubboclub/dubbokeeper)

1、打開ZooInspector(可自行搜索下載或從羣中下載),輸入ZooKeeper地址進行監控,如果3個activemq都啓動成功,則顯示如下:

2、Java測試代碼

       代碼可參考:http://www.cnblogs.com/gossip/p/5970090.html

       a) 配置集羣IP(這裏3個activemq的端口分別是51511,51512,51513)

1

2

3

4

5

6

7

8

<!-- 配置JMS連接工廠 -->

<bean id="connectionFactory" class="org.apache.activemq.ActiveMQConnectionFactory">

    <property name="brokerURL" value="failover:(tcp://192.168.146.129:51511,tcp://192.168.146.129:51512,tcp://192.168.146.129:51513)" />

    <!--解決接收消息拋出異常:javax.jms.JMSException: Failed to build body from content. Serializable class not available to broke-->

    <property name="trustAllPackages" value="true"/>

    <!-- 是否異步發送 -->

    <property name="useAsyncSend" value="true" />

</bean>

        b)  測試代碼

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

@Test

  public void produceMsg_DefaultQueue() {

      for (int i = 0; i < 10000; i++) {

          final String msg ="序號:"+String.valueOf(i) + " " +"這裏是向默認隊列發送的消息" + new Date().toString();

          System.out.println(msg);

 

          String destination = jmsTemplate.getDefaultDestination().toString();

          jmsTemplate.send(new MessageCreator() {

              public Message createMessage(Session session) throws JMSException {

                  return session.createTextMessage(msg);

              }

          });

 

          try {

              Thread.sleep(300);

          } catch (InterruptedException e) {

              e.printStackTrace();

          }

      }

  }

3、啓動Java程序併發送消息

 

4、關閉Master隊列(注意此時的Master隊列爲mq2)

a)   此時的ZooInspetor

 

5、重啓mq2隊列(重啓後mq2加入隊列成爲Slaver,但是mq1還是Master,隊列不受影響)

 

6、關閉mq1、mq2,僅剩mq3(由於只有一個隊列,無法進行選舉,所以整個隊列都無法提供服務)

 

7、重啓mq1(重啓mq1後,mq1和mq3選舉了Master隊列,從而重新對外提供服務)

a) ZooInspecto顯示mq1被選舉爲Master

b) 程序重新向隊列消息,數據並沒有中斷 

 

五、總結

        本文演示了activemq僞集羣的搭建過程及高可用的測試過程,通過舉一反三可以將activemq部署到不同的機器上,從而實現相同的功能。

        遺留問題:ZooInspetor的activemq編號是自動生成的,很難發現其對應的隊列,請問有沒有可以自定義編號的方法,謝謝。

 

六、參考資料

1、http://www.cnblogs.com/gossip/p/5970090.html

2、http://activemq.apache.org/replicated-leveldb-store.html

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