一. 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>
7. 修改各节点的消息端口(注意,避免端口冲突),默认消息端口:
node-01中的消息端口配置:
<transportConnectors>
<!-- DOS protection, limit concurrent connections to 1000 and frame size to 100MB -->
<transportConnector name="openwire" uri="tcp://0.0.0.0:?maximumConnections=1000&amp;wireFormat.maxFrameSize=104857600"/>
<transportConnector name="amqp" uri="amqp://0.0.0.0:5672?maximumConnections=1000&amp;wireFormat.maxFrameSize=104857600"/>
<transportConnector name="stomp" uri="stomp://0.0.0.0:61613?maximumConnections=1000&amp;wireFormat.maxFrameSize=104857600"/>
<transportConnector name="mqtt" uri="mqtt://0.0.0.0:1883?maximumConnections=1000&amp;wireFormat.maxFrameSize=104857600"/>
<transportConnector name="ws" uri="ws://0.0.0.0:61614?maximumConnections=1000&amp;wireFormat.maxFrameSize=104857600"/>
</transportConnectors>
node-02中的消息端口配置:
<transportConnectors>
<!-- DOS protection, limit concurrent connections to 1000 and frame size to 100MB -->
<transportConnector name="openwire" uri="tcp://0.0.0.0:?maximumConnections=1000&amp;wireFormat.maxFrameSize=104857600"/>
<transportConnector name="amqp" uri="amqp://0.0.0.0:5672?maximumConnections=1000&amp;wireFormat.maxFrameSize=104857600"/>
<transportConnector name="stomp" uri="stomp://0.0.0.0:61613?maximumConnections=1000&amp;wireFormat.maxFrameSize=104857600"/>
<transportConnector name="mqtt" uri="mqtt://0.0.0.0:1883?maximumConnections=1000&amp;wireFormat.maxFrameSize=104857600"/>
<transportConnector name="ws" uri="ws://0.0.0.0:61614?maximumConnections=1000&amp;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&amp;wireFormat.maxFrameSize=104857600"/>
<transportConnector name="amqp" uri="amqp://0.0.0.0:5672?maximumConnections=1000&amp;wireFormat.maxFrameSize=104857600"/>
<transportConnector name="stomp" uri="stomp://0.0.0.0:61613?maximumConnections=1000&amp;wireFormat.maxFrameSize=104857600"/>
<transportConnector name="mqtt" uri="mqtt://0.0.0.0:1883?maximumConnections=1000&amp;wireFormat.maxFrameSize=104857600"/>
<transportConnector name="ws" uri="ws://0.0.0.0:61614?maximumConnections=1000&amp;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.集群的节点状态分析:

集群启动后对ZooKeeper数据的抓图,可以看到ActiveMQ的有3个节点,分别是000000000004,00000000003,00000000002。
以下第一张图展现了00000000002的值,可以看到elected的值是不为空,说明这个节点是Master,其他两个节点是Slave。

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
Ps : ActiveMq(下面简称Mq节点)分为Master[主]、Slave[从]
模拟场景1
当前环境:10.0.70.12、10.0.70.13、10.0.70.14 上的Mq节点都是正常运行的(下面简称12、13、14),12是Master  
模拟线上环境异常:停掉12上的Mq节点

日志分析: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

当前环境:12、13上的Mq节点已停、14上的Mq节点(Slave)正常运行(场景2中,14上的Mq并没有被选为Master)

模拟线上环境操作:启动13上的Mq节点

现在14(Slave)是运行的,但此刻并没有选举出Master,我现在,

日志分析:过了十几秒,重连上了14,然后继续消费:

结论:集群环境超过半数Mq节点运行正常,那么整个集群环境就是正常的

上面是我们模拟了Mq节点出现问题,消息消费的一些情况,由于ActiveMQ集群的高可用,依赖于ZooKeeper集群的高可用,那么我们现在来模拟,zookeeper节点出现异常,将会对ActiveMq有什么影响

Ps : zookeeper(下面简称zk节点) 分为Leader[主]、follower[从]
模拟场景1
当前环境:12、13、14上的zk节点、Mq节点都正常运行,13上的zk节点是Leader 、13上的Mq节点是Master
模拟线上环境操作:停掉13上的zk节点:

日志分析:14上的Mq节点变成了Master,继续消费消息,消息依然被连续消费

结论:一台zk节点宕掉,虽然Mq会重新选举新的Master节点,单Mq节点不会出现异常,不影响Mq节点消费消息
模拟场景2
当前环境:12、14上的zk节点都正常运行,13上的zk节点已停 |  14上的Mq节点是Master,12、13上的Mq节点(Slave)运行正常
模拟线上环境操作:停掉12上的zk节点:

日志分析:控制台日志卡着不动了,linux上我看了下3台Mq节点的状态,发现14上的Mq节点也挂掉了

结论:zk节点超过半数异常,则整个Mq集群环境将处于异常状态

模拟场景2
当前环境:12、13上的zk节点都停了,14上的zk节点运行正常 | 14上的Mq节点挂了,12、13上的Mq节点(Slave)运行正常
模拟线上环境操作:启动12上的zk节点:

日志分析:消费正常

结论:超过半数zk节点运行正常,Mq集群环境也会运行正常

模拟场景3
当前环境:所有上的zk节点都是停掉了| 所有Mq节点运行异常
模拟线上环境操作:依次启动所有zk节点:
日志分析:没有任何消息被消费
结论:当zk节点都处于异常状态,重启过后,Mq节点将运行异常,需要重启Mq节点,才能恢复。
 

警告: 请使用者注意。replicatedLevelDB不支持延迟或者计划任务消息。

这些消息存储在另外的LevelDB文件中,如果使用延迟或者计划任务消息,将不会复制到slave Broker上,不能实现消息的高可用。

基于zookeeper(集群)+LevelDB的ActiveMq高可用集群安装、配置、测试的更多相关文章

  1. ActiveMQ 高可用集群安装、配置(ZooKeeper + LevelDB)

    ActiveMQ 高可用集群安装.配置(ZooKeeper + LevelDB) 1.ActiveMQ 集群部署规划: 环境: JDK7 版本:ActiveMQ 5.11.1 ZooKeeper 集群 ...

  2. 消息中间件-ActiveMQ高可用集群和持久化机制

    1.修改active.mq的xml文件 2.延时.调度消息 package com.study.mq.b1_message; import org.apache.activemq.ActiveMQCo ...

  3. zookeeper+activemq高可用集群搭建

    一.准备工作: 准备三台机器:192.168.35.111192.168.35.112192.168.35.113 二.搭建zookeeper 三台机器上均要搭建zookeeper服务// 下载zoo ...

  4. Zookeeper(四)Hadoop HA高可用集群搭建

    一.高可就集群搭建 1.集群规划 2.集群服务器准备 (1) 修改主机名(2) 修改 IP 地址(3) 添加主机名和 IP 映射(4) 同步服务器时间(5) 关闭防火墙(6) 配置免密登录(7) 安装 ...

  5. 基于Galera Cluster多主结构的Mysql高可用集群

    Galera Cluster特点 1.多主架构:真正的多点读写的集群,在任何时候读写数据,都是最新的 2.同步复制:集群不同节点之间数据同步,没有延迟,在数据库挂掉之后,数据不会丢失 3.并发复制:从 ...

  6. 基于CentOS 8服务器来搭建FastDFS高可用集群环境

    服务器版本 我们在服务器的命令行输入如下命令来查看服务器的内核版本. [root@localhost lib]# cat /etc/redhat-release CentOS Linux releas ...

  7. k8s集群中部署Rook-Ceph高可用集群

    先决条件 为确保您有一个准备就绪的 Kubernetes 集群Rook,您可以按照这些说明进行操作. 为了配置 Ceph 存储集群,至少需要以下本地存储选项之一: 原始设备(无分区或格式化文件系统) ...

  8. 七、Hadoop3.3.1 HA 高可用集群QJM (基于Zookeeper,NameNode高可用+Yarn高可用)

    目录 前文 Hadoop3.3.1 HA 高可用集群的搭建 QJM 的 NameNode HA Hadoop HA模式搭建(高可用) 1.集群规划 2.Zookeeper集群搭建: 3.修改Hadoo ...

  9. Dubbo入门到精通学习笔记(十四):ActiveMQ集群的安装、配置、高可用测试,ActiveMQ高可用+负载均衡集群的安装、配置、高可用测试

    文章目录 ActiveMQ 高可用集群安装.配置.高可用测试( ZooKeeper + LevelDB) ActiveMQ高可用+负载均衡集群的安装.配置.高可用测试 准备 正式开始 ActiveMQ ...

