基于zookeeper+levelDB的ActiveMQ集群

         ActiveMQ 是Apache出品,最流行的,能力强劲的开源消息总线。ActiveMQ 是一个完全支持JMS1.1和J2EE 1.4规范的 JMS Provider实现,尽管JMS规范出台已经是很久的事情了,但是JMS在当今的J2EE应用中间仍然扮演着特殊的地位。------百度百科

       在实际的公司项目中如果只是使用ActiveMQ的单点的话,可用性是很差的,如果不小心MQ的机器宕机的话整个系统都会瘫痪,所以在实际的项目中需要使用集群部署来提升可用性。ActiveMQ的高可用的部署方式在5.9.0版之前是用Master-Slave方式,Master-Slave方式又有三种可用的形式,分别是

1)shared filesystem Master-Slave(共享文件系统),

2)shared database Master-Slave方式(共享数据库方式),和第1)的区别不大,主要就是共享的存储介质由文件系统改             成了数据库而已

3)Replicated LevelDB Store方式

         这种主备方式是ActiveMQ5.9以后才新增的特性,使用ZooKeeper协调选择一个node作为master。被选择的master broker node                   开启并接受客户端连接。

今天我要讲的就是使用第三种方式来做ActiveMQ的集群,这里需要注意的一点是Master-Slave方式只能提升可用性,也就是其中一个节点挂了之后,其他节点中的一个会马上被推举成Master来提供服务,这个推举的工程就由zookeeper来完成,而不能完成负载均衡的作用。ActiveMQ的负载均衡可以由它的Broker-Cluster的部署方式来实现。所以如果既要提升可用性还要做到负载均衡,就得结合这两种部署方式了,这个我也想在以后有空的时候试一下。其实我也是刚学,很多东西都不懂,也都是在网上找相关的博客和资料来学习,然后自己动手尝试。

好了,开始来着手完成这个任务吧。

在整个过程中我只用到了3台机器来做这个实验,3台也是最少的要求了。

一、安装和搭建zookeeper集群

      这部分我在之前得博客中已经完成了,所以可以去这里看

      CentOS7下安装配置zookeeper集群

二、安装和搭建ActiveMQ集群

      1、安装:安装ActiveMQ非常简单,我就不在这里将了,可以去网上搜索一下

      2、配置:其实这里只需要稍微修改一下ActiveMQ的配置文件即可,主要改动如下

          

<!--
        <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.202.66:2181,192.168.202.67:2181,192.168.202.68:2181"
              hostname="192.168.202.66"
              sync="local_disk"
              zkPath="/activemq/leveldb-stores"/>
       </persistenceAdapter> 
            将默认的kahaDB的持久化方式改成本文中的zookeeper+levelDB的方式

     这样就完成了这个整个集群的部署了,现在只需要把3台机器中的zookeeper和ActiveMQ启动起来就可以了,需要先启动zookeeper。

   启动成功之后可以在浏览器中输入:http://192.168.202.68:8161/admin/index.jsp

   去管理我们的ActiveMQ

