ActiveMq集群技术

http://blog.csdn.net/neutrojan/article/details/8921533
html


ActiveMQ集群mysql

       ActiveMQ具备强大和灵活的集群功能,但在使用的过程当中会发现不少的缺点,ActiveMQ的集群方式主要由两种:Master-Slave和Broker Cluster。sql

一、Master-Slave数据库

       Master-Slave方式中,只能是Master提供服务,Slave是实时地备份Master的数据,以保证消息的可靠性。当Master失效时,Slave会自动升级为Master,客户端会自动链接到Slave上工做。Master-Slave模式分为三类:Pure Master Slave、Shared File System Master Slave和JDBC Master Slave。apache

(1)PureMaster Slave服务器

   须要两个Broker,一个做为Master,另外一个做为Slave,运行时,Slave经过网络实时从Master处复制数据,同时,若是Slave和Master失去链接,Slave就会自动升级为Master,继续为客户端提供消息服务,如图所示:网络

752c1ed4-4be4-30cc-8a5e-b14b207b4469.jpg

   实践时,咱们使用两个ActiveMQ服务器,一个做为Master,Master不须要作特殊的配置;另外一个做为Slave,配置${ACTIVEMQ_HOME}/conf/activemq.xml文件,在<broker>节点中添加链接到Master的URI和设置Master失效后不关闭Slave,以下:负载均衡


Xml代码   收藏代码
  1. <broker xmlns="http://activemq.apache.org/schema/core" brokerName="pure_slave" masterConnectorURI="tcp://0.0.0.0:61616" shutdownOnMasterFailure="false" dataDirectory="${activemq.base}">  tcp


同时修改Slave的服务端口,如:分布式


Xml代码   收藏代码
  1. <transportConnectors>  

  2.            <transportConnector name="openwire" uri="tcp://0.0.0.0:61617"/>  

  3. </transportConnectors>  


为了看到实践的效果,Master和Slave的消息持久化介质都是采用MySQL,而且Master和Slave分别链接不一样的数据库。

   在消息生产者应用和消息消费者应用的Spring配置文件中添加如下红色内容:


Xml代码   收藏代码
  1. <property name="brokerURL" value="failover:(tcp://localhost:61616,tcp://localhost:61617)?initialReconnectDelay=100" />  

   配置完成后,咱们能够经过如下步骤来进行测试:

A、启动Master和Slave,启动消息生产者应用,并分别发送一些Queue消息和Topic消息,若是此时订阅Topic消息的消费者设置了clientID,咱们就能够在Master的数据库和Slave的数据库中看到还没有消费的消息,包括Queue和Topic的消息;

B、启动消费者应用,能够接收到消息;

C、关闭消费者,生产者继续发送一些消息A;

D、中止Master;

E、生产者继续发送消息B;

F、启动消费者应用,消费者能够接收到消息A和消息B,说明Slave接替了Master的工做并复制了Master的消息。

   这种方式只能两台机器作集群,能够起到很好的双机热备功能,但只能失效一次,只能停机恢复Master-Slave结构。

(2)SharedFile System Master Slave

       SharedFile System Master Slave就是利用共享文件系统作ActiveMQ集群,是基于ActiveMQ的默认数据库kahaDB完成的,kahaDB的底层是文件系统。这种方式的集群,Slave的个数没有限制,哪一个ActiveMQ实例先获取共享文件的锁,那个实例就是Master,其它的ActiveMQ实例就是Slave,当当前的Master失效,其它的Slave就会去竞争共享文件锁,谁竞争到了谁就是Master。这种模式的好处就是当Master失效时不用手动去配置,只要有足够多的Slave。Shared File System Master Slave模式如图所示:

bb92b7d7-d355-3e81-baed-dc582e89c4c3.jpg

   本例子是在一台机器上运行三个ActiveMQ实例,须要对ActiveMQ的配置文件作一些简单的配置,就是把持久化适配器的存储目录改成本地磁盘的一个固定目录,三个实例共享这个目录,以下:


Xml代码   收藏代码
  1. <span style="color: #ff0000;"><persistenceAdapter>  

  2.    <kahaDB directory="E:/XXX/XXX/XXX/cluster/shared_file/data/kahadb" />  

  3. </persistenceAdapter></span>  

而后修改ActiveMQ实例的服务端口和jetty的服务端口,防止端口占用异常。启动三个ActiveMQ实例,就能够进行测试了。


   以上配置只能在一台机器进行,若是各个ActiveMQ实例须要运行在不一样的机器,就须要用到分布式文件系统了。

