1.ActiveMQ集群介绍

1.为什么要集群?   

  实现高可用,以排除单点故障引起的服务中断

  实现负载均衡,以提升效率为更多客户提供服务

2.集群方式

  客户端集群:让多个消费者消费同一个队列

  Broker Cluster:多个Broker之间同步消息(做不了高可用,可以实现负载均衡)

  Master-Slave:高可用(做不了负载均衡)

3.ActiveMq失效转移

  允许当其中一台消息服务器宕机时,客户端在传输层上重新连接其他消息服务器。

  语法:failover:(uri1,...uriN)?transportOptions

    transportOptions参数说明:randomize:默认为true,表示在URI列表中选择URI连接时是否采用随机策略

                initialReconnectDelay默认为10,默认10毫秒,表示第一次尝试重连之间等待的时间。

                maxReconnectDelay:默认30000,单位毫秒,最长重连时间的间隔

4.Master/Slave集群配置

  Share nothing storage master/slave(已经过时,5.8之后移除)

  shared storage master/slave 共享存储(实际上是共享同一文件夹,只不过采用排他锁,所以只有一个master节点可以访问,当此服务宕机,另一台slave可以快速强占排他锁,所以不会造成数据丢失,使用同一文件夹下的东西。如果多态服务器的话需要搭建文件共享服务器)

  Replicated LevelDB Store 基于复制的LevelDB Store

1.共享存储原理:(获取排他锁才可以提供消息服务)--简单方式

    

2.Replicated LevelDB Store 基于复制的LevelDB Store原理(基于zookeper)

3.两种方式对比:

  高可用 负载均衡
Master/Slave
Broker Cluster

4.三台机器的完美集群方案:(实现高可用和负载均衡)

2.ActiveMQ集群配置

1.方案介绍

方案如下: B与C采用master-slave共享文件夹存储(任一时刻只有一个可以占有排他锁,也就是只有一个可以提供服务),当A宕机之后B会获取资源锁提供服务---实现高可用

       A与B、A与C都采用Broker 集群,可以同时提供服务,不管B与C谁获取锁,A都可以提供服务(A只能提供服务消费消息,不生成消息)---实现负载均衡

  

配置如下:(同一个电脑不同端口模拟集群)

    

 2.配置文件 (修改的配置文件都是在apache-activemq-5.15.6\conf文件夹下)

  

(1)activemq-a下面的配置:---A服务器

activemq.xml:(注释掉其他协议,服务端口使用61616端口;增加静态网络连接器,同时连接B与C)

jetty.xml:  采用默认的8161端口

(2)activemq-b下面的配置:---B服务器

activemq.xml:(增加与A的静态连接器,修改服务端口采用61617,修改共享文件夹的地址)

jitty.xml:修改端口采用8162

(3)activemq-c下面的配置:---C服务器

activemq.xml:(增加与A的静态连接器,修改服务端口采用61618,修改共享文件夹的地址)

jitty.xml:修改端口采用8163

3.依次启动ActiveMq进行测试

  启动顺序是:A->B->C,下面通过端口信息验证集群:

liqiang@root MINGW64 ~/Desktop
$ netstat -ano |findstr
TCP 0.0.0.0: 0.0.0.0: LISTENING
TCP [::]: [::]: LISTENING liqiang@root MINGW64 ~/Desktop
$ netstat -ano |findstr
TCP 0.0.0.0: 0.0.0.0: LISTENING
TCP [::]: [::]: LISTENING
liqiang@root MINGW64 ~/Desktop
$ netstat -ano |findstr liqiang@root MINGW64 ~/Desktop
$ netstat -ano |findstr
TCP 0.0.0.0: 0.0.0.0: LISTENING
TCP 127.0.0.1: 127.0.0.1: ESTABLISHED
TCP 127.0.0.1: 127.0.0.1: ESTABLISHED
TCP [::]: [::]: LISTENING liqiang@root MINGW64 ~/Desktop
$ netstat -ano |findstr
TCP 0.0.0.0: 0.0.0.0: LISTENING
TCP 127.0.0.1: 127.0.0.1: ESTABLISHED
TCP 127.0.0.1: 127.0.0.1: ESTABLISHED
TCP [::]: [::]: LISTENING
liqiang@root MINGW64 ~/Desktop
$ netstat -ano |findstr

  由于先启动的B,B占有排斥锁,所以B(8162-61617)处于监听状态,而C与B采用共享文件排他锁集群,所以C处于阻塞状态,也就是没有监听端口,被阻塞。

 停掉B服务器,模拟B服务器宕机的情况,再次查看端口:

liqiang@root MINGW64 ~/Desktop
$ netstat -ano |findstr 8161
TCP 0.0.0.0:8161 0.0.0.0:0 LISTENING 2423496
TCP [::]:8161 [::]:0 LISTENING 2423496 liqiang@root MINGW64 ~/Desktop
$ netstat -ano |findstr 8162 liqiang@root MINGW64 ~/Desktop
$ netstat -ano |findstr 8163
TCP 0.0.0.0:8163 0.0.0.0:0 LISTENING 2423848
TCP [::]:8163 [::]:0 LISTENING 2423848 liqiang@root MINGW64 ~/Desktop
$ netstat -ano |findstr 61616
TCP 0.0.0.0:61616 0.0.0.0:0 LISTENING 2423496
TCP 127.0.0.1:56704 127.0.0.1:61616 ESTABLISHED 2423848
TCP 127.0.0.1:61616 127.0.0.1:56704 ESTABLISHED 2423496
TCP [::]:61616 [::]:0 LISTENING 2423496 liqiang@root MINGW64 ~/Desktop
$ netstat -ano |findstr 61617 liqiang@root MINGW64 ~/Desktop
$ netstat -ano |findstr 61618
TCP 0.0.0.0:61618 0.0.0.0:0 LISTENING 2423848
TCP 127.0.0.1:56791 127.0.0.1:61618 ESTABLISHED 2423496
TCP 127.0.0.1:61618 127.0.0.1:56791 ESTABLISHED 2423848
TCP [::]:61618 [::]:0 LISTENING 2423848 liqiang@root MINGW64 ~/Desktop

  由于B宕机,所以C会强占排他锁,也就是会监听端口,所以可以看到8163与61618端口的监听状态。

  现在模拟C也宕机,将C服务器也停掉。再次查看端口信息:

liqiang@root MINGW64 ~/Desktop
$ netstat -ano |findstr 8161
TCP 0.0.0.0:8161 0.0.0.0:0 LISTENING 2423496
TCP [::]:8161 [::]:0 LISTENING 2423496 liqiang@root MINGW64 ~/Desktop
$ netstat -ano |findstr 8162 liqiang@root MINGW64 ~/Desktop
$ netstat -ano |findstr 8163 liqiang@root MINGW64 ~/Desktop
$ netstat -ano |findstr 61616
TCP 0.0.0.0:61616 0.0.0.0:0 LISTENING 2423496
TCP [::]:61616 [::]:0 LISTENING 2423496 liqiang@root MINGW64 ~/Desktop
$ netstat -ano |findstr 61617
TCP 127.0.0.1:57242 127.0.0.1:61617 SYN_SENT 2423496 liqiang@root MINGW64 ~/Desktop
$ netstat -ano |findstr 61618 liqiang@root MINGW64 ~/Desktop

  此时A服务器仍然在监听端口。

  上面证明集群搭建成功,下面重新开启A->B->C服务器开始程序验证。

4.程序验证集群

服务器开启顺序性:A->B->C(此时B占有排他锁,B监听端口,A一直监听)

liqiang@root MINGW64 ~/Desktop
$ netstat -ano |findstr 61617 liqiang@root MINGW64 ~/Desktop
$ netstat -ano |findstr 61616
TCP 0.0.0.0:61616 0.0.0.0:0 LISTENING 2428232
TCP 127.0.0.1:60520 127.0.0.1:61616 ESTABLISHED 2427192
TCP 127.0.0.1:61616 127.0.0.1:60520 ESTABLISHED 2428232
TCP [::]:61616 [::]:0 LISTENING 2428232 liqiang@root MINGW64 ~/Desktop
$ netstat -ano |findstr 61617
TCP 0.0.0.0:61617 0.0.0.0:0 LISTENING 2427192
TCP 127.0.0.1:60513 127.0.0.1:61617 ESTABLISHED 2428232
TCP 127.0.0.1:61617 127.0.0.1:60513 ESTABLISHED 2427192
TCP [::]:61617 [::]:0 LISTENING 2427192 liqiang@root MINGW64 ~/Desktop
$ netstat -ano |findstr 61618 liqiang@root MINGW64 ~/Desktop
$ netstat -ano |findstr 8161
TCP 0.0.0.0:8161 0.0.0.0:0 LISTENING 2428232
TCP [::]:8161 [::]:0 LISTENING 2428232 liqiang@root MINGW64 ~/Desktop
$ netstat -ano |findstr 8162
TCP 0.0.0.0:8162 0.0.0.0:0 LISTENING 2427192
TCP [::]:8162 [::]:0 LISTENING 2427192
liqiang@root MINGW64 ~/Desktop
$ netstat -ano |findstr 8163

代码测试:

生产者:  url加了失效策略,而且采用随机选取,生产消息的地址只有B与C服务器地址

package cn.qlq.activemq;

import javax.jms.Connection;
import javax.jms.ConnectionFactory;
import javax.jms.JMSException;
import javax.jms.MessageProducer;
import javax.jms.Queue;
import javax.jms.Session;
import javax.jms.TextMessage; import org.apache.activemq.ActiveMQConnectionFactory; /**
* 生产消息
*
* @author QiaoLiQiang
* @time 2018年9月18日下午11:04:41
*/
public class MsgProducer { private static final String url = "failover:(tcp://localhost:61617,tcp://localhost:61618)?randomize=true";
private static final String queueName = "myQueue"; public static void main(String[] args) throws JMSException {
// 1创建ConnectionFactory
ConnectionFactory connectionFactory = new ActiveMQConnectionFactory(url);
// 2.由connectionFactory创建connection
Connection connection = connectionFactory.createConnection();
// 3.启动connection
connection.start();
// 4.创建Session===第一个参数是是否事务管理,第二个参数是应答模式
Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
// 5.创建Destination(Queue继承Queue)
Queue destination = session.createQueue(queueName);
// 6.创建生产者producer
MessageProducer producer = session.createProducer(destination);
for (int i = 0; i < 100; i++) {
// 7.创建Message,有好多类型,这里用最简单的TextMessage
TextMessage tms = session.createTextMessage("textMessage:" + i);
// 8.生产者发送消息
producer.send(tms); System.out.println("send:" + tms.getText());
}
// 9.关闭connection
connection.close();
} }

消费者:url加了失效策略,而且采用随机选取,生产消息的地址有ABC服务器

package cn.qlq.activemq;

import javax.jms.Connection;
import javax.jms.ConnectionFactory;
import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.MessageConsumer;
import javax.jms.MessageListener;
import javax.jms.Queue;
import javax.jms.Session;
import javax.jms.TextMessage; import org.apache.activemq.ActiveMQConnectionFactory; /**
* 消费消息
*
* @author QiaoLiQiang
* @time 2018年9月18日下午11:26:41
*/
public class MsgConsumer { private static final String url = "failover:(tcp://localhost:61616,tcp://localhost:61617,tcp://localhost:61618)?randomize=true";
private static final String queueName = "myQueue"; public static void main(String[] args) throws JMSException {
// 1创建ConnectionFactory
ConnectionFactory connectionFactory = new ActiveMQConnectionFactory(url);
// 2.由connectionFactory创建connection
Connection connection = connectionFactory.createConnection();
// 3.启动connection
connection.start();
// 4.创建Session===第一个参数是是否事务管理,第二个参数是应答模式
Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
// 5.创建Destination(Queue继承Queue)
Queue destination = session.createQueue(queueName);
// 6.创建消费者consumer
MessageConsumer consumer = session.createConsumer(destination);
// 7.给消费者绑定监听器(消息的监听是一个异步的过程,不可以关闭连接,绑定监听器线程是一直开启的,处于阻塞状态,所以可以在程序退出关闭)
consumer.setMessageListener(new MessageListener() {
@Override
public void onMessage(Message message) {
// 7.1由于消费者接受的是TextMessage,所以强转一下
TextMessage tms = (TextMessage) message;
try {
System.out.println("接收消息:" + tms.getText());
} catch (JMSException e) {
e.printStackTrace();
}
}
});
} }

启动生产者发布100条消息:

管理界面查看:(消息被发布在B服务器,B占有排他锁,C处于阻塞)

 A服务不生产消息所有A不会消费消息:(通过A查看网络连接器)

关掉B服务器之后查看C服务器:(验证B与C共享同一文件夹,且强占排他锁)

查看共享文件夹:

 此时A与C处于监听状态,启动消费者:

liqiang@root MINGW64 ~/Desktop
$ netstat -ano |findstr 8161
TCP 0.0.0.0:8161 0.0.0.0:0 LISTENING 2431676
TCP [::]:8161 [::]:0 LISTENING 2431676 liqiang@root MINGW64 ~/Desktop
$ netstat -ano |findstr 8162 liqiang@root MINGW64 ~/Desktop
$ netstat -ano |findstr 8163
TCP 0.0.0.0:8163 0.0.0.0:0 LISTENING 2432188
TCP [::]:8163 [::]:0 LISTENING 2432188
TCP [::1]:8163 [::1]:63600 TIME_WAIT 0
TCP [::1]:8163 [::1]:63648 TIME_WAIT 0
TCP [::1]:8163 [::1]:63649 TIME_WAIT 0
TCP [::1]:8163 [::1]:63650 TIME_WAIT 0
TCP [::1]:8163 [::1]:63651 TIME_WAIT 0
TCP [::1]:8163 [::1]:63652 TIME_WAIT 0

查看控制台如下:连接到A服务器消费信息

 总结:上面的配置方案B与C是为了实现高可用,也就是一台宕机之后另一台马上强占排他锁提供服务(需要共享文件夹实现共用同一文件夹下的资源与锁),B与C可以生产消息,也可以提供消费消息,但是同一时刻只有一个提供服务。

     提供A是为了与B、C实现负载均衡,A不生产消息,但是可以消费消息,替B或者C分担压力。

ActiveMQ集群的更多相关文章

  1. ActiveMQ集群应用

    ActiveMQ集群 ActiveMQ具有强大和灵活的集群功能,但在使用的过程中会发现很多的缺点,ActiveMQ的集群方式主要由两种:Master-Slave和Broker Cluster. 1.M ...

  2. 使用jmeter对ActiveMQ集群性能方案进行评估--转载

    原文地址:http://www.51testing.com/html/78/23978-143163.html 1.测试概要1.1 关于这篇文档中涉及的基于JMS的消息系统能为应用程序提供可靠的,高性 ...

  3. 分布式ActiveMQ集群

    分布式ActiveMQ集群的部署配置细节: 官方资料:http://activemq.apache.org/clustering.html 基本上看这个就足够了,本文就不具体分析配置文件了. 1.Qu ...

  4. ActiveMQ集群(2)

    ActiveMQ具有强大和灵活的集群功能,但在使用的过程中会发现很多的缺点,ActiveMQ的集群方式主要有两种:Master-Slave和Broker Cluster. 1.Master-Slave ...

  5. 分布式ActiveMQ集群--转载

    原文地址:http://shensy.iteye.com/blog/1752529 回顾总结前一段时间学习的ActiveMQ分布式集群相关的知识,分享出来希望对看到的人有所帮助. 一.分布式Activ ...

  6. Azure上搭建ActiveMQ集群-基于ZooKeeper配置ActiveMQ高可用性集群

    ActiveMQ从5.9.0版本开始,集群实现方式取消了传统的Master-Slave方式,增加了基于ZooKeeper+LevelDB的实现方式. 本文主要介绍了在Windows环境下配置基于Zoo ...

  7. ActiveMQ集群简单测试+eclipse Zookeeper 插件 + 负载均衡

    ActiveMQ集群搭建好之后,接下来就该测试一下了. 一.先安装Zookeeper 的eclipse插件吧. 1. 打开 eclipse, Help -> Install New Softwa ...

  8. ActiveMQ集群方案

    集群方案主要为了解决系统架构中的两个关键问题:高可用和高性能.ActiveMQ服务的高可用性是指,在ActiveMQ服务性能不变.数据不丢失的前提下,确保当系统灾难出现时ActiveMQ能够持续提供消 ...

  9. 47.ActiveMQ集群

    (声明:本文非EamonSec原创) 使用ZooKeeper实现的Master-Slave实现方式,是对ActiveMQ进行高可用的一种有效的解决方案,高可用的原理:使用ZooKeeper(集群)注册 ...

随机推荐

  1. NOIP 2018 游记(退役了!)

    一片空白 在霉的不能再霉的18年11月,Noip2018上,倒霉的我也是贼有意思,感冒加身,D2发烧,数组开小…我还能说什么MMP,身体和考试能力真的很重要. ……(省略无数字的心理活动,有空补上~) ...

  2. 2017ACM/ICPC亚洲区沈阳站-重现赛

    HDU 6222 Heron and His Triangle 链接:http://acm.hdu.edu.cn/showproblem.php?pid=6222 思路: 打表找规律+大数运算 首先我 ...

  3. Python网络爬虫:空姐网、糗百、xxx结果图与源码

    如前面所述,我们上手写了空姐网爬虫,糗百爬虫,先放一下传送门: Python网络爬虫requests.bs4爬取空姐网图片Python爬虫框架Scrapy之爬取糗事百科大量段子数据Python爬虫框架 ...

  4. sklearn 的train_test_split

    train_test_split函数用于将矩阵随机划分为训练子集和测试子集,并返回划分好的训练集测试集样本和训练集测试集标签. 格式: from sklearn.model_selection imp ...

  5. Codeforces-gym-101020 problem C. Rectangles

    题目链接:http://codeforces.com/gym/101020/problem/C C. Rectangles time limit per test 2.0 s memory limit ...

  6. Linux 常用命令——cat, tac, nl, more, less, head, tail, od

    Drecik学习经验分享 转载请注明出处:http://blog.csdn.net/drecik__/article/details/8453584 1. cat 由第一行开始显示文件内容 2. ta ...

  7. 【洛谷P1379】八数码难题 状压bfs

    对于这道题来说,每个时刻的状态是整个棋盘所有棋子的位置,即:任何一个棋子位置发生了移动,都会使得状态转移. 因此,需要采取将整个状态作为广搜的搜索对象,进行状态压缩.采用哈希得到每个状态的对应的数值, ...

  8. 2018 ACM 网络选拔赛 焦作赛区

    A. Magic Mirror #include <cstdio> #include <cstdlib> #include <cmath> #include < ...

  9. windows中的mysql修改管理员密码

    上周安装了Mysl 但是却无法登陆,找了好久才找到这个解决办法,讲的详细谢谢了. [摘要:1.my-default.ini 更名my.ini 正在解压的目次上面复造my-default.ini一份更名 ...

  10. 走进Java中的持有对象(容器类)【二】Collection

    概述 通过前文的学习,我们对容器的分类及常用容器类的作用有了基本的认识.本文将针对Collection容器的功能与使用进行细致分析. 基本操作 Collection集合抽象出的目的是为存放独立元素的序 ...