运行环境

IP Hostname CPU Memory
192.168.0.110 node1 2C 4G
192.168.0.111 node2 2C 4G
  • 操作系统:Centos 7.4
  • apache-activemq 5.15.10

集群架构

本文系统架构如下:

环境准备

ActiveMQ安装比较简单,只需要准备好java环境就行,以下操作在两台节点进行。
1、安装java环境(本文不详述)
2、关闭防火墙

systemctl disable firewalld
systemctl stop firewalld

3、关闭selinux

setenforce 0
sed -i "s/SELINUX=enforcing/SELINUX=disabled/g" /etc/selinux/config

安装ActiveMQ

下载好ActiveMQ的安装包,解压。
tar zxf apache-activemq-5.15.10-bin.tar.gz -C /data

配置环境变量:

cat >> /etc/profile.d/activemq.sh << EOF
ACTIVEMQ_BIN=/data/apache-activemq-5.15.10/bin/linux-x86-64
PATH=\$PATH:\$ACTIVEMQ_BIN
export PATH ACTIVEMQ_BIN
EOF

启动ActiveMQ:
activemq start

如没有报错,那么ActiveMQ安装完成。

安全配置

ActiveMQ安装完成后,提供了一个web控制台,默认用户名密码是admin/admin。如果web控制台暴露出外网,那这个密码非常容易被攻破,建议修改。
  1. 确认conf/jetty.xml 配置项authenticate值改为 true,默认是true。
  2. 修改conf/jetty-realm.properties 设置用户名和密码,格式为 用户名:密码,角色名   3. 重启ActiveMQ

访问web控制台,http://192.168.100.110:8161

点击管理ActiveMQ,会弹出一个密码验证:

输入配置的用户名密码:

  除此之外,ActiveMQ的消息服务器broker默认是没有密码验证的,生产者和消费者可以直接通过tcp协议连接,这里也建议添加上密码验证。
  broker的密码验证有两种方式,一是添加访问密码,二是使用JAAS身份验证和授权,本文采用第一种添加访问密码。
在conf/activemq.xml文件中的的内加上:

<plugins>
        <simpleAuthenticationPlugin>
                <users>
                        <authenticationUser username="${activemq.username}" password="${activemq.password}" groups="users,admins"/>
                </users>
        </simpleAuthenticationPlugin>
</plugins>

  这里的username和password可以直接指定,也可以使用变量,如果使用变量,那么需要在conf/credentials.properties文件中配置。

activemq.username=yjc
activemq.password=yjc@123
guest.password=password

重启ActiveMQ后,生产者和消费者通过tcp协议连接时需要提交用户名和密码进行验证。

修改协议和网络模型

  ActiveMQ默认配置的协议都是使用BIO网络模型,在高并发的情况下,建议修改成非阻塞的NIO网络模型,提高性能。
  ActiveMQ默认提供了多种协议,如openwire、amqp、mqtt等,在新版本里,能通过auto关键字识别多种协议(除了ws协议),建议关闭不必要的协议,使用auto进行管理。
  修改conf/activemq.xml文件,注释掉默认提供的协议(如需ws协议,那不要注释ws协议),添加auto+nio协议,这里的端口按实际修改:

<transportConnector name="auto+nio" uri="auto+nio://0.0.0.0:61608?maximumConnections=5000&amp;wireFormat.maxFrameSize=104857600&amp;org.apache.activemq.transport.nio.SelectorManager.corePoolSize=50&amp;org.apache.activemq.transport.nio.SelectorManager.maximumPoolSize=100" />

重启ActiveMQ,使配置生效。

配置broker cluster集群

ActiveMQ集群的部署方式主要有下面2种:
1. Broker Cluster 模式:实现负载均衡,多个broker之间同步消息,已达到服务器负载的可能。
2. Master Slave 模式:实现高可用,当主服务器宕机时,备用服务器可以立即补充,以保证服务的运行。
  本文使用Broker Cluster模式,Broker-Cluster部署方式中,各个broker通过网络互相连接,并共享queue,保证消息同步。
  各个broker进行消息同步使用的是NetworkConnection (网络连接器),主要用于配置各个broker之间的网络通讯方式,用于服务器传递信息。 分为静态连接器和动态连接器。
  静态连接器过于局限,动态连接器可随意扩展服务器连接。但是由于动态连接使用组播方式实现节点发现,在大部分云环境里禁止了使用组播,所以本文使用静态连接。如果有需要使用动态连接,请自行修改。
  使用静态连接非常简单,只需要在<broker>内加上NetworkConnection:
node1上添加:

<networkConnectors>
    <networkConnector name="local_network" userName="yjc" password="yjc@123" uri="static:(auto+nio://192.168.100.111:61608)"/>
</networkConnectors>

node2上添加:

<networkConnectors>
    <networkConnector name="local_network" userName="yjc" password="yjc@123" uri="static:(auto+nio://192.168.100.110:61608)"/>
</networkConnectors>
  • 说明1:userName不修改成username,否则会报错。
  • 说明2:配置的用户名密码就是上文配置的broker密码验证。
  • 说明3:配置的uri就是上文修改的auto+nio协议。

重启ActiveMQ,使配置生效。这时候访问web管理平台,在Connections上能看到另一个节点的连接,那么集群已生效。

配置自动删除不活跃订阅者

  通常,我们不希望系统中存在长时间离线的持久订阅者,因为Broker需要为它们保留它们订阅的topic的所有消息。而且随着时间的推移,将会导致达到存储限制,从而导致系统变慢。
  可以通过JConsole或Web Console等管理工具来手动取消不活跃的持久订阅者,但这并不方便,通过配置文件,可以自动取消在一段时间内不活跃的持久订阅者。
在<broker>内加上以下参数:

<broker brokerName ="localhost" schedulerSupport="true" offlineDurableSubscriberTimeout="86400000" offlineDurableSubscriberTaskSchedule="3600000">
  • schedulerSupport:是否支持定时任务。
  • offlineDurableSubscriberTimeout: 删除非活动持久性订阅者的时间(以毫秒为单位)。 默认值-1,表示不删除它们。
  • offlineDurableSubscriberTaskSchedule:检查频率(以毫秒为单位),默认值300000。

上面的配置示例,表明broker会每小时检查并删除已离线1天的订阅者。

配置自动删除过期主题和队列

  ActiveMQ 使用时会自动创建Destination,默认情况下不会删除,所以主题和队列只增加不减少。
  一般情况下,可以通过 web 控制台或是 JMX 方式来删除掉,当然,也可以通过配置,使得 broker 可以自动探测到无用的队列(一定时间内为空的队列)并删除掉,回收响应资源。
在<broker>内加上以下参数:

<broker brokerName ="localhost" schedulerSupport="true"  schedulePeriodForDestinationPurge="3600000">

在<destinationPolicy>内添加以下参数:

<policyEntry queue=">" gcInactiveDestinations="true" inactiveTimoutBeforeGC="86400000"/>
  • schedulePeriodForDestinationPurge: 检查频率, 默认为0,此功能关闭
  • gcInactiveDestinations: true为删除掉不活动队列,默认为false
  • inactiveTimoutBeforeGC: 不活动时间, 默认为60秒

上面的配置示例,表明broker会每小时检查并删除1天没有信息的主题和队列。