`

activeMQ集群的使用与配置

阅读更多
Clustering(集群)
    ActiveMQ从多种不同的方面提供了集群的支持。
1、 Queue consumer clusters
    ActiveMQ支持订阅同一个queue的consumers上的集群。如果一个consumer失效,那么所有未被确认(unacknowledged)的消息都会被发送到这个queue上其它的consumers。如果某个consumer的处理速度比其它 consumers更快,那么这个consumer就会消费更多的消息。
    需要注意的是,笔者发现AcitveMQ5.0版本的Queue consumer clusters存在一个bug:采用AMQ Message Store,运行一个producer,两个consumer,并采用如下的配置文件:
Xml代码 
<beans> 
   <broker xmlns="http://activemq.org/config/1.0" brokerName="BugBroker1" useJmx="true"> 
     <transportConnectors>
       <transportConnector uri="tcp://localhost:61616"/> 
     </transportConnectors>
     <persistenceAdapter> 
         <amqPersistenceAdapter directory="activemq-data/BugBroker1" maxFileLength="32mb"/> 
     </persistenceAdapter>
   </broker>
</beans>


   那么经过一段时间后可能会报出如下错误:
ERROR[ActiveMQTransport:tcp:///127.0.0.1:1843-RecoveryListenerAdapter.java:58-RecoveryListenerAdapter] Message id ID:versus-1837-1203915536609-0:2:1:1:419 could not be recovered from the data store!
    Apache官方文档说,此bug已经被修正,预定在5.1.0版本上体现。

2、 Broker clusters
    一个常见的场景是有多个JMS broker,有一个客户连接到其中一个broker。如果这个broker失效,那么客户会自动重新连接到其它的broker。在ActiveMQ中使用failover:// 协议来实现这个功能。ActiveMQ3.x版本的reliable://协议已经变更为failover://。
    如果某个网络上有多个brokers而且客户使用静态发现(使用Static Transport或Failover Transport)或动态发现(使用Discovery Transport),那么客户可以容易地在某个broker失效的情况下切换到其它的brokers。然而,stand alone brokers并不了解其它brokers上的consumers,也就是说如果某个broker上没有consumers,那么这个broker上的消息可能会因得不到处理而积压起来。目前的解决方案是使用Network of brokers,以便在broker之间存储转发消息。ActiveMQ在未来会有更好的特性,用来在客户端处理这个问题。
    从ActiveMQ1.1版本起,ActiveMQ支持networks of brokers。它支持分布式的queues和topics。一个broker会相同对待所有的订阅(subscription):不管他们是来自本地的客户连接,还是来自远程broker,它都会递送有关的消息拷贝到每个订阅。远程broker得到这个消息拷贝后,会依次把它递送到其内部的本地连接上。有两种方式配置Network of brokers,一种是使用static transport,如下:
Xml代码
1. <broker brokerName="receiver" persistent="false" useJmx="false"> 
2.   <transportConnectors> 
3.     <transportConnector uri="tcp://localhost:62002"/> 
4.   </transportConnectors> 
5.   <networkConnectors> 
6.  <networkConnector uri="static:( tcp://localhost:61616,tcp://remotehost:61616)"/> 
7.   </networkConnectors> 
8.   … 
9. </broker> 


    另外一种是使用multicast discovery,如下:
Xml代码 
1. <broker name="sender" persistent="false" useJmx="false"> 
2.   <transportConnectors> 
3.     <transportConnector uri="tcp://localhost:0" discoveryUri="multicast://default"/> 
4.   </transportConnectors> 
5.   <networkConnectors> 
6.     <networkConnector uri="multicast://default"/> 
7.   </networkConnectors> 
8.   ... 
9. </broker> 


    Network Connector有以下属性:
Property Default Value Description
name bridge name of the network - for more than one network connector between the same two brokers - use different names dynamicOnly false if true, only forward messages if a consumer is active on the connected broker decreaseNetworkConsumerPriority false decrease the priority for dispatching to a Queue consumer the further away it is (in network hops) from the producer networkTTL 1 the number of brokers in the network that messages and subscriptions can pass through conduitSubscriptions true multiple consumers subscribing to the same destination are treated as one consumer by the network excludedDestinations empty destinations matching this list won't be forwarded across the network dynamicallyIncludedDestinations empty destinations that match this list will be forwarded across the network n.b. an empty list means all destinations not in the excluded list will be forwarded staticallyIncludedDestinations empty destinations that match will always be passed across the network - even if no consumers have ever registered an interest duplex false if true, a network connection will be used to both produce AND Consume messages. This is useful for hub and spoke scenarios when the hub is behind a firewall etc.
    关于conduitSubscriptions属性,这里稍稍说明一下。设想有两个brokers,分别是brokerA和brokerB,它们之间用 forwarding bridge连接。有一个consumer连接到brokerA并订阅queue:Q.TEST。有两个consumers连接到brokerB,也是订阅queue:Q.TEST。这三个consumers有相同的优先级。然后启动一个producer,它发送了30条消息到brokerA。如果 conduitSubscriptions=true,那么brokerA上的consumer会得到15条消息,另外15条消息会发送给brokerB。此时负载并不均衡,因为此时brokerA将brokerB上的两个consumers视为一个;如果 conduitSubscriptions=false,那么每个consumer上都会收到10条消息。以下是关于NetworkConnector属性的一个例子:
Xml代码 
1. <networkConnectors> 
2.   <networkConnector uri="static://(tcp://localhost:61617)" 
3.      name="bridge" dynamicOnly="false" conduitSubscriptions="true" 
4.      decreaseNetworkConsumerPriority="false"> 
5.      <excludedDestinations> 
6.        <queue physicalName="exclude.test.foo"/> 
7.        <topic physicalName="exclude.test.bar"/> 
8.      </excludedDestinations> 
9.      <dynamicallyIncludedDestinations> 
10.        <queue physicalName="include.test.foo"/> 
11.        <topic physicalName="include.test.bar"/> 
12.      </dynamicallyIncludedDestinations> 
13.      <staticallyIncludedDestinations> 
14.        <queue physicalName="always.include.queue"/> 
15.        <topic physicalName="always.include.topic"/> 
16.      </staticallyIncludedDestinations> 
17.   </networkConnector> 
18. </networkConnectors> 


3、Master Slave
    在一个网络内运行多个brokers或者stand alone brokers时存在一个问题,这就是消息在物理上只被一个broker持有,因此当某个broker失效,那么你只能等待直到它重启后,这个 broker上的消息才能够被继续发送(如果没有设置持久化,那么在这种情况下,消息将会丢失)。Master Slave 背后的想法是,消息被复制到slave broker,因此即使master broker遇到了像硬件故障之类的错误,你也可以立即切换到slave broker而不丢失任何消息。
    Master Slave是目前ActiveMQ推荐的高可靠性和容错的解决方案。以下是几种不同的类型:
Master Slave Type Requirements Pros Cons
Pure Master Slave None No central point of failure Requires manual restart to bring back a failed master and can only support 1 slave Shared File System Master Slave A Shared File system such as a SAN Run as many slaves as required. Automatic recovery of old masters Requires shared file system JDBC Master Slave A Shared database Run as many slaves as required. Automatic recovery of old masters Requires a shared database. Also relatively slow as it cannot use the high performance journal

3.1 Pure Master Slave
    Pure Master Slave的工作方式如下:
• Slave broker消费master broker上所有的消息状态,例如消息、确认和事务状态等。只要slave broker连接到了master broker,它不会(也不被允许)启动任何network connectors或者transport connectors,所以唯一的目的就是复制master broker的状态。
• Master broker只有在消息成功被复制到slave broker之后才会响应客户。例如,客户的commit请求只有在master broker和slave broker都处理完毕commit请求之后才会结束。
• 当master broker失效的时候,slave broker有两种选择,一种是slave broker启动所有的network connectors和transport connectors,这允许客户端切换到slave broker;另外一种是slave broker停止。这种情况下,slave broker只是复制了master broker的状态。
• 客户应该使用failover transport并且应该首先尝试连接master broker。例如:
failover://(tcp://masterhost:61616,tcp://slavehost:61616)?randomize=false
设置randomize为false就可以让客户总是首先尝试连接master broker(slave broker并不会接受任何连接,直到它成为了master broker)。
   Pure Master Slave具有以下限制:
• 只能有一个slave broker连接到master broker。
• 在因master broker失效而导致slave broker成为master之后,之前的master broker只有在当前的master broker(原slave broker)停止后才能重新生效。
• Master broker失效后而切换到slave broker后,最安全的恢复master broker的方式是人工处理。首先要停止slave broker(这意味着所有的客户也要停止)。然后把slave broker的数据目录中所有的数据拷贝到master broker的数据目录中。然后重启master broker和slave broker。
   Master broker不需要特殊的配置。Slave broker需要进行以下配置
Xml代码:
1.<broker masterConnectorURI="tcp://masterhost:62001" shutdownOnMasterFailure="false"> 
2.     ... 
3.     <transportConnectors> 
4.       <transportConnector uri="tcp://slavehost:61616"/> 
5.    </transportConnectors> 
6. </broker> 


    其中的masterConnectorURI用于指向master broker,shutdownOnMasterFailure用于指定slave broker在master broker失效的时候是否需要停止。此外,也可以使用如下配置:
Xml代码
1.<broker brokerName="slave" useJmx="false"  deleteAllMessagesOnStartup="true"  xmlns="http://activemq.org/config/1.0"> 
2.   ... 
3.   <services> 
4.     <masterConnector remoteURI= "tcp://localhost:62001" userName="user"
password="password"/> 
5.   </services> 
6. </broker> 

   需要注意的是,笔者认为ActiveMQ5.0版本的Pure Master Slave仍然不够稳定。

3.2 Shared File System Master Slave
    如果你使用SAN或者共享文件系统,那么你可以使用Shared File System Master Slave。基本上,你可以运行多个broker,这些broker共享数据目录。当第一个broker得到文件上的排他锁之后,其它的broker便会在循环中等待获得这把锁。客户端使用failover transport来连接到可用的broker。当master broker失效的时候会释放这把锁,这时候其中一个slave broker会得到这把锁从而成为master broker。 以下是ActiveMQ配置的一个例子:
Xml代码 
1. <broker useJmx="false"  xmlns="http://activemq.org/config/1.0"> 
2.    <persistenceAdapter> 
3.       <journaledJDBC dataDirectory="/sharedFileSystem/broker"/> 
4.    </persistenceAdapter> 
5.    … 
6. </broker> 


3.3 JDBC Master Slave
    JDBC Master Slave的工作原理跟Shared File System Master Slave类似,只是采用了数据库作为持久化存储。以下是ActiveMQ配置的一个例子:
Xml代码
1. <beans> 
2. <broker xmlns="http://activemq.org/config/1.0" brokerName="JdbcMasterBroker">
3.     ... 
4.     <persistenceAdapter> 
5.       <jdbcPersistenceAdapter dataSource="#mysql-ds"/> 
6.     </persistenceAdapter> 
8.   </broker> 
10.   <bean id="mysql-ds" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"> 
11.     <property name="driverClassName" value="com.mysql.jdbc.Driver"/> 
12. <property name="url" value="jdbc:mysql://localhost:3306/test?relaxAutoCommit=true"/>
13.     <property name="username" value="username"/> 
14.     <property name="password" value="passward"/> 
15.     <property name="poolPreparedStatements" value="true"/> 
16.   </bean>  
17. </beans> 


   需要注意的是,如果你使用MySQL数据库,需要首先执行以下三条语句:(Apache官方文档说,此bug已经被修正,预定在5.1.0版本上体现)
Sql代码 
1. ALTER TABLE activemq_acks ENGINE = InnoDB; 
2. ALTER TABLE activemq_lock ENGINE = InnoDB; 
3. ALTER TABLE activemq_msgs ENGINE = InnoDB;
分享到:
评论

相关推荐

    window系统搭建activeMQ集群和操作步骤

    下面将详细介绍如何在Windows环境下配置ActiveMQ集群及其操作步骤。 1. **ActiveMQ集群概念** - **集群**:ActiveMQ集群是多个ActiveMQ服务器实例的集合,它们共享消息负载,提高系统的可用性和可靠性。当一个节点...

    activeMQ集群的使用与配置[收集].pdf

    ActiveMQ集群的使用与配置 ActiveMQ集群支持多种不同的方面,包括Queue consumer clusters、Broker clusters和Network of brokers等。 Queue Consumer Clusters ActiveMQ支持订阅同一个queue的consumers上的集群...

    activeMQ集群的使用与配置[归类].pdf

    ActiveMQ集群的配置和使用是软件开发中涉及消息中间件管理的重要部分,特别是在构建高可用性和可扩展性系统时。ActiveMQ作为一个强大的开源消息代理,提供了多种集群解决方案以确保服务的连续性和性能优化。 首先,...

    RabbitMQ集群-ActiveMQ集群集合

    1. 集群配置:ActiveMQ集群可以通过网络连接多台服务器,共享队列和主题,提供高可用性和负载均衡。 2. 高可用性:通过设置集群中的代理节点,实现消息的复制,确保即使部分节点失败,也不会丢失消息。 3. 负载...

    activemq+zk集群配置

    现在我们来详细探讨如何配置ZooKeeper集群和ActiveMQ集群。 首先,我们要理解ZooKeeper集群的基本概念。ZooKeeper集群由多个节点(称为ZooKeeper服务器)组成,每个节点都存储和处理一部分数据。为了保证高可用性,...

    基于zookeeper+levelDB的ActiveMQ集群测试代码

    这种集群配置提供了高可用性和数据持久性,确保即使在部分节点故障的情况下,消息队列也能正常运行。同时,LevelDB的使用保证了数据的快速存取,提升了整体系统的性能。在实际应用中,这样的集群架构可以适应大规模...

    activemq集群配置文档

    ### ActiveMQ 集群配置详解 #### 一、引言 随着业务需求的增长和技术的发展,消息中间件作为系统架构中的重要组成部分,在保障系统稳定性和提高应用性能方面扮演着关键角色。ActiveMQ 作为一种高性能的消息中间件...

    基于kahadb的activemq高可用集群部署配置示例

    综上所述,基于KahaDB的ActiveMQ高可用集群部署涉及多方面的配置,包括网络连接器、持久化存储、虚拟主题等。正确设置这些参数,可以确保在单个broker故障时,整个消息传递服务仍能保持运行,从而提供高可用性。

    ActiveMQ集群

    ActiveMQ集群是为了解决大规模消息处理和提升系统高可用性而设计的一种部署模式。它允许通过连接多个独立的Broker实例,将它们作为一个整体对外提供服务,从而增强消息处理能力。这种模式使得集群中的各个Broker能够...

    activemq集群配置文档.docx

    activemq集群配置文档 基于Zookeeper和ActiveMQ的集群配置文档旨在实现高可用的消息队列系统。该文档将详细介绍如何使用Zookeeper实现Master-Slave模式来实现高可用性,并提供具体的部署方案和配置步骤。 一、 ...

    activeMQ集群的使用与配置.pdf

    在集群配置中,ActiveMQ 提供了两种主要的集群模式:Queue Consumer Clusters 和 Broker Clusters,这两种模式旨在提高系统的可靠性和性能。 1. **Queue Consumer Clusters** 在 Queue Consumer Clusters 中,多个...

    2019实战ActiveMQ集群与应用实战视频教程

    本视频教程通过实战的方式介绍了 ActiveMQ 的集群搭建与应用,涵盖了从基础概念到实际部署的全过程。通过学习这些知识点,不仅可以帮助开发者深入了解 ActiveMQ 的工作原理,还能够掌握如何在实际项目中有效地利用 ...

    activemq 集群配置文档

    ### ActiveMQ集群配置详解 #### 一、ActiveMQ与JMS规范基础 在深入了解ActiveMQ集群配置之前,我们首先简要回顾一下Java消息服务(Java Message Service, JMS)的基础概念,这对于理解ActiveMQ的工作原理及其集群...

    ActiveMQ集群安装和部署

    #### 三、ActiveMQ集群配置 为了实现ActiveMQ集群,需要在两台服务器上分别配置Master和Slave。具体步骤如下: **1. Master配置** - **配置Master**: 找到`C:\ActiveMQ\conf`目录下的`activemq.xml`配置文件,...

    linux环境下ActiveMQ持久化、集群环境搭建详解

    可以使用 Apache ActiveMQ 的集群模式,例如使用 Master-Slave 模式或 Replicated LevelDB 模式。 总结 搭建 ActiveMQ 持久化和集群环境需要对 Linux 操作系统、Java 环境、ActiveMQ 等方面有深入的了解。需要安装...

    配置ActiveMQ 静态集群

    在IT领域,消息队列(Message Queue)是分布式系统中常用的一种组件,它负责处理应用程序之间的...注意,实际操作中可能还需要考虑网络环境、安全性、性能调优等方面的问题,但以上内容已涵盖了基本的集群配置流程。

    activemq spring 客户端配置

    描述中提到的“activemq服务器使用的zookeeper replicable 的方式进行负载均衡以及容灾”,意味着ActiveMQ集群采用了ZooKeeper进行协调,以实现复制和高可用性。ZooKeeper是一个分布式的、开放源码的协调服务,它为...

Global site tag (gtag.js) - Google Analytics