(3) ActiveMQ -- Cluster
来源:互联网 发布:linux软件 编辑:程序博客网 时间:2024/04/29 02:49
- ActiveMQ cluster (ActiveMQ有强大而灵活的集群功能)
ActiveMQ 可以做Broker的集群,也可以做master-slave方式的集群。
- Broker cluster
Broker的集群能在多个broker之前fail-over和load-balance, 但是在某个节点出故障时,可能导致消息丢失。broker cluser的方式,在一个broker上发送的消息可以在其它的broker上收到。当一个broker失效时,客户端可以自动的转到别的broker 上运行,多个broker可以同时提供服务,但是消息只存储在一个broker上,如果那个broker失效了,那么客户端直到它重新启动后才能收到该 broker上的消息,假如很不幸,那个broker的存储介质坏了,那么消息就丢失掉了。
- Master--Slave
Master-slave能实时备份消息,和fail-over,但是不能load-balance。意思就是说只有当前的Master提供服务,slave不提供服务,所以不能实现负载均衡。Slave实时的进行备份master的数据,所以消息不会丢失。(之前看到有个人问slave的queue一直是空的,这是Master-slave的特点。)
多种Master--Slave模式
master-slave也有多种实现方式。它们的不同只是在共享数据和锁机制上。
(1)Pure master-slave
Pure master-slave,显示的在配置文件中指定一个broker做为另一个broker的slave。运行时,slave同过网络自动从master 出复制数据,同时在和master失去连接时自动升级为master。当master失效,slave成为master后,如果要让原先的master重 新投入运行,需要停掉运行中的slave(现在升级为master了),手动复制slave中的数据到master中。再重新启动master和 slave。这种方式最简单,效率也不错,但是只能有两台做集群,只能fail-over一次,而且需要停机回复master-slave结构。
(2)JDBC master-slave这 种方式不需要特殊的配置,只要让所有的节点都把数据存储到同一个数据库中。先拿到数据库表的锁的节点成为master,一旦它失效了,其它的节点获得锁, 就可以成为master。因为数据通过数据库共享,放在一个地方,不需要停机恢复master-slave。这种方式,需要额外的数据库服务器,如果数据 库失效了,那么就全失效了,而且速度不是很快。
(3)Share file master-slave
这种方式类似于前者,也不需要特别的配置,只是通过共享文件系统来共享数据,靠文件锁实现只有一台成为master。
ActiveMQ 可以做Broker的集群,也可以做master-slave方式的集群。
- Broker cluster
Broker的集群能在多个broker之前fail-over和load-balance, 但是在某个节点出故障时,可能导致消息丢失。broker cluser的方式,在一个broker上发送的消息可以在其它的broker上收到。当一个broker失效时,客户端可以自动的转到别的broker 上运行,多个broker可以同时提供服务,但是消息只存储在一个broker上,如果那个broker失效了,那么客户端直到它重新启动后才能收到该 broker上的消息,假如很不幸,那个broker的存储介质坏了,那么消息就丢失掉了。
- Master--Slave
Master-slave能实时备份消息,和fail-over,但是不能load-balance。意思就是说只有当前的Master提供服务,slave不提供服务,所以不能实现负载均衡。Slave实时的进行备份master的数据,所以消息不会丢失。(之前看到有个人问slave的queue一直是空的,这是Master-slave的特点。)
多种Master--Slave模式
master-slave也有多种实现方式。它们的不同只是在共享数据和锁机制上。
(1)Pure master-slave
Pure master-slave,显示的在配置文件中指定一个broker做为另一个broker的slave。运行时,slave同过网络自动从master 出复制数据,同时在和master失去连接时自动升级为master。当master失效,slave成为master后,如果要让原先的master重 新投入运行,需要停掉运行中的slave(现在升级为master了),手动复制slave中的数据到master中。再重新启动master和 slave。这种方式最简单,效率也不错,但是只能有两台做集群,只能fail-over一次,而且需要停机回复master-slave结构。
(2)JDBC master-slave这 种方式不需要特殊的配置,只要让所有的节点都把数据存储到同一个数据库中。先拿到数据库表的锁的节点成为master,一旦它失效了,其它的节点获得锁, 就可以成为master。因为数据通过数据库共享,放在一个地方,不需要停机恢复master-slave。这种方式,需要额外的数据库服务器,如果数据 库失效了,那么就全失效了,而且速度不是很快。
(3)Share file master-slave
这种方式类似于前者,也不需要特别的配置,只是通过共享文件系统来共享数据,靠文件锁实现只有一台成为master。
Broker的集群能在多个broker之前fail-over和load-balance, 但是在某个节点出故障时,可能导致消息丢失。broker cluser的方式,在一个broker上发送的消息可以在其它的broker上收到。当一个broker失效时,客户端可以自动的转到别的broker 上运行,多个broker可以同时提供服务,但是消息只存储在一个broker上,如果那个broker失效了,那么客户端直到它重新启动后才能收到该 broker上的消息,假如很不幸,那个broker的存储介质坏了,那么消息就丢失掉了。
Master-slave能实时备份消息,和fail-over,但是不能load-balance。意思就是说只有当前的Master提供服务,slave不提供服务,所以不能实现负载均衡。Slave实时的进行备份master的数据,所以消息不会丢失。(之前看到有个人问slave的queue一直是空的,这是Master-slave的特点。)
多种Master--Slave模式
master-slave也有多种实现方式。它们的不同只是在共享数据和锁机制上。
(1)Pure master-slave
Pure master-slave,显示的在配置文件中指定一个broker做为另一个broker的slave。运行时,slave同过网络自动从master 出复制数据,同时在和master失去连接时自动升级为master。当master失效,slave成为master后,如果要让原先的master重 新投入运行,需要停掉运行中的slave(现在升级为master了),手动复制slave中的数据到master中。再重新启动master和 slave。这种方式最简单,效率也不错,但是只能有两台做集群,只能fail-over一次,而且需要停机回复master-slave结构。
(2)JDBC master-slave这 种方式不需要特殊的配置,只要让所有的节点都把数据存储到同一个数据库中。先拿到数据库表的锁的节点成为master,一旦它失效了,其它的节点获得锁, 就可以成为master。因为数据通过数据库共享,放在一个地方,不需要停机恢复master-slave。这种方式,需要额外的数据库服务器,如果数据 库失效了,那么就全失效了,而且速度不是很快。
(3)Share file master-slave
这种方式类似于前者,也不需要特别的配置,只是通过共享文件系统来共享数据,靠文件锁实现只有一台成为master。
2. Pure master--slave的配置
- Master
修改$activemq_dir$/conf/activemq.xml
1) <broker brokerName="pure_master" …
2) <kahaDB directory="${activemq.base}/data/kahadb_pure_master "/>
3) <transportConnector name="openwire" uri="tcp://MasterIP:61616"/>
- Slave
修改 $activemq_dir$/conf/activemq.xml1) <broker brokerName="pure_slave" masterConnectorURI="tcp://MasterIP:61616"
shutdownOnMasterFailure="false" …
2) <kahaDB directory="${activemq.base}/data/kahadb_pure_slave "/>
3) <transportConnector name="openwire" uri="tcp://SlaveIP:61617"/>
- Start
启动Master:$activemq_dir$/bin>./activemq start
启动Slave: $activemq_dir$/bin>./activemq start
从图中的log我们可以看到master-slave模式已经成功启动了。
3. Pure master--slave的code
修改$activemq_dir$/conf/activemq.xml
1) <broker brokerName="pure_master" …
2) <kahaDB directory="${activemq.base}/data/kahadb_pure_master "/>
3) <transportConnector name="openwire" uri="tcp://MasterIP:61616"/>
修改 $activemq_dir$/conf/activemq.xml
1) <broker brokerName="pure_slave" masterConnectorURI="tcp://MasterIP:61616"
shutdownOnMasterFailure="false" …
2) <kahaDB directory="${activemq.base}/data/kahadb_pure_slave "/>
3) <transportConnector name="openwire" uri="tcp://SlaveIP:61617"/>
启动Master:$activemq_dir$/bin>./activemq start
启动Slave: $activemq_dir$/bin>./activemq start
- receiver
package com.chbai.cluster;import javax.jms.Connection;import javax.jms.ConnectionFactory;import javax.jms.JMSException;import javax.jms.MessageConsumer;import javax.jms.Queue;import javax.jms.Session;import javax.jms.TextMessage;import org.apache.activemq.ActiveMQConnectionFactory;import org.apache.activemq.command.ActiveMQQueue;public class receiver {/** * @param args */public static void main(String[] args) {ConnectionFactory cf = new ActiveMQConnectionFactory("failover:(tcp://MasterIP:61616,tcp://SlaveIP:61617)"); Connection conn;try {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: "+msg.getText()); if(str.equals("exit")) { break; } msg = (TextMessage)cs.receive(); str = msg.getText(); } conn.close();} catch (JMSException e) {e.printStackTrace();} }}
- Sender
package com.chbai.cluster;import java.util.Scanner;import javax.jms.Connection;import javax.jms.ConnectionFactory;import javax.jms.JMSException;import javax.jms.Message;import javax.jms.MessageProducer;import javax.jms.Queue;import javax.jms.Session;import org.apache.activemq.ActiveMQConnectionFactory;import org.apache.activemq.command.ActiveMQQueue;public class Sender {/** * @param args */public static void main(String[] args) { ConnectionFactory cf = new ActiveMQConnectionFactory("failover:(tcp://MasterIP:61616,tcp://SlaveIP:61617)"); Connection conn = null;try {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();} catch (JMSException e) {e.printStackTrace();}}}
package com.chbai.cluster;import javax.jms.Connection;import javax.jms.ConnectionFactory;import javax.jms.JMSException;import javax.jms.MessageConsumer;import javax.jms.Queue;import javax.jms.Session;import javax.jms.TextMessage;import org.apache.activemq.ActiveMQConnectionFactory;import org.apache.activemq.command.ActiveMQQueue;public class receiver {/** * @param args */public static void main(String[] args) {ConnectionFactory cf = new ActiveMQConnectionFactory("failover:(tcp://MasterIP:61616,tcp://SlaveIP:61617)"); Connection conn;try {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: "+msg.getText()); if(str.equals("exit")) { break; } msg = (TextMessage)cs.receive(); str = msg.getText(); } conn.close();} catch (JMSException e) {e.printStackTrace();} }}
package com.chbai.cluster;import java.util.Scanner;import javax.jms.Connection;import javax.jms.ConnectionFactory;import javax.jms.JMSException;import javax.jms.Message;import javax.jms.MessageProducer;import javax.jms.Queue;import javax.jms.Session;import org.apache.activemq.ActiveMQConnectionFactory;import org.apache.activemq.command.ActiveMQQueue;public class Sender {/** * @param args */public static void main(String[] args) { ConnectionFactory cf = new ActiveMQConnectionFactory("failover:(tcp://MasterIP:61616,tcp://SlaveIP:61617)"); Connection conn = null;try {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();} catch (JMSException e) {e.printStackTrace();}}}
- (3) ActiveMQ -- Cluster
- activemq cluster
- activemq dynamic broker cluster
- activemq cluster masterslave 配置
- ActiveMQ笔记(4):搭建Broker集群(cluster)
- activemq--MASTER SLAVE+BROKER CLUSTER 实践(一)
- activemq--MASTER SLAVE+BROKER CLUSTER 实践(二)
- Apache ActiveMQ Cluster Master and Slave with JDBC
- ActiveMQ(6)-基于networkConnector的Broker-Cluster方案
- ActiveMQ (3)
- ActiveMQ 3
- freeNAS ISCSI+Cluster(3)
- redis 3 cluster 安装
- cluster
- Cluster
- cluster
- Cluster
- Cluster
- 代码复审
- 写日志的功能
- poj 1364 King
- 2012-08-30 下午随想
- Architects Must Be Hands On written by John Davie
- (3) ActiveMQ -- Cluster
- linux下gcc默认搜索头文件及库文件的路径
- C# 实现的多线程异步Socket数据包接收器框架(2)
- 深入理解Zend SAPIs(Zend SAPI Internals)
- C语言代码优化规范及常见错误举例
- 使用用例捕获需求
- zh-cn en-uk表示语言(文化)代码与国家地区对照表
- 上网如何赚钱
- 11g R2 RAC 环境下开启归档模式的方法