ActiveMQ的集群是依赖于Zookeeper的,ActiveMq的集群是,主从集群的方式,主的挂掉,才会自动切换到从,从的才开始运行。
3个Activemq服务, 同一时间仅Master队列提供服务,当Master队列挂掉后,其它2个Slaver自动选举出1个成为Master,整个队列服务依然可用。
当挂掉的队列重新恢复后,自动加入集群。当集群仅剩下1个队列时,整个队列不可用!
zookeeper架构
服务器名称 |
端口 |
IP地址 |
主从状态 |
db1 |
2181 |
10.51.52.224 |
主服务器 |
db2 |
2181 |
10.51.52.220 |
从服务器 |
db3 |
2181 |
10.51.52.223 |
从服务器 |
activemq架构
服务器名称 |
端口 |
IP地址 |
主从状态 |
db1 |
61616 |
10.51.52.224 |
主服务器 |
db2 |
61616 |
10.51.52.220 |
从服务器 |
db3 |
61616 |
10.51.52.223 |
从服务器 |
安装ActiveMq
官网下载地址:https://activemq.apache.org/components/classic/download
本次使用的安装包为apache-activemq-5.13.0-bin.tar.gz
#解压安装包,解压到node1目录,注意-C是大写的 tar -zxvf apache-activemq-5.13.0-bin.tar.gz -C /opt
mv apache-activemq-5.13.0 activemq
#修改jetty vim /opt/activemq/conf/jetty.xml #修改管控台端口 ,同样其他几个节点也修改
<property name="host" value="0.0.0.0"/>
<property name="port" value="8161"/>
#修改brokername #3个MQ实例的brokerName必须一致,要不然你会在集群启动时出现: #Not enough cluster members when using LevelDB replication 这样的错误。 vim /opt/activemq/conf/activemq.xml
<broker xmlns="http://activemq.apache.org/schema/core" brokerName="activemq-cluster" dataDirectory="${activemq.data}"> #修改persistenceAdapter # replicas 节点数 # bind 绑定地址 # zkAddress zookeeeper的集群地址 # hostname 主机名称 # zkPath mq在zookeeepr上存储的地址
directory="${activemq.data}/leveldb"
replicas="3"
bind="tcp://0.0.0.0:0"
zkAddress="10.51.52.223:2181,10.51.52.224:2181,10.51.52.220:2181"
zkPath="/opt/activemq/leveldb-stores"
hostname="10.51.52.224"
#修改通信端口
<transportConnectors>
<!-- DOS protection, limit concurrent connections to 1000 and frame size to 100MB -->
<transportConnector name="openwire" uri="tcp://0.0.0.0:61616?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>
综上
配置文件:/opt/activemq/conf/activemq.xml、/opt/activemq/conf/jetty.xml 数据目录:/opt/activemq/data 启动:/opt/activemq/bin/activemq start 关闭:/opt/activemq/bin/activemq stop
查看日志
/opt/activemq/data/activemq.log
查看启动进程信息
root@xxx /opt]# jps 15826 activemq.jar 23042 Jps 21763 QuorumPeerMain 28260 Main 4892 startup.jar 15695 Elasticsearch
连接zookeeper查看节点信息
./zkCli.sh [zk: localhost:2181(CONNECTED) 1] ls /opt/activemq/leveldb-stores [00000000036, 00000000039, 00000000037]
然后就是测试了!
activemq控制台
http://192.168.1.1:8161/admin
一次问题排查过程记录
突然部分客户反映收不到验证码,经测试,部分能收到,部分不能收到
解决过程:
1.检查集群搭建问题
activemq+zookeeper集群因为以前一直在使用,是突然发现部分客户偶尔收不到验证码,可以大概知道不是集群搭建的问题。
2.检查程序是否运行异常
查看程序运行日志,并无异常,重启服务,发现收到很多条之前未接受到的验证码,怀疑是消息队列阻塞问题。
3.进入acctivemq控制台查看队列情况,如下图
之前有一千多条,可以看出是消息队列中的数据未被消费者消费,点击进去可查看具体运行程序的线程端口号是多少,
由于之前解决时未截图,现在没有了,此处就省略了
得到远程运行程序线程号为55270,去服务器后台查看对应远程程序的线程
netstat -na |grep 55270 netstat -natp |grep 55270
上面可以查到对应的进程号ESTABLISHED 28490/java ,28490,然后通过该进程号查看对应服务
ps -ef |grep 28490
之后就是进去看这个服务有啥问题了
问题到这儿就解决了!