(3)JDBCMaster Slave

       JDBCMaster Slave模式和Shared File Sysytem Master Slave模式的原理是同样的,只是把共享文件系统换成了共享数据库。咱们只需在全部的ActiveMQ的主配置文件中(${ACTIVEMQ_HOME}/conf/activemq.xml)添加数据源,全部的数据源都指向同一个数据库,如:


Xml代码   收藏代码
  1. <bean id="mysql-ds" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">  

  2.        <property name="driverClassName" value="com.mysql.jdbc.Driver"/>  

  3.        <property name="url" value="jdbc:mysql://localhost:3306/cluster_jdbc?relaxAutoCommit=true"/>  

  4.        <property name="username" value="root"/>  

  5.        <property name="password" value="root"/>  

  6.        <property name="maxActive" value="200"/>  

  7.        <property name="poolPreparedStatements" value="true"/>  

  8. </bean>  

而后修改持久化适配器。这种方式的集群相对Shared File System Master Slave更加简单,更加容易地进行分布式部署,可是若是数据库失效,那么全部的ActiveMQ实例都将失效。


   以上三种方式的集群都不支持负载均衡,但能够解决单点故障的问题,以保证消息服务的可靠性。

二、BrokerCluster

       Broker Cluster主要是经过network of Brokers在多个ActiveMQ实例之间进行消息的路由。Broker的集群分为Static Discovery和Dynamic Discovery两种。

(1)StaticDiscovery集群


Static Discovery集群就是经过硬编码的方式使用全部已知ActiveMQ实例节点的URI地址。如:消息生产者应用链接一个ActiveMQ实例,咱们暂时称为MQ1,全部的消息都由该实例提供;两个消息消费者应用分别链接另外两个ActiveMQ实例,分别为MQ2和MQ3,两个消息消费者须要消费MQ1上的消息,但它们链接的都不是MQ1,能够经过Static Discovery方式把MQ1上的消息路由到MQ2和MQ3,为了保证消费者不因某个节点的失效而致使不能消费消息,在消费者应用中须要配置全部节点的URI。


   生产者ActiveMQ实例不须要特殊的配置,全部的消费者ActiveMQ实例须要添加networkConnectors节点,链接到生产者MQ实例,如:


Xml代码   收藏代码
  1. <span style="color: #ff0000;"><networkConnectors>  

  2. <networkConnector uri="static:failover://(tcp://localhost:61616)" duplex="true" />  

  3. </networkConnectors></span>  


上面这段配置须要加在<persistenceAdapter>节点的前面。而后在消费者应用中设置brokerURL的值如:


Xml代码   收藏代码
  1. <property name="brokerURL" value="<span style="color: #ff0000;">failover:(tcp://localhost:61617)</span>?initialReconnectDelay=100" />  

       Static Discovery集群方式有些缺点,如不能解决单点故障问题,若某个Broker失效时,有可能形成数据的丢失,动态添加节点不够智能化。



   更加详细的说明与配置请参考:http://activemq.apache.org/networks-of-brokers.html

(2)DynamicDiscovery集群

       DynamicDiscovery集群方式在配置ActiveMQ实例时,不须要知道全部其它实例的URI地址,只需在全部实例的${ACTIVEMQ_HOME}/conf/activemq.xml文件中添加如下内容:


Xml代码   收藏代码
  1. <span style="color: #ff0000;"><networkConnectors>  

  2. <networkConnector uri="multicast://default" />  

  3. </networkConnectors></span>  


同时在<transportConnectors>节点中添加如下红色部份内容:


Xml代码   收藏代码
  1. <transportConnectors>  

  2. <transportConnector name="openwire" uri="tcp://0.0.0.0:61616" <span style="color: #ff0000;">discoveryUri="multicast://default"</span> />  

  3. </transportConnectors>  


这样就能够实现消息在全部ActiveMQ实例之间进行路由。Dynamic Discovery集群方式的缺点和Static Discovery同样。

   从以上的分析能够看出,Master-Slave模式不支持负载均衡,但能够经过消息的实时备份或共享保证消息服务的可靠性,Broker Cluster模式支持负载均衡,能够提升消息的消费能力,但不能保证消息的可靠性。因此为了支持负载均衡,同时又保证消息的可靠性,咱们能够采用Msater-Slave+Broker Cluster的模式。