1. 程式人生 > >ActiveMQ 基於zookeeper的主從(levelDB Master/Slave)搭建以及Spring-boot下使用

ActiveMQ 基於zookeeper的主從(levelDB Master/Slave)搭建以及Spring-boot下使用

tina true listener 報文 string ext 說明 下使用 nat

0:說明

  ActiveMQ 5.9.0新推出的主從實現,基於zookeeper來選舉出一個master,其他節點自動作為slave實時同步消息。因為有實時同步數據的slave的存在,master不用擔心數據丟失,所以leveldb會優先采用內存存儲消息,異步同步到磁盤,所以該方式的activeMQ讀寫性能最好因為選舉機制要超過半數,所以最少需要3臺節點,才能實現高可用。如果集群是兩臺則master失效後slave會不起作用,所以集群至少三臺。此種方式僅實現主備功能,避免單點故障,沒有負載均衡功能。

1:環境準備

IP
192.168.3.10 server1
192.168.3.11 server2
192.168.3.12 server3

安裝軟件信息:

apache-activemq-5.13.0-bin.tar.gz

zookeeper-3.5.2-alpha.tar.gz

ZooInspector.zip

2:搭建Zookeeper集群

(1)將zookeeper-3.5.2-alpha.tar.gz文件解壓到/home/wzh/zk目錄;

(2)將zoo_sample.cfg復制一份為 zoo.cfg,並修改其配置信息

[email protected]:~/zk/zookeeper-3.5.2-alpha/conf$ cp zoo_sample.cfg zoo.cfg

[email protected]

*/:~/zk/zookeeper-3.5.2-alpha/conf$vim zoo.cfg

tickTime=2000

initLimit=10

syncLimit=5

dataDir=/tmp/zookeeper

clientPort=2181

 

server.1=192.168.3.10:2888:3888

server.2=192.168.3.11:2888:3888

server.3=192.168.3.11:2888:3888

(3)創建/tmp/zookeeper目錄

在該目錄下創建名為myid的文件,內容為1(這個值隨server而改變)

(4)將server1上的/home/wzh/zk/zookeeper-3.5.2-alpha文件夾復制到server2,server3,然後創建/tmp/zookeeper目錄

在該目錄下創建名為myid的文件,內容為2

(5)啟動zookeeper

[192.168.3.10]

[email protected]:~/zk/zookeeper-3.5.2-alpha/bin$ ./zkServer.sh start

ZooKeeper JMX enabled by default

Using config: /home/wzh/zk/zookeeper-3.5.2-alpha/bin/../conf/zoo.cfg

Starting zookeeper ... STARTED

[192.168.3.11]

[email protected]:~/zk/zookeeper-3.5.2-alpha/bin$ ./zkServer.sh start

ZooKeeper JMX enabled by default

Using config: /home/wzh/zk/zookeeper-3.5.2-alpha/bin/../conf/zoo.cfg

Starting zookeeper ... STARTED

[192.168.3.12]

[email protected]:~/zk/zookeeper-3.5.2-alpha/bin$ ./zkServer.sh start

ZooKeeper JMX enabled by default

Using config: /home/wzh/zk/zookeeper-3.5.2-alpha/bin/../conf/zoo.cfg

Starting zookeeper ... STARTED

3:搭建ActiveMQ集群

(1)將apache-activemq-5.13.0-bin.tar.gz解壓到/home/wzh/amq

(2)修改activemq.xml配置文件

【1】將broker節點的brokerName設置為wzhamq

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

【2】將persistenceAdapter的持久化方式選用replicatedLevelDB,將kahaDB方式註釋掉

 <persistenceAdapter>
         <!--
            <kahaDB directory="${activemq.data}/kahadb"/>
         -->
        <replicatedLevelDB 
                directory="${activemq.data}/leveldb" 
                replicas="3" 
                bind="tcp://0.0.0.0:0"        
                zkAddress="192.168.3.10:2181,192.168.3.11:2181"     
                hostname="192.168.3.10"          
                sync="local_disk"          
                zkPath="/activemq/leveldb-stores"/>
        </persistenceAdapter>

