(3) ActiveMQ -- Cluster

  1. 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。

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


  • Start
       启动Master$activemq_dir$/bin>./activemq start

        启动Slave:   $activemq_dir$/bin>./activemq start

        从图中的log我们可以看到master-slave模式已经成功启动了。

    3.  Pure master--slave的code

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


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值