ActiveMQ消息队列集群搭建

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&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>

 

配置登录密码

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控制台

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

之后就是进去看这个服务有啥问题了

问题到这儿就解决了!

 

posted @ 2022-01-10 11:33  叮伱格斐呃  阅读(311)  评论(0编辑  收藏  举报
Live2D