ActiveMQ 的负载均衡集群加高可用方案

环境 linux 系统 ,而我本人用的是CentOS-7 ,运行所需的环境是java  所以需要安装jdk , 安装过程可以看我的这个博客

我采用的方案是: 三台ActiveMQ 服务器 这可以到达既可集群又可高可用,架构是这样
ActiveMQ 的负载均衡集群加高可用方案_第1张图片
node  A 和 node B ,node A 和 node C 他们之间形成一个 Broker 这样信息同步 ,实现了负载均衡 ,如果 B挂了 C和A 还可以继续

服务  ,信息也不会丢失。如果B 挂了 这时C 就成为一个master, 这是高可用就发挥了  ,再假如 A挂了 ,此时B还能继续服务 所以这时就要马上处理A节点  ,这样就能保证我们的消息队列里面所有的数据不丢失和服务可持续性。


首先下载 ActiveMQ 命令:

wget https://mirrors.tuna.tsinghua.edu.cn/apache//activemq/5.15.4/apache-activemq-5.15.4-bin.tar.gz

下载之后解压    命令

 tar -zvxf apache-activemq-5.15.4-bin.tar.gz

而我三台ActiveMQ 服务器目前是放在同一台linux虚拟机 最好是三台分开不同机器 不然 如果linux 机器挂了就完了 。

解压之后,复制三分ActiveMQ 成三个节点 命名为 activemq_a ,activemq_b, activemq_c

activemq_a 页面访问端口是 8161,服务端口61616

activemq_b 页面访问端口是 8162,服务端口61617

activemq_c 页面访问端口是 8163,服务端口61618  

然后在创建一个文件存放持久化的数据 命令:

 mkdir  shareFile

然后修改对应配置文件

①修改node a 的配置文件 :

vim activemq_a/conf/activemq.xml

打开编辑添加如下 代码  代码是放在这个 transportConnectors标签前后位置 

  
            
  

然后保全退回 

这是我的配置

node A 配好了 

接下来是 node B

vim activemq_b/conf/activemq.xml

打开编辑添加如下 代码  修改持久化数据存放的地方

 
            
 

修改服务端口号

  

代码是放在这个 transportConnectors标签前后位置 

  
            
  

然后保全退回 

在打开 jetty.xml 修改管理页面的端口 命令:

vim activemq_b/conf/jetty.xml
 
             
        
         
 

然后保全退回 

node B 就可以了


接下来 配置node C 配置地方差不多  


              
 


            

然后保全退出

然后再修改jetty.xml

 
             
        
         
 

然后保全退出

这样所有的节点就可以了 

接下来是启动所有服务 

命令:

./activemq_a/bin/activemq start  启动A

./activemq_b/bin/activemq start  启动B

./activemq_c/bin/activemq start  启动C

然后可以自己查看一下端口情况。

接下下就是在页面访问了  

http://10.0.0.190:8161/admin/

http://10.0.0.190:8162/admin/

http://10.0.0.190:8163/admin/

这时会发现 C 服务是访问不到 那时因为他是一个Slave 是不提服务的 他是等待B点挂了 他是自己启动服务的

接下是 代码的实现

public class ConnectionUtil {

    public static Connection getConnection(String url) throws JMSException {
        ConnectionFactory factory=new ActiveMQConnectionFactory(url);
        Connection connection = factory.createConnection();
        connection.start();
        return connection;

    }
}
 
  
public class Producer {


    private static final   String QUEUENAME ="test-queue";
    private static final   String URL ="tcp://10.0.0.190:61616";
    ///失效转移 生产者为高可用
    private static final   String FAILOVERURL ="failover:(tcp://10.0.0.190:61617,tcp://10.0.0.190:61618)?randomize=true";
   //队列模式
    public void send() throws JMSException {
        Connection connection = ConnectionUtil.getConnection(FAILOVERURL);
        Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
        Queue queue = session.createQueue(QUEUENAME);
        MessageProducer producer = session.createProducer(queue);
        TextMessage textMessage=null;
        for (int i = 0; i < 100; i++) {
            textMessage = session.createTextMessage("测试数据:" + i);
            producer.send(textMessage);
        }

        producer.close();
        session.close();
        connection.close();

    }}
 public static void main(String[] args) throws JMSException {
        new Producer().send();
        System.out.println("发送完成");
    }
public class Consumer {
    private static final   String QUEUENAME ="test-queue";
    ///失效转移 负载均衡
    private static final   String FAILOVERURL ="failover:(tcp://10.0.0.190:61616,tcp://10.0.0.190:61617,tcp://10.0.0.190:61618)?randomize=true";
    public void msg() throws JMSException {
        Connection connection = ConnectionUtil.getConnection(FAILOVERURL);
        Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
        Queue queue = session.createQueue(QUEUENAME);
        MessageConsumer consumer = session.createConsumer(queue);
        consumer.setMessageListener(new MessageListener() {
            @Override
            public void onMessage(Message message) {
                TextMessage textMessage = (TextMessage)message;
                try {
                    System.out.println("这是接收到数据: =  "+textMessage.getText());
                } catch (JMSException e) {
                    e.printStackTrace();
                }
            }
        });
    }

 
  
 public static void main(String[] args) throws JMSException {
        new Consumer().msg();
    }

以上代码和配置完成 如有不对请多多指教 ,如有雷同都是在学习中的成长







你可能感兴趣的:(消息队列)