ActiveMQ集群(2)
ActiveMQ具有强大和灵活的集群功能,但在使用的过程中会发现很多的缺点,ActiveMQ的集群方式主要有两种:Master-Slave和Broker Cluster。
1、Master-Slave方式:
Master-Slave方式中,只能是Master提供服务,Slave是实时地备份Master的数据,以保证消息的可靠性。当Master失效时,Slave会自动升级为Master,客户端会自动连接到Slave上工作。
Master-Slave模式分为三类:
a、Pure Master Slave
b、Shared File System Master Slave
c、 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,代码如下:
<broker xmlns="http://activemq.apache.org/schema/core"
brokerName="pure_slave"
masterConnectorURI="tcp://0.0.0.0:61616"
shutdownOnMasterFailure="false" dataDirectory="${activemq.base}">
<!-- 同时修改Slave的服务端口,如下:-->
<transportConnectors>
<transportConnector name="openwire" uri="tcp://0.0.0.0:61617"/>
</transportConnectors>
</broker>
为了看到实践的效果,Master和Slave的消息持久化介质都是采用MySQL,并且Master和Slave分别连接不同的数据库。
在消息生产者应用和消息消费者应用的Spring配置文件中添加以下红色内容:
<property name="brokerURL" value="failover:(tcp://localhost:61616,tcp://localhost:61617)?initialReconnectDelay=100" />
这种方式只能两台机器做集群,可以起到很好的双机热备功能,但只能失效一次,只能停机恢复Master-Slave结构。
(2) Shared File System Master Slave
介绍: 这种方式是利用共享文件系统做ActiveMQ集群。kahaDB是ActiveMQ下默认的文件系统。
当一个AMQ实例获得了共享文件的锁,这个实例就成为了Master,其它实例即为Slave。如果这时Master挂了,其它AMQ实例会竞争共享文件的锁,获得锁的就成为Master,其它实例还是Slave。
部署时Slave没有限制数,而且自动切换Master不需要人工干预。
官方资料:http://activemq.apache.org/masterslave.html
Shared File System Master Slave模式如图所示:
本例子是在一台机器上运行三个ActiveMQ实例,需要对ActiveMQ的配置文件做一些简单的配置,就是把持久化适配器的存储目录改为本地磁盘的一个固定目录,三个实例共享这个目录,如下:
<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)添加数据源,让所有的数据源都指向同一个数据库即可。
这种方式的集群相对Shared File System Master Slave更加简单,更加容易地进行分布式部署,但是如果数据库失效,那么所有的ActiveMQ实例都将失效。
官方资料:http://activemq.apache.org/masterslave.html
配置概述:
A. 配置上,不存在Master和Slave,所有Broder的配置基本是一样的
B. 多个共享数据源的Broker构成JDBC Master Slave
C. 给每个Broker取一个名字
D. 首先抢到资源(数据库锁)的Broker成为Masetr
E. 其他Broker保持预备状态,定期尝试抢占资源,运行其的Shell中清楚的显示了这一点
F. 一旦Master崩溃,其他Broker尝试抢占资源,最终只有一台抢到,它立刻成为Master
G. 之前的Master即使重启成功,也只能作为Slave等待
配置步骤:
1. 修改持久化适配器为 MySQL:
<persistenceAdapter>
<jdbcPersistenceAdapter dataDirectory="activemq-data" dataSource="#mysql-ds"/>
</persistenceAdapter>
2. 在activemq.xml 添加如下代码:
<!--配置数据源:注意是配在broker标记之外-->
<bean id="mysql-ds" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
<property name="driverClassName" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/mq?relaxAutoCommit=true"/>
<property name="username" value="root"/>
<property name="password" value="123456"/>
<property name="maxActive" value="200"/>
<property name="poolPreparedStatements" value="true"/>
</bean>
3. 修改每个broker的tcp端口。否则,该端口被占用时会报错。
Eg: <transportConnector name="openwire" uri="tcp://0.0.0.0:61616"/>
<transportConnector name="openwire" uri="tcp://0.0.0.0:61617"/>
<transportConnector name="openwire" uri="tcp://0.0.0.0:61618"/>
4. 测试时,最好为每一个Broker都起一个独立的名字。
Eg: <broker brokerName="broker_01" … />
5. 在 ${ACTIVEMQ_HOME}/lib中添加 MysQL驱动jar包: mysql-connector-java-5.1.7-bin.jar
详情参见资料: http://blog.csdn.net/jiangxuchen/article/details/8004612
客户端连接服务端代码:
ConnectionFactory cf = new ActiveMQConnectionFactory("failover:(tcp://0.0.0.0:61616, tcp://0.0.0.0:61617, tcp://0.0.0.0:61618)");
结论:
JDBC Master Slave模式实现方式稍微复杂一点,可以实现消息的多点热备功能,Master、Slave的交替完全是即时的,自动的,无需重启任何broker;队列可以实现消息的异步和点对点发送。
以上三种方式的集群都不支持负载均衡,但可以解决单点故障(某台broker坏掉)的问题,以保证消息服务的可靠性。
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。
配置:
A、生产者的broker不需要特殊的配置
B、修改每个broker的tcp端口
<transportConnector name="openwire" uri="tcp://0.0.0.0:61616"/>
<transportConnector name="openwire" uri="tcp://0.0.0.0:61617"/>
<transportConnector name="openwire" uri="tcp://0.0.0.0:61618"/>
C. 修改每个broker的名字
Eg: <broker brokerName="broker_01" … />
D. 所有的消费者的broker需要添加networkConnectors节点,用于连接到生产者的broker,如:
<networkConnectors>
<networkConnector uri="static:failover://(tcp://localhost:61616)" duplex="true" />
</networkConnectors>
注: 这段配置需要加在<persistenceAdapter>节点的前面。
E、最后,在消费者应用中设置brokerURL的值如:
<property name="brokerURL" value="failover:(tcp://localhost:61616)" />
Static Discovery集群方式有些缺点,如不能解决单点故障问题,若某个Broker失效时,有可能造成数据的丢失,动态添加节点不够智能化。
更加详细的说明与配置请参考:http://activemq.apache.org/networks-of-brokers.html
(2) Dynamic Discovery集群
Dynamic Discovery集群方式在配置broker时,不需要知道所有其它broker的URI地址,只需在所有实例的${ACTIVEMQ_HOME}/conf/activemq.xml文件中添加以下内容:
<networkConnectors>
<networkConnector uri="multicast://default" />
</networkConnectors>
同时在<transportConnectors>节点中添加以下红色部分内容:
<transportConnectors>
<transportConnector name="openwire" uri="tcp://0.0.0.0:61616" discoveryUri="multicast://default" />
</transportConnectors>
最后,注意修改每个broker的activemq.xml的broker名字和tcp端口号。这样就可以实现消息在所有ActiveMQ实例之间进行路由。Dynamic Discovery集群方式的缺点和Static Discovery一样。
从以上的分析可以看出,Master-Slave模式不支持负载均衡,但可以通过消息的实时备份或共享保证消息服务的可靠性,Broker Cluster模式支持负载均衡,可以提高消息的消费能力,但不能保证消息的可靠性。所以为了支持负载均衡,同时又保证消息的可靠性,我们可以采用Msater-Slave+Broker Cluster的模式。
ActiveMQ集群(2)的更多相关文章
- ActiveMQ集群应用
ActiveMQ集群 ActiveMQ具有强大和灵活的集群功能,但在使用的过程中会发现很多的缺点,ActiveMQ的集群方式主要由两种:Master-Slave和Broker Cluster. 1.M ...
- 使用jmeter对ActiveMQ集群性能方案进行评估--转载
原文地址:http://www.51testing.com/html/78/23978-143163.html 1.测试概要1.1 关于这篇文档中涉及的基于JMS的消息系统能为应用程序提供可靠的,高性 ...
- 分布式ActiveMQ集群
分布式ActiveMQ集群的部署配置细节: 官方资料:http://activemq.apache.org/clustering.html 基本上看这个就足够了,本文就不具体分析配置文件了. 1.Qu ...
- 分布式ActiveMQ集群--转载
原文地址:http://shensy.iteye.com/blog/1752529 回顾总结前一段时间学习的ActiveMQ分布式集群相关的知识,分享出来希望对看到的人有所帮助. 一.分布式Activ ...
- Azure上搭建ActiveMQ集群-基于ZooKeeper配置ActiveMQ高可用性集群
ActiveMQ从5.9.0版本开始,集群实现方式取消了传统的Master-Slave方式,增加了基于ZooKeeper+LevelDB的实现方式. 本文主要介绍了在Windows环境下配置基于Zoo ...
- ActiveMQ集群简单测试+eclipse Zookeeper 插件 + 负载均衡
ActiveMQ集群搭建好之后,接下来就该测试一下了. 一.先安装Zookeeper 的eclipse插件吧. 1. 打开 eclipse, Help -> Install New Softwa ...
- ActiveMQ集群
1.ActiveMQ集群介绍 1.为什么要集群? 实现高可用,以排除单点故障引起的服务中断 实现负载均衡,以提升效率为更多客户提供服务 2.集群方式 客户端集群:让多个消费者消费同一个队列 Broke ...
- ActiveMQ集群方案
集群方案主要为了解决系统架构中的两个关键问题:高可用和高性能.ActiveMQ服务的高可用性是指,在ActiveMQ服务性能不变.数据不丢失的前提下,确保当系统灾难出现时ActiveMQ能够持续提供消 ...
- 47.ActiveMQ集群
(声明:本文非EamonSec原创) 使用ZooKeeper实现的Master-Slave实现方式,是对ActiveMQ进行高可用的一种有效的解决方案,高可用的原理:使用ZooKeeper(集群)注册 ...
随机推荐
- Java从入门到精通——技巧篇之利用dom4j取出XML文件中的数据
在我们做项目的时候会经常用到XML文件用来配置系统,XML让系统更加的具有了灵活性,Java如何从XML中取出我们想要的数据呢?下面是我利用DOM4J来实现取出XML文件中的数据. XML文件 < ...
- MS MQ 消息队列
一.安装 先在 控制面板—程序和功能—打开或关闭我windows功能.把 msmq全勾起来 如下图: 二.右击-消息对列—属性—服务器安全性,把禁用未经身份验证的RPC调用勾去掉, 三.然后在专用队列 ...
- 谁是最好的Coder
谁是最好的Coder 时间限制:1000 ms | 内存限制:65535 KB 难度:0 描述 计科班有很多Coder,帅帅想知道自己是不是综合实力最强的coder. 帅帅喜欢帅,所以他选了帅 ...
- How to tune SharePoint 2010 Server for better performance?
http://social.technet.microsoft.com/wiki/contents/articles/7926.sharepoint-2010-tips-for-dealing-wit ...
- .NET4安装总进度一直不动的解决办法
在安装.NET4时遇到上面的进度在动,而安装进度一直停在0,解决办法: 禁止并关闭Window Update服务,重新运行安装程序. 关闭服务:控制面板->管理工具->服务->Win ...
- 1257: [CQOI2007]余数之和sum - BZOJ
Description 给出正整数n和k,计算j(n, k)=k mod 1 + k mod 2 + k mod 3 + … + k mod n的值,其中k mod i表示k除以i的余数.例如j(5, ...
- ubuntu 安装git
问题描述: ubuntu安装git 问题解决: (1)ubuntu下载git 注: 使用命令apt-get install git安装 (2)查看g ...
- [错误]试图加载格式不正确的程序。 (异常来自 HRESULT:0x8007000B)
错误原因: dll文件是在64位机下编译的,而服务器是32位机,所以无法调用 或者dll文件是在64位开发环境下下编译的,而现在的调用程序是的32位,所以无法调用 注意项目属性:
- cookie中转注入实战
随着网络安全技术的发展,SQL注入作为一种很流行的攻击方式被越来越多的人所知晓.很多网站也都对SQL注入做了防护,许多网站管理员的做法就是添加一个防注入程序.这时我们用常规的手段去探测网站的SQL注入 ...
- uva 10912
dp 记忆化搜索 #include <cstdio> #include <cstdlib> #include <cmath> #include <map> ...