activemq mysql 集群配置_ActiveMQ集群

关于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)        

2)        

3)        

Slave:首先复制 $activemq_dir$/conf/activemq.xml,并改名为:pure_slave.xml,修改文件

1)        

shutdownOnMasterFailure="false" …

2)        

3)        

首先启动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)        

2)        

dataSource="#mysql-ds"/>

3)        

4)        

destroy-method="close">

value="jdbc:mysql://localhost/test?relaxAutoCommit=true"/>

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

1)        

2)        

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

1)        

2)        

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;队列可以实现消息的异步和点对点发送

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值