随机推荐

  1. CodeForces512C-Pluses everywhere-模拟/数学/排列组合模板

    经过研究可以发现,每一位的贡献是C(n-2,k-1)+C(n-3,k-1)...C(k-1,k-1) 同时还要注意加号全部在左边的情况. 这里还用了O(n)预处理O(1)组合数的模板.//妙啊..妙. ...

  2. 基准对象object中的基础类型----列表 (四)

    object有如下子类: CLASSES object basestring str unicode buffer bytearray classmethod complex dict enumera ...

  3. 51Nod1824 染色游戏 【Lucas定理】【FMT】【位运算】

    我的FMT是在VFleaKing的论文中学到的.51Nod的评测机好恶心. 题目分析: 题目很明显是要你求一个类似卷积的式子.但是我们可以注意到前面具有组合数,如果拆成阶乘会很大,在模意义下你无法判断 ...

  4. 用递归方法解决汉诺塔问题(Recursion Hanoi Tower Python)

    汉诺塔问题源于印度的一个古老传说:梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘.梵天命令婆罗门把圆盘按大小顺序重新摆放在另一根柱子上,并且规定小圆盘上不能放 ...

  5. 【XSY1544】fixed 数学 强连通图计数

    题目描述 ​ 给你一个\(n\times n\)的方阵\(A\).定义方阵\(A\)的不动点\((i,j)\)为:\(\forall p,q\geq 0,(A^p)_{i,j}=(A^q)_{i,j} ...

  6. os模块总结

    学了忘,忘了学,忘了就来看一下...唯一进步的就是这次学的比上次更快了- - 最常用的几个: os.getcwd()   # os.path.abspath(os.path.dirname(__fil ...

  7. JAVA多线程之volatile 与 synchronized 的比较

    一,volatile关键字的可见性 要想理解volatile关键字,得先了解下JAVA的内存模型,Java内存模型的抽象示意图如下: 从图中可以看出: ①每个线程都有一个自己的本地内存空间--线程栈空 ...

  8. 解决在vue中axios请求超时的问题

    查看更多精彩内容请访问我的新博客:https://www.cssge.com/ 自从使用Vue2之后,就使用官方推荐的axios的插件来调用API,在使用过程中,如果服务器或者网络不稳定掉包了, 你们 ...

  9. Win32 SDK:ListBox 为什么不整个 LB_SETTEXT

    Win32 & SDK: ListBox 有个 LB_GETTEXT,为什么没有 LB_SETTEXT,想修改指定Item的Text,还真不容易. 自已写了一个,支持单选和多选模式,部分代码: ...

  10. Tomcat如何发布web项目

    tomcat/webapps目录是用来存放Java项目的.每一个文件夹都是一个项目,默认这个目录下已经有了四个项目,都是tomcat自带的. 其中ROOT就是我们测试Tomcat时访问的Tomcat的 ...