三、测试:我们需要写一个测试项目来测试这个ActiveMQ集群是不是真的可以做到避免单点故障的能力,我的整个项目也是在另外一个博客中下载下来的,只是说他之前只是在单点上去做的测试,我把它改成了在集群上去做测试而已,在此非常感谢那位作者,在文章最后我会把本文中左右参考博客的地址都注明上。那么从单点到集群,我所做的改动不多,仅仅是把配置文件做了修改。

 1、ActiveMQ的连接配置文件

      

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"
	xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"
	xmlns:context="http://www.springframework.org/schema/context"
	xsi:schemaLocation=" http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd
    http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
    http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd
    http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd">

	<!-- 配置框架包中自动注入 -->
	<!-- 配置ConnectionFactory -->
	<!-- 真正可以产生Connection的ConnectionFactory,由对应的 JMS服务厂商提供 -->
	<bean id="targetConnectionFactory" class="org.apache.activemq.ActiveMQConnectionFactory">
		<property name="brokerURL"
			value="failover://(tcp://192.168.202.66:61616,tcp://192.168.202.67:61616,tcp://192.168.202.68:61616)?initialReconnectDelay=10000" />
		<property name="userName" value="admin" />
		<property name="password" value="admin" />
	</bean>
	<!-- 连接池配置 -->
	<bean id="pooledConnectionFactory" class="org.apache.activemq.pool.PooledConnectionFactory"
		destroy-method="stop">
		<property name="connectionFactory" ref="targetConnectionFactory"></property>
		<property name="maxConnections" value="10"></property>
	</bean>
	
     <!-- 需要通过 JmsTemplate来完成发送消息-->
   	<bean id="jmsQueueTemplate" class="org.springframework.jms.core.JmsTemplate">
		<property name="connectionFactory" ref="pooledConnectionFactory">
		</property>
		<property name="explicitQosEnabled" value="true" />
		<!-- deliveryMode, priority, timeToLive 的开关,要生效,必须配置为true,默认false -->
		<property name="deliveryMode" value="2" />
		<!-- 发送模式 DeliveryMode.NON_PERSISTENT=1:非持久 ; DeliveryMode.PERSISTENT=2:持久 -->
		<property name="pubSubDomain" value="false" />
	</bean>
	
	<!-- 和上面的JmsTemplate的区别是,上面的是针对点对点的,这个是针对广播消息的 -->
	<bean id="jmsTopicTemplate" class="org.springframework.jms.core.JmsTemplate">
		<property name="connectionFactory" ref="pooledConnectionFactory">
		</property>
		<property name="explicitQosEnabled" value="true" />
		<!-- deliveryMode, priority, timeToLive 的开关,要生效,必须配置为true,默认false -->
		<property name="deliveryMode" value="2" />
		<!-- 发送模式 DeliveryMode.NON_PERSISTENT=1:非持久 ; DeliveryMode.PERSISTENT=2:持久 -->
		<property name="pubSubDomain" value="true" />
	</bean>

    <!-- 点对点消息的目的地队列 -->
	<bean id="destination" class="org.apache.activemq.command.ActiveMQQueue">
		<constructor-arg index="0" value="queue"/>
	</bean>
	<!-- 广播消息的目的地队列 -->
	<bean id="destination2" class="org.apache.activemq.command.ActiveMQTopic">
		<constructor-arg index="0" value="topic"/>
	</bean>
	
	<!-- 4个消息消费者(消息监听器) -->
	<bean id="queueReceiver1" class="com.tgb.SpringActivemq.mq.consumer.queue.QueueReceiver1" />
	<bean id="queueReceiver2" class="com.tgb.SpringActivemq.mq.consumer.queue.QueueReceiver2" />
	
	<bean id="topicReceiver1" class="com.tgb.SpringActivemq.mq.consumer.topic.TopicReceiver1" />
	<bean id="topicReceiver2" class="com.tgb.SpringActivemq.mq.consumer.topic.TopicReceiver2" />
	
	<!-- 消息监听器对应的容器 -->
	<bean id="consumerListenerContainer"
		class="org.springframework.jms.listener.DefaultMessageListenerContainer" primary="true">
		<property name="connectionFactory" ref="pooledConnectionFactory" />
		<property name="destination" ref="destination" />
		<property name="messageListener" ref="queueReceiver1" />
	</bean>
	
	<bean id="consumerListenerContainer1"
		class="org.springframework.jms.listener.DefaultMessageListenerContainer" primary="true">
		<property name="connectionFactory" ref="pooledConnectionFactory" />
		<property name="destination" ref="destination" />
		<property name="messageListener" ref="queueReceiver2" />
	</bean>
	
	<bean id="consumerListenerContainer2"
		class="org.springframework.jms.listener.DefaultMessageListenerContainer" primary="true">
		<property name="connectionFactory" ref="pooledConnectionFactory" />
		<property name="destination" ref="destination2" />
		<property name="messageListener" ref="topicReceiver1"/>
		<property name="pubSubDomain" value="true" /> 
        <property name="pubSubNoLocal" value="false" /> 
	</bean>
	
 	<bean id="consumerListenerContainer3"
		class="org.springframework.jms.listener.DefaultMessageListenerContainer" primary="true">
		<property name="connectionFactory" ref="pooledConnectionFactory" />
		<property name="destination" ref="destination2" />
		<property name="messageListener" ref="topicReceiver2" />
		<property name="pubSubDomain" value="true" /> 
        <property name="pubSubNoLocal" value="false" />
	</bean> 
</beans>  

2、测试:3台机器中的ActiveMQ只会有一个MQ可以被客户端连接使用,在测试时可以把Master关掉,然后在重试客户端消息发送和消费还可以正常使用,则说明集群搭建正常。

在浏览器中输入:http://127.0.0.1:8090/ActiveMQSpring/index.jsp   进行测试操作


 


                  

                      



      3、源码下载

          

   

   自此,这个集群搭建已经完成。

   本文参考到的博客如下,非常感谢他们的付出:

   http://my.oschina.net/xiaohui249/blog/313028

   http://www.open-open.com/lib/view/open1400126457817.html

   http://blog.csdn.net/jiuqiyuliang/article/details/48758203

   如果其他作者又发现我引用了你们的文章而没有贴出你们的地址链接,请联系我,谢谢!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值