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

 

 

 






免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM