基于zookeeper(集群)+LevelDB的ActiveMq高可用集群安装、配置、测试
一. zookeeper安装(集群):http://www.cnblogs.com/wangfajun/p/8692117.html √
二. ActiveMq配置:
1. ActiveMq集群部署规划:
环境:Centos6.6、JDK1.7
版本:ActiveMq 5.11.1
zookeeper集群环境:10.0.70.12:2181、10.0.70.13:、10.0.70.14:
| 主机 | 集群端口 | 消息端口 | 管控台端口 | ActiveMq节点安装目录 |
| 10.0.70.12 | 62621 | 51511 | 8161 | /home/fajun/activemq/node-01 |
| 10.0.70.13 | 62622 | 51512 | 8162 | /home/fajun/activemq/node-02 |
| 10.0.70.14 | 62623 | 51513 | 8163 | /home/fajun/activemq/node-03 |
2. 防火墙开放对应上表格管控台端口
3. 分别在三台主机上创建/home/fajun/activemq目录
$ mkdir /home/fajun/activemq
4. 上传apache-activemq-5.11.1-bin.tar.gz到三台主机的/home/fajun/activemq目录下
$ cd /home/fajun/activemq $ tar -zxvf apache-activemq-5.11.1-bin.tar.gz $ mv apache-activemq-5.11.1 node-0X(X代表节点0、1、2,下同)
5. 修改三台主机管控台端口(/home/fajun/activemq/node-0X/conf/jetty.xml),默认端口8161:
node-01管控台端口:
<bean id="jettyPort" class="org.apache.activemq.web.WebConsolePort" init-method="start">
<!-- the default port number for the web console -->
<property name="host" value="0.0.0.0"/>
<property name="port" value=""/>
</bean>
node-02管控台端口:
<bean id="jettyPort" class="org.apache.activemq.web.WebConsolePort" init-method="start">
<!-- the default port number for the web console -->
<property name="host" value="0.0.0.0"/>
<property name="port" value="8162"/>
</bean>
node-03管控台端口:
<bean id="jettyPort" class="org.apache.activemq.web.WebConsolePort" init-method="start">
<!-- the default port number for the web console -->
<property name="host" value="0.0.0.0"/>
<property name="port" value="8163"/>
</bean>
6. 集群配置:
在3个ActiveMQ节点中配置conf/activemq.xml中的持久化适配器。
修改其中bind、zkAddress、hostname和zkPath。
注意:每个ActiveMQ的brokerName必须相同,否则不能加入集群。
node-01中的持久化配置:
<broker xmlns="http://activemq.apache.org/schema/core" brokerName="MandaoDubbo" dataDirectory="${activemq.data}">
<!--kahaDB directory="${activemq.data}/kahadb"/ -->
<persistenceAdapter>
<replicatedLevelDB directory="${activemq.data}/leveldb"
replicas=""
bind="tcp://0.0.0.0:"
zkAddress="10.0.70.12:2181,10.0.70.13:2182,10.0.70.14:2183"
hostname="10.0.70.12"
zkPath="/activemq/leveldb-stores"
/>
</persistenceAdapter>
</broker>
node-02中的持久化配置:
<broker xmlns="http://activemq.apache.org/schema/core" brokerName="MandaoDubbo" dataDirectory="${activemq.data}">
<!--kahaDB directory="${activemq.data}/kahadb"/ -->
<persistenceAdapter>
<replicatedLevelDB directory="${activemq.data}/leveldb"
replicas=""
bind="tcp://0.0.0.0:"
zkAddress="10.0.70.12:2181,10.0.70.13:2182,10.0.70.14:2183"
hostname="10.0.70.13"
zkPath="/activemq/leveldb-stores"
/>
</persistenceAdapter>
</broker>
node-03中的持久化配置:
<broker xmlns="http://activemq.apache.org/schema/core" brokerName="MandaoDubbo" dataDirectory="${activemq.data}">
<!--kahaDB directory="${activemq.data}/kahadb"/ -->
<persistenceAdapter>
<replicatedLevelDB directory="${activemq.data}/leveldb"
replicas=""
bind="tcp://0.0.0.0:"
zkAddress="10.0.70.12:2181,10.0.70.13:2182,10.0.70.14:2183"
hostname="10.0.70.14"
zkPath="/activemq/leveldb-stores"
/>
</persistenceAdapter>
</broker>
<transportConnectors>
<!-- DOS protection, limit concurrent connections to 1000 and frame size to 100MB -->
<transportConnector name="openwire" uri="tcp://0.0.0.0:?maximumConnections=1000&wireFormat.maxFrameSize=104857600"/>
<transportConnector name="amqp" uri="amqp://0.0.0.0:5672?maximumConnections=1000&wireFormat.maxFrameSize=104857600"/>
<transportConnector name="stomp" uri="stomp://0.0.0.0:61613?maximumConnections=1000&wireFormat.maxFrameSize=104857600"/>
<transportConnector name="mqtt" uri="mqtt://0.0.0.0:1883?maximumConnections=1000&wireFormat.maxFrameSize=104857600"/>
<transportConnector name="ws" uri="ws://0.0.0.0:61614?maximumConnections=1000&wireFormat.maxFrameSize=104857600"/>
</transportConnectors>
<transportConnectors>
<!-- DOS protection, limit concurrent connections to 1000 and frame size to 100MB -->
<transportConnector name="openwire" uri="tcp://0.0.0.0:?maximumConnections=1000&wireFormat.maxFrameSize=104857600"/>
<transportConnector name="amqp" uri="amqp://0.0.0.0:5672?maximumConnections=1000&wireFormat.maxFrameSize=104857600"/>
<transportConnector name="stomp" uri="stomp://0.0.0.0:61613?maximumConnections=1000&wireFormat.maxFrameSize=104857600"/>
<transportConnector name="mqtt" uri="mqtt://0.0.0.0:1883?maximumConnections=1000&wireFormat.maxFrameSize=104857600"/>
<transportConnector name="ws" uri="ws://0.0.0.0:61614?maximumConnections=1000&wireFormat.maxFrameSize=104857600"/>
</transportConnectors>
node-03中的消息端口配置:
<transportConnectors>
<!-- DOS protection, limit concurrent connections to 1000 and frame size to 100MB -->
<transportConnector name="openwire" uri="tcp://0.0.0.0:?maximumConnections=1000&wireFormat.maxFrameSize=104857600"/>
<transportConnector name="amqp" uri="amqp://0.0.0.0:5672?maximumConnections=1000&wireFormat.maxFrameSize=104857600"/>
<transportConnector name="stomp" uri="stomp://0.0.0.0:61613?maximumConnections=1000&wireFormat.maxFrameSize=104857600"/>
<transportConnector name="mqtt" uri="mqtt://0.0.0.0:1883?maximumConnections=1000&wireFormat.maxFrameSize=104857600"/>
<transportConnector name="ws" uri="ws://0.0.0.0:61614?maximumConnections=1000&wireFormat.maxFrameSize=104857600"/>
</transportConnectors>
8.设置开机启动:
# vi /etc/rc.local
su - fajun -c '/home/fajun/activemq/node-01/bin/activemq start'
su - fajun -c '/home/fajun/activemq/node-02/bin/activemq start'
su - fajun -c '/home/fajun/activemq/node-03/bin/activemq start'
9. 按顺序启动3个ActiveMq节点:
$ /home/fajun/activemq/node-01/bin/activemq start
$ /home/fajun/activemq/node-02/bin/activemq start
$ /home/fajun/activemq/node-03/bin/activemq start
监听日志:
$ tail -f /home/fajun/activemq/node-01/data/activemq.log
$ tail -f /home/fajun/activemq/node-02/data/activemq.log
$ tail -f /home/fajun/activemq/node-03/data/activemq.log
10.集群的节点状态分析:


11. 集群可用性测试:
ActiveMQ的客户端只能访问Master的Broker,其他处于Slave的Broker不能访问。
所以客户端连接Broker应该使用failover协议:
failover:(tcp://10.0.70.12:51511,tcp://10.0.70.13:51512,tcp://10.0.70.14:51513)?randomize=false
日志分析:12的Mq尝试重连,发现连不上,接着重连上了13上的Mq节点(说明13推举成了Master)继续消费,消息并没有中断,309是12还没宕掉时消费的的日志,310是新的Master(13)消费的日志。
结论:集群环境中的某一个Mq节点宕掉,不影响消息消费
模拟场景2:
当前环境:12的Mq节点已停、13上的Mq节点(Master)正常运行,14上的Mq节点(Slave)正常运行
模拟线上环境操作:停掉13上的Mq节点

日志分析:控制台日志卡着不动了,没有任何消息能被消费
结论:只有一台Mq节点正常运行,集群Mq推算不出新的Master,将会一直等集群中的其他Mq节点恢复
模拟场景3:
模拟线上环境操作:启动13上的Mq节点
现在14(Slave)是运行的,但此刻并没有选举出Master,我现在,

日志分析:过了十几秒,重连上了14,然后继续消费:
结论:集群环境超过半数Mq节点运行正常,那么整个集群环境就是正常的
上面是我们模拟了Mq节点出现问题,消息消费的一些情况,由于ActiveMQ集群的高可用,依赖于ZooKeeper集群的高可用,那么我们现在来模拟,zookeeper节点出现异常,将会对ActiveMq有什么影响
日志分析:14上的Mq节点变成了Master,继续消费消息,消息依然被连续消费

日志分析:控制台日志卡着不动了,linux上我看了下3台Mq节点的状态,发现14上的Mq节点也挂掉了
结论:zk节点超过半数异常,则整个Mq集群环境将处于异常状态

日志分析:消费正常
结论:超过半数zk节点运行正常,Mq集群环境也会运行正常
警告: 请使用者注意。replicatedLevelDB不支持延迟或者计划任务消息。
这些消息存储在另外的LevelDB文件中,如果使用延迟或者计划任务消息,将不会复制到slave Broker上,不能实现消息的高可用。
基于zookeeper(集群)+LevelDB的ActiveMq高可用集群安装、配置、测试的更多相关文章
- ActiveMQ 高可用集群安装、配置(ZooKeeper + LevelDB)
ActiveMQ 高可用集群安装.配置(ZooKeeper + LevelDB) 1.ActiveMQ 集群部署规划: 环境: JDK7 版本:ActiveMQ 5.11.1 ZooKeeper 集群 ...
- 消息中间件-ActiveMQ高可用集群和持久化机制
1.修改active.mq的xml文件 2.延时.调度消息 package com.study.mq.b1_message; import org.apache.activemq.ActiveMQCo ...
- zookeeper+activemq高可用集群搭建
一.准备工作: 准备三台机器:192.168.35.111192.168.35.112192.168.35.113 二.搭建zookeeper 三台机器上均要搭建zookeeper服务// 下载zoo ...
- Zookeeper(四)Hadoop HA高可用集群搭建
一.高可就集群搭建 1.集群规划 2.集群服务器准备 (1) 修改主机名(2) 修改 IP 地址(3) 添加主机名和 IP 映射(4) 同步服务器时间(5) 关闭防火墙(6) 配置免密登录(7) 安装 ...
- 基于Galera Cluster多主结构的Mysql高可用集群
Galera Cluster特点 1.多主架构:真正的多点读写的集群,在任何时候读写数据,都是最新的 2.同步复制:集群不同节点之间数据同步,没有延迟,在数据库挂掉之后,数据不会丢失 3.并发复制:从 ...
- 基于CentOS 8服务器来搭建FastDFS高可用集群环境
服务器版本 我们在服务器的命令行输入如下命令来查看服务器的内核版本. [root@localhost lib]# cat /etc/redhat-release CentOS Linux releas ...
- k8s集群中部署Rook-Ceph高可用集群
先决条件 为确保您有一个准备就绪的 Kubernetes 集群Rook,您可以按照这些说明进行操作. 为了配置 Ceph 存储集群,至少需要以下本地存储选项之一: 原始设备(无分区或格式化文件系统) ...
- 七、Hadoop3.3.1 HA 高可用集群QJM (基于Zookeeper,NameNode高可用+Yarn高可用)
目录 前文 Hadoop3.3.1 HA 高可用集群的搭建 QJM 的 NameNode HA Hadoop HA模式搭建(高可用) 1.集群规划 2.Zookeeper集群搭建: 3.修改Hadoo ...
- Dubbo入门到精通学习笔记(十四):ActiveMQ集群的安装、配置、高可用测试,ActiveMQ高可用+负载均衡集群的安装、配置、高可用测试
文章目录 ActiveMQ 高可用集群安装.配置.高可用测试( ZooKeeper + LevelDB) ActiveMQ高可用+负载均衡集群的安装.配置.高可用测试 准备 正式开始 ActiveMQ ...
随机推荐
- kubernetes(一)
•Kubernetes介绍 1.背景介绍 云计算飞速发展 - IaaS - PaaS - SaaS Docker技术突飞猛进 - 一次构建,到处运行 - 容器的快速轻量 - 完整的生态环境 2.什 ...
- spfa优化板子
用双端队列,当待加入元素小于队首元素时 加入队首, 否则 加入队尾 slf优化 if(!vis[e.v]) { if(Q.empty()) Q.push_front(e.v); else { if(d ...
- 《python3网络爬虫开发实战》第一章、开发环境配置-问题汇总
开发环境: VMware虚拟机 Ubuntu18.04 python3.6 (由于对vi操作水平有限,所以大部分都用的gedit进行文件编辑) 换源: 刚装上系统后换了好几个源,就清华源感觉好使点,别 ...
- LOJ#2019. 「AHOI / HNOI2017」影魔
题意: 在一个序列中 如果有一个子区间 它有一个端点是区间最大值 另一个端点不是这个区间的次大值 就会有p2的贡献 它两个端点分别是最大值次大值 就会有p1的贡献 我们发现这两个条件有一个重合的部分 ...
- redis主从复制和sentinel配置高可用
一:redis主从配置1.环境准备 master : 192.168.50.10 6179 slave1: 192.168.50.10 6279 slave2: 192.168.50.10 63792 ...
- ftp:linux下利用shell脚本添加虚拟用户并赋予权限
首先ftp配置应为虚拟用户登录模式 用户密码文本目录为/etc/vsftpd/vftpuser,代码如下: #!/bin/bash # ];then username=$ password=$ hom ...
- 【Linux命令】用户及分用户组
查看用户 查看所有用户命令: cat /etc/passwd 上面命令输出内容比较杂乱,可以使用如下命令简化输出: #对于 cat /etc/passwd 的替换 cat /etc/passwd|gr ...
- VSIX 插件右键菜单
vs2017 插件开发 环境 WIN10 VS2017 CMMT VSIX 参考资源: vs菜单命令ID速查 https://docs.microsoft.com/zh-cn/visualstudio ...
- linux(fedora) 第二课
vi 文件名(一般模式 编辑模式 命令模式) 一般模式 (不可编辑 按 a,i,o可以切换为编辑模式): 1.删除n行:按下想删除的行数+dd 编辑模式(编辑模式 可以浏览,查找,编辑 按‘:” 可以 ...
- 20165223《JAVA程序设计》第二周学习总结
20165223 <JAVA程序设计>第二周学习总结 教材学习内容总结 第二章要点 标识符与关键字 基本数据类型 类型转换运算 输入输出数据 数组 第三章要点 运算符与表达式 语句概述 i ...