JMS学习十二(Spring+ActiveMQ集群配置)

来源:互联网 发布:c语言if语句格式 编辑:程序博客网 时间:2024/06/09 17:50

ActiveMQ集群

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

1、Master-Slave

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

(1)Pure Master Slave

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

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

 

Xml代码  收藏代码

 

[html] view plain copy
print?
  1. <broker xmlns=“http://activemq.apache.org/schema/core” brokerName=“pure_slave” masterConnectorURI=“tcp://0.0.0.0:61616”   shutdownOnMasterFailure=“false” dataDirectory={activemq.base}"</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;&nbsp;&nbsp;</span></span></li></ol></div><pre code_snippet_id="2265190" snippet_file_name="blog_20170527_1_7885643" name="code" class="html" style="display: none;">&lt;broker xmlns="http://activemq.apache.org/schema/core" brokerName="pure_slave" masterConnectorURI="tcp://0.0.0.0:61616"   shutdownOnMasterFailure="false" dataDirectory="{activemq.base}”>

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

     

    Xml代码  收藏代码 

     

    [html] view plain copy
    print?
    1. <transportConnectors>    
    2.             <transportConnector name=“openwire” uri=“tcp://0.0.0.0:61617”/>    
    3. </transportConnectors>  
    <transportConnectors>              <transportConnector name="openwire" uri="tcp://0.0.0.0:61617"/>  </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)Shared File System Master Slave

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

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

     

    Xml代码  收藏代码
    [html] view plain copy
    print?
    1. <persistenceAdapter>    
    2.     <kahaDB directory=“E:/XXX/XXX/XXX/cluster/shared_file/data/kahadb” />    
    3. </persistenceAdapter>  
    <persistenceAdapter>      <kahaDB directory="E:/XXX/XXX/XXX/cluster/shared_file/data/kahadb" />  </persistenceAdapter>

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

     

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

    (3)JDBC Master Slave

            JDBC Master 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实例都将失效。

     

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

    2、Broker Cluster

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

    (1)Static Discovery集群

     

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

     

        生产者ActiveMQ实例不需要特殊的配置,所有的消费者ActiveMQ实例需要添加networkConnectors节点,连接到生产者MQ实例,如:

     

    Xml代码  收藏代码

     

    [html] view plain copy
    print?
    1. <networkConnectors>    
    2. <networkConnector uri=“static:failover://(tcp://localhost:61616)” duplex=“true” />    
    3. </networkConnectors>  
    <networkConnectors>  <networkConnector uri="static:failover://(tcp://localhost:61616)" duplex="true" />  </networkConnectors>

    上面这段配置需要加在<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)Dynamic Discovery集群

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

     

    Xml代码  收藏代码

    [html] view plain copy
    print?
    1. <networkConnectors>    
    2. <networkConnector uri=“multicast://default” />    
    3. </networkConnectors>  
    <networkConnectors>  <networkConnector uri="multicast://default" />  </networkConnectors>

     

     同时在<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的模式。


    /************************** 个人总结***************************/

    通过前面的学习,想实现集群还是很简单的,具体如下

    1、如果想使用Broker相互数据的获取则在消息服务器的activemq.xml配置文件中配置networkConnection,而如果使用Master-Slave的方式则将持久化配置到数据库或者同一个文件地址。

    2、消息生产者和消费者连接消息服务使用failover(失效转移)。这样其实简单的集群就ok了,其实上文讲的很清楚,看看就ok了!


    原文地址:http://bh-keven.iteye.com/blog/1617788


    这也是最后一篇文章了吧activemq相关的能参考的文章列一下,这里不包括我自己的哈哈!

    ActiveMQ相关文章:

    [html] view plain copy
    print?
    1. topic消息模型持久订阅: http://blog.csdn.net/zhu_tianwei/article/details/46303347  
    2. 消息过滤 : http://blog.csdn.net/zbw18297786698/article/details/52999451  
    3. 数据库持久化: http://www.cnblogs.com/xinhuaxuan/p/6128380.html  
    4. 消息持久化 使用内存:http://www.gaofi.cn/note/detail/61  
    5. activemq 支持的传输协议:http://blog.csdn.net/vtopqx/article/details/51787717  
    6. ssl传输方式:http://blog.csdn.net/xiaoming444/article/details/3979521  
    7. activemq 消息broker集群方式:http://www.cnblogs.com/leihenqianshang/articles/5623858.html  
    8. activemq broker 学习:http://manzhizhen.iteye.com/blog/2116920  
    9. activemq 两种集群方式:http://www.open-open.com/lib/view/open1400126457817.html  
    10. spring+active实例:http://www.cnblogs.com/xinhuaxuan/p/6111604.html  
    11. spring+active实例:http://blog.csdn.net/zbw18297786698/article/details/53140294  
    12. activemq + spring整合方式1 :http://www.cnblogs.com/xinhuaxuan/p/6111604.html  
    13. activemq + spring整合方式2:http://blog.csdn.net/zbw18297786698/article/details/53140294  
    14. activemq 官网是这种方式:http://blog.csdn.net/he90227/article/details/51241597     http://activemq.apache.org/spring-support.html  
    15. active+spring 监听讲解很清楚:http://blog.csdn.net/haoxingfeng/article/details/9167895  
    16. active+spring 消息持久化:http://blog.csdn.net/s296850101/article/details/52382720   
    17. active+spring 消息持久化:http://greemranqq.iteye.com/blog/2167158      
    18. activemq+spring 的集群配置:http://bh-keven.iteye.com/blog/1617788  
    topic消息模型持久订阅: http://blog.csdn.net/zhu_tianwei/article/details/46303347消息过滤 : http://blog.csdn.net/zbw18297786698/article/details/52999451数据库持久化: http://www.cnblogs.com/xinhuaxuan/p/6128380.html消息持久化 使用内存:http://www.gaofi.cn/note/detail/61activemq 支持的传输协议:http://blog.csdn.net/vtopqx/article/details/51787717ssl传输方式:http://blog.csdn.net/xiaoming444/article/details/3979521activemq 消息broker集群方式:http://www.cnblogs.com/leihenqianshang/articles/5623858.htmlactivemq broker 学习:http://manzhizhen.iteye.com/blog/2116920activemq 两种集群方式:http://www.open-open.com/lib/view/open1400126457817.htmlspring+active实例:http://www.cnblogs.com/xinhuaxuan/p/6111604.htmlspring+active实例:http://blog.csdn.net/zbw18297786698/article/details/53140294activemq + spring整合方式1 :http://www.cnblogs.com/xinhuaxuan/p/6111604.htmlactivemq + spring整合方式2:http://blog.csdn.net/zbw18297786698/article/details/53140294activemq 官网是这种方式:http://blog.csdn.net/he90227/article/details/51241597     http://activemq.apache.org/spring-support.htmlactive+spring 监听讲解很清楚:http://blog.csdn.net/haoxingfeng/article/details/9167895active+spring 消息持久化:http://blog.csdn.net/s296850101/article/details/52382720 active+spring 消息持久化:http://greemranqq.iteye.com/blog/2167158    activemq+spring 的集群配置:http://bh-keven.iteye.com/blog/1617788


原创粉丝点击