ActiveMQ集群模式
创始人
2024-05-01 16:23:37
0次

目录

一、面试题

二、多节点集群是什么

三、zookeeper+replicated-leveldb-store的主从集群

四、官网集群原理图

五、部署规划和步骤

六、集群可用性测试


一、面试题

引入消息队列之后该如何保证其高可用性

二、多节点集群是什么

基于ZooKeeper和LevelDB搭建ActiveMQ 集群集群仅提供主备方式的高可用集群功能,避免单点故障

三、zookeeper+replicated-leveldb-store的主从集群

官网:ActiveMQ (apache.org)

 两种集群方式

  1. 基于sharedFileSystem共享文件系统(KahaDB默认)
  2. 基于JDBC

四、官网集群原理图

五、部署规划和步骤

(一)环境和版本

CentOS 7 x86_64

JDK1.8

zookeeper-3.5.7

activemq-5.16.5

(二)关闭防火墙并保证win可以ping通过ActimveMq服务器

(三)要求具备ZK集群并可以成功启动

(四)集群部署规划列表

(五)创建3台集群目录

(六)修改管理控制台端口

1.mq_node01全部不动

2.mq_node02进入conf目录下得jetty.xml文件进行修改。port改为8162

3.mq_node03进入conf目录下得jetty.xml文件进行修改。port改为8163

 

这里修改port的同时可以将上面的host那一行注释掉,不然只允许本机访问,Windows打不开前台

将下面这一行注释掉或者将value改为主机ip 

(七)AcitveMQ集群配置

1.三个节点的brokername要全部一致

进入activemq.xml文件进行修改

brokername改为mqcluster 

2.3个节点的持久化配置

node1,2,3分别对应

bind:63631,63632,63633

zkAddress对应三台zookeeper集群所在的服务ip和zookeeper端口号(我这里zookeeper集群分布在三台虚拟机上)

 
(八)修改各节点的消息端口

node1,2,3分别对应

openwire的url对应61616,61617,61618 


(九)按顺序启动3个ActiveMQ节点到这步前提是zk集群已经成功启动运行

首先通过之前编写的zookeeper脚本启动位于3台虚拟机的zookeeper集群

编写一个启动和关闭脚本

  amq_batch.sh

#!/bin/shcd /mq_cluster/mq_node01/bin
./activemq startcd /mq_cluster/mq_node02/bin
./activemq startcd /mq_cluster/mq_node03/bin
./activemq start

 amq_batch_stop.sh

#!/bin/shcd /mq_cluster/mq_node01/bin
./activemq stopcd /mq_cluster/mq_node02/bin
./activemq stopcd /mq_cluster/mq_node03/bin
./activemq stop

记得用chmod 777 文件名修改文件权限,使文件可执行

(十)zk集群的节点状态说明

登录另一台虚拟机的zookeeper客户端,查看/节点下是否有activemq节点

./zkCli.sh -server 127.0.0.1:2181ls /

 可以看到三个结点都配置成功了

 再查看节点的具体信息

可以看到63633也就是我们的node03activemq有elected,即被选中作为master,其他两台为slave

 windows下访问8363,成功

六、集群可用性测试

测试队列发送与接收

生产者

public class JMSProduce {public static final String ACTIVEMQ_URL = "failover:(tcp://ip:61616,tcp://ip:61617,tcp://ip:61618)?randomize=false";public static final String QUEUE_NAME = "queue-cluster";public static void main(String[] args) throws JMSException {//1.创建链接工厂,按照给定的url地址,采用默认的用户和密码ActiveMQConnectionFactory activeMQConnectionFactory = new ActiveMQConnectionFactory(ACTIVEMQ_URL);//2.通过链接工厂,获得Connection并启动Connection connection = activeMQConnectionFactory.createConnection();connection.start();//3.创建会话session//3.1 两个参数 ①事务 ②签收Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);//4.创建目的地(queue or topic)Queue queue = session.createQueue(QUEUE_NAME);//5.创建生产者MessageProducer producer = session.createProducer(queue);producer.setDeliveryMode(DeliveryMode.PERSISTENT);//6.通过MessageProducer生成3条消息到MQ队列中for(int i = 1 ; i <= 3; i ++ ) {TextMessage textMessage = session.createTextMessage("clusterMessage--" + i);producer.send(textMessage);}producer.close();session.close();connection.close();System.out.println("消息发布到完成……");}
}

消费者

public class JmsConsumer {public static final String ACTIVEMQ_URL = "failover:(tcp://ip:61616,tcp://ip:61617,tcp://ip:61618)?randomize=false";public static final String QUEUE_NAME = "queue-cluster";public static void main(String[] args) throws JMSException, IOException {//1.创建链接工厂,按照给定的url地址,采用默认的用户和密码ActiveMQConnectionFactory activeMQConnectionFactory = new ActiveMQConnectionFactory(ACTIVEMQ_URL);//2.通过链接工厂,获得Connection并启动Connection connection = activeMQConnectionFactory.createConnection();connection.start();//3.创建会话session//3.1 两个参数 ①事务 ②签收Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);//4.创建目的地(queue or topic)Queue queue = session.createQueue(QUEUE_NAME);//5.创建消费者MessageConsumer consumer = session.createConsumer(queue);consumer.setMessageListener(new MessageListener() {@Overridepublic void onMessage(Message message) {if(null != message && message instanceof TextMessage) {TextMessage textMessage = (TextMessage) message;try {System.out.println("监听到cluster消息:"+textMessage.getText());} catch (JMSException e) {e.printStackTrace();}}}});//连接AvtiveMQ需要等待时间System.in.read();consumer.close();session.close();connection.close();}
}

 

 

相关内容

热门资讯

前端-session、jwt 目录:   (1)session (2&#x...
linux入门---制作进度条 了解缓冲区 我们首先来看看下面的操作: 我们首先创建了一个文件并在这个文件里面添加了...
关于测试,我发现了哪些新大陆 关于测试 平常也只是听说过一些关于测试的术语,但并没有使用过测试工具。偶然看到编程老师...
前缀和与对数器与二分法 1. 前缀和 假设有一个数组,我们想大量频繁的去访问L到R这个区间的和,...
nodejs:本地安装nvm实... 一、背景-使用不同版本node的原因 vue3+ts、nuxt3版本,node...
JAVA集合知识整理 Java集合知识整理 HashMap相关 HashMap的底层数据结构:jdk1.8之...
无刷直流电机介绍及单片机控制实... 无刷直流电机介绍及单片机控制实例前言基本概念优势与劣势使用寿命基本结构使用单片机控制实例电子调速器&...
fwdiary(2) dp2 1.传纸条  AcWing 275. 传纸条 - AcWing 走两条路,走一条最大的...
常用的DOS命令 常用的DOS命令 DOS(Disk Operating System,磁...
<C++> 类和对象(下) 1.const成员函数将const修饰的“成员函数”称之为const成员函数,cons...