activeMQ监听

转发自:https://blog.csdn.net/liaomengge/article/details/51292310

《一》

初衷:介绍ActiveMQ的监控,便于之后温故

1. 搭建

建议自己clone github https://github.com/apache/activemq 下来,然后编译,打包,方便以后进行改造

网上很多关于之类的demo,本文不再赘述,详情可参考:http://my.oschina.net/Auhgnahz/blog/551620?fromerr=o3purd6Y

2. 监控管理

一般,公司都希望对一些数据,程序监控,才能上生产,而ActiveMQ的监控无非是如下几部分:

1)监控硬件物理空间是否充足

- ActiveMQ有3个重要的参数,存储空间百分比,内存空间百分比和临时空间百分比。这三个参数的意义很明显,如果值到了100,则表明硬件空间已满,Broker不能再接受任何的消息了,除非有消息消费并且删除,Broker才可以再接收消息。

- 如果这些值长时间都比较高,接近阀值,则表示硬件的配置不能满足要求,建议更换硬件,或者给予ActiveMQ的环境配置比较小,建议给予更多的资源给ActiveMQ。

- 如果平时保持在一个稳定值,有一段时间突然增高,则有两种可能。一种可能是用户量大增,另一种可能是某个或者某几个消息消费者死机了。需要人工干预重启。

2)监控队列

- 如果ActiveMQ使用队列,需要监控队列的未消费消息数量,消费者数量,消息入队和出队的数量

- 未消费消息数量的含义和监控硬件的内存和硬盘空间差不多,过多的消息堆积可能是有消息消费者死机

- 消费者数量应该是一个相对固定的值,这个值减少,就直接表示有的消费者已经死机

- 消息入队和出队数量如果增长缓慢或者不增长,则表示消息发送者已经死机。一般是通过增量监控

3)监控主题

如果ActiveMQ使用主题,需要监控的内容和队列相似,但是没有未消费的消息数量。这里指的注意的是,ActiveMQ提供Advisory Message,用于帮助使用统计一些额外信息,具体可查看官方文档:http://activemq.apache.org/advisory-message.html

4)监控订阅者 

- 同样,如果ActiveMQ使用主题,订阅者的信息就十分重要。需要监控已经下线的订阅者。

 

如下是ActiveMQ的展示页面:

 

第一步:修改activemq.xml

修改conf目录下的activemq.xml文件,大概在70行左右,开启managementContext

<managementContext>

<managementContext createConnector="true" connectorPort="1099" connectorPath="/jmxrmi" jmxDomainName="org.apache.activemq"/>

</managementContext>
 建议:jmxDomainName以默认配置,否则,./activemq stop将关闭不了,如下图:

 

 

详见:https://issues.apache.org/jira/browse/AMQ-3082

或者使用嵌入式Broker,详情见: http://activemq.apache.org/how-do-i-embed-a-broker-inside-a-connection.html

 

第二步:创建JMXConnector

public class StateMonitor {


private static final String connectorPort = "1099";

private static final String connectorPath = "/jmxrmi";

private static final String jmxDomain = "jmx-domain";// 必须与activemq.xml中的jmxDomainName一致


public static void main(String[] args) throws Exception {

JMXServiceURL url = new JMXServiceURL("service:jmx:rmi:///jndi/rmi://localhost:" + connectorPort + connectorPath);

JMXConnector connector = JMXConnectorFactory.connect(url);

connector.connect();

MBeanServerConnection connection = connector.getMBeanServerConnection();

ObjectName name = new ObjectName(jmxDomain + ":brokerName=localhost,type=Broker");

BrokerViewMBean mBean = MBeanServerInvocationHandler.newProxyInstance(connection, name, BrokerViewMBean.class, true);


for (ObjectName queueName : mBean.getQueues()) {

QueueViewMBean queueMBean = MBeanServerInvocationHandler.newProxyInstance(connection, queueName, QueueViewMBean.class, true);


System.out.println("\n------------------------------\n");


// 消息队列名称

System.out.println("Queue Name --- " + queueMBean.getName());


// 队列中剩余的消息数

System.out.println("Queue Size --- " + queueMBean.getQueueSize());


// 消费者数

System.out.println("Number of Consumers --- " + queueMBean.getConsumerCount());


// 出队数

System.out.println("Number of Dequeue ---" + queueMBean.getDequeueCount());

}

}

}
 

一般可通过mBean获取所需要的监控信息!!!

此案例,只是一个简单的配置,要是上生产,则需要修改,进行实时的监控,可参考:https://github.com/liaomengge/spring-activemq

 

附:ActiveMQ常用的几个命令

activemq list --- 列出当前Broker名字
activemq bstat --- 显示当前Broker的统计信息
activemq browse --- 可以查询当前Broker为被消费的消息,会显示消息的详细信息,如消息头,消息内容,优先级等
activemq dstat ---可以用来查询队列的关键数值,如队列大小,生产者消费者数量,消息出队入队统计等。还可以支持通过类别查询,如只查询队列或者只查询主题
activemq console --- 以控制台启动activemq,便于查看启动的详情

 

参考文章:

http://www.tuicool.com/articles/ammUNn

