转载于 http://blog.csdn.net/nimmy/article/details/6247289

近日因工作关系,在研究JMS,使用ActiveMQ作为提供者,考虑到消息的重要,拟采用ActiveMQ的集群,网上查询,资料很少,且语焉不详,最后还是看Apache提供的官方文档(俺E文不好,楞是拿金山词霸一个一个单词的看,累啊),终于做出来了,于是形诸于文,以供有需要的朋友参考

本文阐述了使用 Pure Master Slave 方式 以及 JDBC Master Slave 方式s解决单点故障的问题

关于ActiveMQ集群

1 前提

  1. 下载jdk6(update24),解压,安装,下面用 $java_dir$ 表示JDK主目录
  2. 下载ActiveMQ5.4.2,解压,下面用 $activemq_dir$ 表示activeMQ主目录
  3. 下载AapcehANT1.8,解压,下面用 $ant_dir$ 表示ANT主目录
  4. 配置好环境变量

1)         Java_home : 指向 $java_dir$

2)         Ant_home :指向 $ant_dir$

3)         Path : 应包含 %java_home%/bin

  1. 将MySQL驱动包放置到 $activemq_home$/lib 下(本例用到MySQL数据源)
  2. Master:给broker取个名字,修改其持久化KAHADB文件
  3. Slave:给broker取个名字,修改其持久化KAHADB文件,需要配置Master的地址和端口
  4. 一个Master只能带一个Slave
  5. Master工作期间,会将消息状况自动同步到Slave
  6. Master一旦崩溃,Slave自动接替其工作,已发送并尚未消费的消息继续有效
  7. Slave接手后,必须停止Slave才能重启先前的Master
  8. 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"/>

  1. 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"/>

  1. 首先启动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测试:队列

  1. 生产者

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();

}

  1. 消费者

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     测试步骤

  1. 启动生产者,发送几条消息
  2. 启动消费者,可看到接收到的消息
  3. 关闭消费者
  4. 生产者继续发送几条消息—消息A
  5. 停止Master(可看到生产者端显示连接到Slave(tcp://0.0.0.0:61617)了)
  6. 生产者继续发送几条消息—消息B
  7. 启动消费者
  8. 消费者接收了消息A和消息B,可见Slave接替了Master的工作,而且储存了之前生产者经过Master发送的消息

2.5     结论

Pure Master Slave模式实现方式简单,可以实现消息的双机热备功能;队列可以实现消息的异步和点对点发送

3         解决单点故障:JDBC Master Slave

3.1     概述

  1. 配置上,不存在Master和Slave,所有Broder的配置基本是一样的
  2. 多个共享数据源的Broker构成JDBC Master Slave
  3. 给每个Broker取个名字
  4. 首先抢到资源(数据库锁)的Broker成为Masetr
  5. 其他Broker保持预备状态,定期尝试抢占资源,运行其的Shell中清楚的显示了这一点
  6. 一旦Master崩溃,其他Broker尝试抢占资源,最终只有一台抢到,它立刻成为Master
  7. 之前的Master即使重启成功,也只能作为Slave等待
  8. 将 $activemq_dir$/conf/activemq.xml 复制3份,分别改名为:jdbc_broker01.xml、jdbc_broker02.xml、jdbc_broker03.xml
  9. 首先修改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>

  1. 同样修改 jdbc_broker02.xml ,与 jdbc_broker01.xml 不同之处

1)         <broker brokerName=" jdbc_broker02" …

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

  1. 同样修改 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测试:队列

  1. 代码基本和前面一致,只是因为这里有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     测试步骤

  1. 先启动生产者,发送几条消息
  2. 启动消费者,可看到接收到的消息
  3. 关闭消费者
  4. 生产者继续发送几条消息-消息A
  5. 停止broker01(可看到生产者端显示连接到broker02(tcp://0.0.0.0:61617)了,同时运行broker02的Shell也显示其成为了Master)
  6. 生产者继续发送几条消息-消息B
  7. 启动消费者
  8. 消费者接收了消息A和消息B,可见broker02接替了broker01的工作,而且储存了之前生产者经过broker01发送的消息
  9. 关闭消费者
  10. 生产者继续发送几条消息-消息C
  11. 停止broker02(可看到生产者端显示连接到broker03(tcp://0.0.0.0:61618)了,同时运行broker03的Shell也显示其成为了Master)
  12. 生产者继续发送几条消息-消息D
  13. 启动消费者
  14. 消费者接收了消息C和消息D,可见broker03接替了broker02的工作,而且储存了之前生产者经过broker02发送的消息
  15. 再次启动broker01,生产者或消费者均未显示连接到broker01(tcp://0.0.0.0:61616),表明broker01此时只是个Slave

3.5     结论

JDBC Master Slave模式实现方式稍微复杂一点,可以实现消息的多点热备功能,Master、Slave的交替完全是即时的,自动的,无需重启任何broker;队列可以实现消息的异步和点对点发送

[转载]关于ActiveMQ集群的更多相关文章

  1. 使用jmeter对ActiveMQ集群性能方案进行评估--转载

    原文地址:http://www.51testing.com/html/78/23978-143163.html 1.测试概要1.1 关于这篇文档中涉及的基于JMS的消息系统能为应用程序提供可靠的,高性 ...

  2. 分布式ActiveMQ集群--转载

    原文地址:http://shensy.iteye.com/blog/1752529 回顾总结前一段时间学习的ActiveMQ分布式集群相关的知识,分享出来希望对看到的人有所帮助. 一.分布式Activ ...

  3. 基于zookeeper+leveldb搭建activemq集群--转载

    原地址:http://www.open-open.com/lib/view/open1410569018211.html 自从activemq5.9.0开始,activemq的集群实现方式取消了传统的 ...

  4. ActiveMQ集群应用

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

  5. 分布式ActiveMQ集群

    分布式ActiveMQ集群的部署配置细节: 官方资料:http://activemq.apache.org/clustering.html 基本上看这个就足够了,本文就不具体分析配置文件了. 1.Qu ...

  6. ActiveMQ集群(2)

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

  7. Azure上搭建ActiveMQ集群-基于ZooKeeper配置ActiveMQ高可用性集群

    ActiveMQ从5.9.0版本开始,集群实现方式取消了传统的Master-Slave方式,增加了基于ZooKeeper+LevelDB的实现方式. 本文主要介绍了在Windows环境下配置基于Zoo ...

  8. ActiveMQ集群简单测试+eclipse Zookeeper 插件 + 负载均衡

    ActiveMQ集群搭建好之后,接下来就该测试一下了. 一.先安装Zookeeper 的eclipse插件吧. 1. 打开 eclipse, Help -> Install New Softwa ...

  9. ActiveMQ集群

    1.ActiveMQ集群介绍 1.为什么要集群? 实现高可用,以排除单点故障引起的服务中断 实现负载均衡,以提升效率为更多客户提供服务 2.集群方式 客户端集群:让多个消费者消费同一个队列 Broke ...

随机推荐

  1. navicat中查重并删除

    # 查询所有重复的数据 SELECT * FROM hao123 WHERE ir_url IN (SELECT ir_url FROM `hao123` GROUP BY ir_url having ...

  2. C语言学习书籍推荐《C语言入门经典(第5版)》下载

    霍尔顿 (Ivor Horton) (作者), 杨浩 (译者) 下载地址:点我 C语言是每一位程序员都应该掌握的基础语言.C语言是微软.NET编程中使用的C#语言的基础:C语言是iPhone.iPad ...

  3. Unity《ATD》塔防RPG类3D游戏架构设计(二)

    目录 <ATD> 游戏模型 <ATD> 游戏逻辑 <ATD> UI/HUD/特效/音乐 结语 前篇:Unity<ATD>塔防RPG类3D游戏架构设计(一 ...

  4. DAX 第二篇:计算上下文

    计算上下文是计算公式的环境,任何DAX表达式都是在上下文中求值的.行上下文和筛选上下文是DAX中仅有的上下文类型,把这两种上下文称为计算上下文.计算上下文用于限定公式计算的环境,当上下文变化时,相同的 ...

  5. 基于 HTML5 WebGL 的民航客机飞行监控系统

    前言 前些日子出差,在飞机上看到头顶的监控面板,除了播放电视剧和广告之外,还会时不时的切换到一个飞机航行的监控系统,不过整个监控系统让人感到有一点点的简陋,所以我就突发奇想制作了一个采用 HT for ...

  6. PHP正则匹配到2个字符串之间的内容,匹配HTML便签内容

    PHP正则匹配到2个字符串之间的内容 $preg= '/xue[\s\S]*?om/i'; preg_match_all($preg,"学并思网址xuebingsi.com",$r ...

  7. linux初学者-磁盘配额篇

    linux初学者-磁盘配额篇 在使用磁盘时,只要有权限,不管什么用户都可以在其中写入数据,但是如果是多人在一个磁盘中写入数据,就会出现争议,如果一个用户将磁盘空间用完,那么其他人无法再使用.如下图所示 ...

  8. npm常用命令(原创)

    1.对于我们下载下来的node包,假设该包存在依赖情况执行: npm install(或者npm i) 下载依赖包: 下载依赖成功过后,文件夹内会产生package-lock.json文件: 2.下载 ...

  9. SSD+HDD 安装ubuntu16.04+win7双系统

    本人电脑是联想天逸100  前段时间把光驱拆了加了一个128G的SSD 顺便把SSD装上了win7  机械硬盘500G放资料和一般软件之类的   后来想要用到ubuntu  就在官网下载ubuntu1 ...

  10. Linux升级GCC

    升级原因 测试需要使用DOClever,下载了最新的node8.11,运行node 时候报错 [root@app_test bin]# node www module.js:681 return pr ...