[转载]关于ActiveMQ集群
转载于 http://blog.csdn.net/nimmy/article/details/6247289
近日因工作关系,在研究JMS,使用ActiveMQ作为提供者,考虑到消息的重要,拟采用ActiveMQ的集群,网上查询,资料很少,且语焉不详,最后还是看Apache提供的官方文档(俺E文不好,楞是拿金山词霸一个一个单词的看,累啊),终于做出来了,于是形诸于文,以供有需要的朋友参考
本文阐述了使用 Pure Master Slave 方式 以及 JDBC Master Slave 方式s解决单点故障的问题
关于ActiveMQ集群
1 前提
- 下载jdk6(update24),解压,安装,下面用 $java_dir$ 表示JDK主目录
- 下载ActiveMQ5.4.2,解压,下面用 $activemq_dir$ 表示activeMQ主目录
- 下载AapcehANT1.8,解压,下面用 $ant_dir$ 表示ANT主目录
- 配置好环境变量
1) Java_home : 指向 $java_dir$
2) Ant_home :指向 $ant_dir$
3) Path : 应包含 %java_home%/bin
- 将MySQL驱动包放置到 $activemq_home$/lib 下(本例用到MySQL数据源)
- Master:给broker取个名字,修改其持久化KAHADB文件
- Slave:给broker取个名字,修改其持久化KAHADB文件,需要配置Master的地址和端口
- 一个Master只能带一个Slave
- Master工作期间,会将消息状况自动同步到Slave
- Master一旦崩溃,Slave自动接替其工作,已发送并尚未消费的消息继续有效
- Slave接手后,必须停止Slave才能重启先前的Master
- Master:首先复制 $activemq_dir$/conf/activemq.xml,并改名为:pure_master.xml,修改文件
2 解决单点故障:Pure Master Slave
2.1 概述
2.2 MQ配置(这里是一台机器配置)
1) <broker brokerName="pure_master" …
2) <kahaDB directory="${activemq.base}/data/kahadb_pure_master "/>
3) <transportConnector name="openwire" uri="tcp://0.0.0.0:61616"/>
- Slave:首先复制 $activemq_dir$/conf/activemq.xml,并改名为:pure_slave.xml,修改文件
1) <broker brokerName="pure_slave" masterConnectorURI="tcp://0.0.0.0:61616"
shutdownOnMasterFailure="false" …
2) <kahaDB directory="${activemq.base}/data/kahadb_pure_slave "/>
3) <transportConnector name="openwire" uri="tcp://0.0.0.0:61617"/>
- 首先启动Master,启动完毕后在另一个Shell启动Slave,Slave启动后,可以看到Master那个Shell中显示已经Attach上了Slave
1) 启动Master:$activemq_dir$/bin>activemq xbean:file:../conf/pure_master.xml
2) 启动Slave:$activemq_dir$/bin>activemq xbean:file:../conf/pure_slave.xml
2.3 JAVA测试:队列
- 生产者
public static void main(String[] args) throws Exception {
ConnectionFactory cf = new ActiveMQConnectionFactory("failover:(tcp://0.0.0.0:61616,tcp://0.0.0.0:61617)");
Connection conn = cf.createConnection();
conn.start();
Session sess = conn.createSession(false, Session.AUTO_ACKNOWLEDGE);
Queue qq = new ActiveMQQueue("qq1");
MessageProducer prod = sess.createProducer(qq);
Message msg = null;
Scanner scan = new Scanner(System.in);
String str = scan.next();
while(true) {
msg = sess.createTextMessage(str);
prod.send(msg);
if(str.equals("exit")) {
break;
}
str = scan.next();
}
conn.close();
}
- 消费者
public static void main(String[] args) throws Exception {
ConnectionFactory cf = new ActiveMQConnectionFactory("failover:( tcp://0.0.0.0:61616,tcp://0.0.0.0:61617)");
Connection conn = cf.createConnection();
conn.start();
Session sess = conn.createSession(false, Session.AUTO_ACKNOWLEDGE);
Queue qq = new ActiveMQQueue("qq1");
MessageConsumer cs = sess.createConsumer(qq);
TextMessage msg = (TextMessage)cs.receive();
String str = msg.getText();
while(true) {
System.out.println("receive msg:/t"+msg.getText());
if(str.equals("exit")) {
break;
}
msg = (TextMessage)cs.receive();
str = msg.getText();
}
conn.close();
}
2.4 测试步骤
- 启动生产者,发送几条消息
- 启动消费者,可看到接收到的消息
- 关闭消费者
- 生产者继续发送几条消息—消息A
- 停止Master(可看到生产者端显示连接到Slave(tcp://0.0.0.0:61617)了)
- 生产者继续发送几条消息—消息B
- 启动消费者
- 消费者接收了消息A和消息B,可见Slave接替了Master的工作,而且储存了之前生产者经过Master发送的消息
2.5 结论
Pure Master Slave模式实现方式简单,可以实现消息的双机热备功能;队列可以实现消息的异步和点对点发送
3 解决单点故障:JDBC Master Slave
3.1 概述
- 配置上,不存在Master和Slave,所有Broder的配置基本是一样的
- 多个共享数据源的Broker构成JDBC Master Slave
- 给每个Broker取个名字
- 首先抢到资源(数据库锁)的Broker成为Masetr
- 其他Broker保持预备状态,定期尝试抢占资源,运行其的Shell中清楚的显示了这一点
- 一旦Master崩溃,其他Broker尝试抢占资源,最终只有一台抢到,它立刻成为Master
- 之前的Master即使重启成功,也只能作为Slave等待
- 将 $activemq_dir$/conf/activemq.xml 复制3份,分别改名为:jdbc_broker01.xml、jdbc_broker02.xml、jdbc_broker03.xml
- 首先修改jdbc_broker01.xml
3.2 MQ配置(这里是一台机器配置)
1) <broker brokerName=" jdbc_broker01" …
2) <!--配置持久适配器-->
<persistenceAdapter>
<jdbcPersistenceAdapter dataDirectory="${activemq.base}/data" dataSource="#mysql-ds"/>
</persistenceAdapter>
3) <transportConnector name="openwire" uri="tcp://0.0.0.0:61616"/>
4) <!--配置数据源:注意是在broker标记之外-->
…
</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/test?relaxAutoCommit=true"/>
<property name="username" value="root"/>
<property name="password" value="root"/>
<property name="maxActive" value="200"/>
<property name="poolPreparedStatements" value="true"/>
</bean>
- 同样修改 jdbc_broker02.xml ,与 jdbc_broker01.xml 不同之处
1) <broker brokerName=" jdbc_broker02" …
2) <transportConnector name="openwire" uri="tcp://0.0.0.0:61617"/>
- 同样修改 jdbc_broker03.xml ,与 jdbc_broker01.xml 不同之处
1) <broker brokerName=" jdbc_broker03" …
2) <transportConnector name="openwire" uri="tcp://0.0.0.0:61618"/>
3.3 JAVA测试:队列
- 代码基本和前面一致,只是因为这里有3个broker,所以创建连接工厂的代码稍有差别:
ConnectionFactory cf = new ActiveMQConnectionFactory("failover:(tcp://0.0.0.0:61616,tcp://0.0.0.0:61617,tcp://0.0.0.0:61618)");
3.4 测试步骤
- 先启动生产者,发送几条消息
- 启动消费者,可看到接收到的消息
- 关闭消费者
- 生产者继续发送几条消息-消息A
- 停止broker01(可看到生产者端显示连接到broker02(tcp://0.0.0.0:61617)了,同时运行broker02的Shell也显示其成为了Master)
- 生产者继续发送几条消息-消息B
- 启动消费者
- 消费者接收了消息A和消息B,可见broker02接替了broker01的工作,而且储存了之前生产者经过broker01发送的消息
- 关闭消费者
- 生产者继续发送几条消息-消息C
- 停止broker02(可看到生产者端显示连接到broker03(tcp://0.0.0.0:61618)了,同时运行broker03的Shell也显示其成为了Master)
- 生产者继续发送几条消息-消息D
- 启动消费者
- 消费者接收了消息C和消息D,可见broker03接替了broker02的工作,而且储存了之前生产者经过broker02发送的消息
- 再次启动broker01,生产者或消费者均未显示连接到broker01(tcp://0.0.0.0:61616),表明broker01此时只是个Slave
3.5 结论
JDBC Master Slave模式实现方式稍微复杂一点,可以实现消息的多点热备功能,Master、Slave的交替完全是即时的,自动的,无需重启任何broker;队列可以实现消息的异步和点对点发送
[转载]关于ActiveMQ集群的更多相关文章
- 使用jmeter对ActiveMQ集群性能方案进行评估--转载
原文地址:http://www.51testing.com/html/78/23978-143163.html 1.测试概要1.1 关于这篇文档中涉及的基于JMS的消息系统能为应用程序提供可靠的,高性 ...
- 分布式ActiveMQ集群--转载
原文地址:http://shensy.iteye.com/blog/1752529 回顾总结前一段时间学习的ActiveMQ分布式集群相关的知识,分享出来希望对看到的人有所帮助. 一.分布式Activ ...
- 基于zookeeper+leveldb搭建activemq集群--转载
原地址:http://www.open-open.com/lib/view/open1410569018211.html 自从activemq5.9.0开始,activemq的集群实现方式取消了传统的 ...
- ActiveMQ集群应用
ActiveMQ集群 ActiveMQ具有强大和灵活的集群功能,但在使用的过程中会发现很多的缺点,ActiveMQ的集群方式主要由两种:Master-Slave和Broker Cluster. 1.M ...
- 分布式ActiveMQ集群
分布式ActiveMQ集群的部署配置细节: 官方资料:http://activemq.apache.org/clustering.html 基本上看这个就足够了,本文就不具体分析配置文件了. 1.Qu ...
- ActiveMQ集群(2)
ActiveMQ具有强大和灵活的集群功能,但在使用的过程中会发现很多的缺点,ActiveMQ的集群方式主要有两种:Master-Slave和Broker Cluster. 1.Master-Slave ...
- 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 ...
随机推荐
- 简述vue中父子组件是怎样相互传递值的(基础向)
前言 首先,你需要知道vue中父组件和子组件分别指的是什么? 父组件:vue的根实例——用new Vue()构造函数创建的vue实例(实例会有一个挂载点,挂载点里的所有内容可理解为父组件的内容) ...
- Python Day_2
入门任何一门编程语言,前面总是离不开变量,字符串这些概念,而且这些东西在往后的日子里,有着至关重要的存在.因为不管我们写什么程序,都要用到变量以及字符串. 变量 首先,我们的变量在定义的时候,是不需要 ...
- 走近Java之包装器类Integer
前几天,有个同事问了我一个关于Integer类赋值的问题,很有意思,我们一起来看一下(如果有说的不正确的地方,欢迎大家指正). 如上图,同样是赋值,但是两次比较的结果完全不同.我们走近了解一下. 在I ...
- 使用wincc C脚本查找窗口句柄的方法
关于窗口句柄的用法,网上可以搜到很多相关的文章,本文以windows API接口函数为例,简单介绍一下基本使用,主要包括找到此窗体,在找到的窗体写入数据,对窗体进行关闭,最大化,最小化的操作: 1.利 ...
- C语言指针专题——指针怎么就很灵活?
最近在研读 C Primer pkus(第五版)中文版,老外写的还是很经典的,推荐给朋友们,购买地址:C primer plus 5版中文版购买 另外再推荐两本书: 1. 2017年9月全国计算机二级 ...
- android_layout_framelayout
framelayout最大的特点,个人认为就是N个元素都会重叠地堆在左上角,除非你手动指定位置.相对布局relative也是如此,但是他妈的人家不可以指定布局的垂直与水平,frame可以,但是指定垂直 ...
- python函数知识三 函数名的使用、格式化、递归
12.函数名的使用 函数是第一类对象 函数名可以当做值被赋值给变量 def func(): print(1) return a = func print(func) print(a) a() 函数名可 ...
- vijos P1911 珠心算测验
#include<iostream> using namespace std; int main() { int n; int sum = 0; int num[200]; cin > ...
- [leetcode] 105. Construct Binary Tree from Preorder and Inorder Traversal (Medium)
原题 题意: 根据先序和中序得到二叉树(假设无重复数字) 思路: 先手写一次转换过程,得到思路. 即从先序中遍历每个元素,(创建一个全局索引,指向当前遍历到的元素)在中序中找到该元素作为当前的root ...
- HTML介绍和标签
1.HTML介绍 1.概述 html不是一种编程语言,是一种描述性的标记语言,用于描述超文本内容的显示方式.比如字体,颜色,大小等. 超文本:音频,视频,图片称为超文本. 标记:<英文单词或者字 ...