http://my.oschina.net/jinghaichao/blog/57318?fromerr=0KwRYEGf

http://activemq.apache.org/jmx.html

《二》

从 ActiveMQ 5.9 开始,ActiveMQ 的集群实现方式取消了传统的Master-Slave 方式,增加了基于ZooKeeper + LevelDB的 Master-Slave实现方式,其他两种方式目录共享和数据库共享依然存在。 

三种集群方式的对比: 

(1)基于共享文件系统(KahaDB,默认): 


<persistenceAdapter>

<kahaDB directory="${activemq.data}/kahadb"/>

</persistenceAdapter>

(2)基于 JDBC:

<bean id="mysql-ds" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"> <property name="driverClassName" value="com.mysql.jdbc.Driver"/>

<property name="url" value="jdbc:mysql://localhost:3306/amq?relaxAutoCommit=true"/>

<property name="username" value="root"/>

<property name="password" value="root"/> <property name="maxActive" value="20"/>

<property name="poolPreparedStatements" value="true"/>

</bean>

<persistenceAdapter>

<jdbcPersistenceAdapter dataDirectory="${activemq.data}" dataSource="#mysql-ds" createTablesOnStartup="false"/>

</persistenceAdapter>

(3)基于可复制的 LevelDB(本文采用这种集群方式): 

LevelDB 是 Google开发的一套用于持久化数据的高性能类库。LevelDB并不是一种服务,用户需要自 行实现Server。是单进程的服务,能够处理十亿级别规模Key-Value 型数据,占用内存小。 

<persistenceAdapter>

<replicatedLevelDB

directory="${activemq.data}/leveldb"

replicas="3"

bind="tcp://0.0.0.0:0"

zkAddress="127.0.0.1:2181,127.0.0.1:2182,127.0.0.1:2183"

zkSessionTimeout="2s"

hostname="lmg-zk-01"

zkPath="/activemq/leveldb-stores"/>

</persistenceAdapter>

本文主要讲解基于 ZooKeeper 和LevelDB 搭建ActiveMQ 集群:

官方文档:http://activemq.apache.org/replicated-leveldb-store.html 

 

高可用的原理:使用ZooKeeper(集群)注册所有的ActiveMQ Broker。只有其中的一个Broker 可以提供 服务,被视为Master,其他的Broker 处于待机状态,被视为Slave。如果Master 因故障而不能提供服务,ZooKeeper 会从 Slave中选举出一个 Broker充当 Master。 Slave 连接 Master并同步他们的存储状态,Slave不接受客户端连接。所有的存储操作都将被复制到连接至 Master 的Slaves。如果 Master 宕了,得到了最新更新的 Slave 会成为 Master。故障节点在恢复后会重新加入到集群中并连接 Master 进入Slave 模式。 

解释:需要同步的 disk 的消息操作都将等待存储状态被复制到其他法定节点的操作完成才能完成。所以,如果你配置了replicas=3,那么法定大小是(3/2)+1=2。Master 将会存储并更新然后等待 (2-1)=1 个Slave存储和更新完成,才汇报 success。至于为什么是 2-1,熟悉 Zookeeper 的应该知道,有一个 node要作为观擦者存在。当一个新的Master 被选中,你需要至少保障一个法定node 在线以能够找到拥有最新 状态的node。这个node 可以成为新的Master。因此,推荐运行至少3 个replica nodes,以防止一个node失败了,服务中断。(原理与 ZooKeeper 集群的高可用实现方式类似)

一、activemq集群配置

前提:环境的搭建,均一台机器上

准备好3份activemq可执行的文件,

1)分别修改conf/activemq.xml,conf/jetty.xml文件如下:

<persistenceAdapter>

<replicatedLevelDB

directory="${activemq.data}/leveldb"

replicas="3"

bind="tcp://0.0.0.0:0"

zkAddress="127.0.0.1:2181,127.0.0.1:2182,127.0.0.1:2183"

zkSessionTimeout="2s"

hostname="lmg-zk-01"

zkPath="/activemq/leveldb-stores"/>

</persistenceAdapter>

为了避免冲突,确保端口和连接地址不一致,如下设置:

 

 uriport
activemq-1tcp://0.0.0.0:516168161
activemq-2tcp://0.0.0.0:516268162
activemq-3tcp://0.0.0.0:516368163

注意:3个activemq节点中的`brokerName`必须相同,否则不能加入集群

二、zookeeper集群的搭建

可参考:http://www.cnblogs.com/yjmyzz/p/4587663.html

三、校验

1)启动zk1,zk2,zk3,以及activemq-1,activemq-2,activemq3

2)验证

为了验证是否高可用,我们采用Zooinspector对集群节点状态进行监控,Zooinspector的安装见:https://github.com/liaomengge/zooinspector

分别开启3个Zooinspector进行监控,其一图如下:

00000000004这个节点中的`elected`不为null,说明此节点为Master节点,然后,手动kill掉该Master节点,观察Zooinspector的节点状态,如下:

00000000004被kill之后,00000000005提升为Master节点,继续运行,即搭建成功。

 

参考文章:

http://activemq.apache.org/replicated-leveldb-store.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值