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>
配置登录密码
vim jetty-realm.properties
admin: admin, admin
user: user, user
账号:密码,角色
(注意:密码使用特殊符号可以无法登录web)
综上
配置文件:/opt/activemq/conf/activemq.xml、/opt/activemq/conf/jetty.xml 、/opt/activemq/conf/jetty-realm.properties
数据目录:/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]
找到对应的内容后,可以使用命令‘get’查看ZooKeeper中的数据内容,其中主节点的elected及address属性一定有数据。从节点则数据为‘null’。
例:
然后就是测试了!
activemq控制台
一次问题排查过程记录
突然部分客户反映收不到验证码,经测试,部分能收到,部分不能收到
解决过程:
1.检查集群搭建问题
activemq+zookeeper集群因为以前一直在使用,是突然发现部分客户偶尔收不到验证码,可以大概知道不是集群搭建的问题。
2.检查程序是否运行异常
查看程序运行日志,并无异常,重启服务,发现收到很多条之前未接受到的验证码,怀疑是消息队列阻塞问题。
3.进入acctivemq控制台查看队列情况,如下图
之前有一千多条,可以看出是消息队列中的数据未被消费者消费,点击进去可查看具体运行程序的线程端口号是多少,
由于之前解决时未截图,现在没有了,此处就省略了
得到远程运行程序线程号为55270,去服务器后台查看对应远程程序的线程
netstat -na |grep 55270
netstat -natp |grep 55270
上面可以查到对应的进程号ESTABLISHED 28490/java ,28490,然后通过该进程号查看对应服务
ps -ef |grep 28490
之后就是进去看这个服务有啥问题了
问题到这儿就解决了!
好记性不如烂笔头,最难不过坚持