將apache-activemq-5.13.復制到11,12機器

[email protected]:~/amq$ scp -r apache-activemq-5.13.0/ [email protected]:/tmp

修改配置文件中的hostname="192.168.3.11"

修改配置文件中的hostname="192.168.3.12"

(3)啟動ActiveMQ

[email protected]:~/amq$ ./apache-activemq-5.13.0/bin/activemq status
INFO: Loading /home/wzh/amq/apache-activemq-5.13.0//bin/env
INFO: Using java /opt/java/jdk1.8.0_91/bin/java
ActiveMQ is running (pid 2031)
[email protected]-master:~/amq$

依次啟動192.168.3.11,192.168.3.12機器

4:集群管理

(1)通過使用ZooInspector工具查看zookeeper集群情況

技術分享

(2)http://192.168.3.10:8161/admin/ 默認用戶名與口令為admin登錄ActiveMQ管理端

5:通過Spring-boot操作ActiveMQ JMS

(1)通過gradle構建Spring-boot應用,在 gradle文件中增加

dependencies {
    compile(org.springframework.boot:spring-boot-starter-activemq)
    compile(org.springframework.boot:spring-boot-starter-web)
    testCompile(org.springframework.boot:spring-boot-starter-test)
}

(2)application中增加以下配置

spring.activemq.broker-url=failover:(tcp://192.168.3.10:61616,tcp://192.168.3.11:61616,tcp://192.168.3.12:61616)
spring.activemq.in-memory=true
spring.activemq.pool.enabled=false
spring.activemq.user=admin
spring.activemq.password=admin

(3)JMS消息發送

@Service
public class Producer {

    @Autowired
    private JmsMessagingTemplate jmsTemplate;

    public void sendMessage(Destination destination, final String message){
        jmsTemplate.convertAndSend(destination, message);
    }
}

(4)JMS消息接收

@Component
public class Consumer {
    @JmsListener(destination = "test.queue")
    public void receiveQueue(String text){

        System.out.println("Consumer收到的報文為:"+text);
    }
}

(5)測試

@RestController
@RequestMapping(
        value = "/test",
        headers = "Accept=application/json",
        produces = "application/json;charset=utf-8"
)
public class TestCtrl {
    @Autowired
    Producer producer;

    Destination destination = new ActiveMQQueue("test.queue");

    @RequestMapping(
            value = "/say/{msg}/to/{name}",
            method = RequestMethod.GET
    )
    public Map<String, Object> say(@PathVariable String msg, @PathVariable String name){
        Map<String, Object> map = new HashMap<>();
        map.put("msg", msg);
        map.put("name", name);

        producer.sendMessage(destination, msg);

        return map;
    }
}

(6)進入ActiveMQ管理控制臺創建一個消息隊列

test.queue

技術分享

(7)通過POSTMAN進行測試

技術分享

2017-08-03 08:10:44.928 INFO 12820 --- [ActiveMQ Task-3] o.a.a.t.failover.FailoverTransport : Successfully reconnected to tcp://192.168.3.10:61616
2017-08-03 08:11:08.854 INFO 12820 --- [ActiveMQ Task-1] o.a.a.t.failover.FailoverTransport : Successfully connected to tcp://192.168.3.10:61616
Consumer收到的報文為:hello
2017-08-03 08:43:39.464 INFO 12820 --- [ActiveMQ Task-1] o.a.a.t.failover.FailoverTransport : Successfully connected to tcp://192.168.3.10:61616
Consumer收到的報文為:hello

(8)目前系統連接的是10,如果此時將10集群Down掉,系統會理解選擇一臺slave作為master提供服務,從而啟動案例主備的效果。



ActiveMQ 基於zookeeper的主從(levelDB Master/Slave)搭建以及Spring-boot下使用