运行环境
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&wireFormat.maxFrameSize=104857600&org.apache.activemq.transport.nio.SelectorManager.corePoolSize=50&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天没有信息的主题和队列。