本文档旨在指导在Red Hat Enterprise Linux 9.5系统上,利用NFS共享存储部署ActiveMQ 6.1.6主从集群,实现消息队列的高可用性。
系统要求
1.硬件要求:
- 最低配置:2核CPU、4GB内存、50GB磁盘空间(根据消息量调整)
- 网络要求:服务器间网络延迟需低于50ms(推荐万兆网络)
2.软件要求:
- 操作系统:Red Hat Enterprise Linux release 9.5 (Plow)
- NFS客户端:nfs-utils-2.5.4-27.el9.x86_64
- Java环境:OpenJDK 17+(通过YUM安装)
- ActiveMQ版本:apache-activemq-6.1.6-bin.tar.gz
- 依赖服务:YUM仓库已配置,防火墙开放NFS及ActiveMQ端口
安装步骤
1.安装NFS客户端
# 在两台服务器执行 yum install -y nfs-utils
2.创建挂载目录
mkdir -p /usr/local/activemq/data/kahadb
3.挂载NFS存储
mount -t nfs -o vers=3,tcp,async,rsize=1048576,wsize=1048576 10.6.36.122:/zejy_activemq /usr/local/activemq/data/kahadb
关键参数说明:
- vers=3:兼容旧版NFS协议(若服务端支持NFSv4可改用vers=4)
- async:异步写入提升性能(根据场景选择是否启用)
- rsize/wsize:优化大块数据传输效率
4.配置开机挂载(Systemd服务)
# 编辑文件:/etc/systemd/system/mnt-nfs.service [Unit] Description=NFS Mount Service After=network-online.target [Service] Type=oneshot ExecStart=/bin/mount -t nfs -o vers=3,tcp,async,rsize=1048576,wsize=1048576 10.6.36.122:/zejy_activemq /usr/local/activemq/data/kahadb [Install] WantedBy=multi-user.target
设置开机启动和启动nfs挂载
systemctl enable mnt-nfs systemctl start mnt-nfs
5.安装OpenJDK 17
官方文档说明正常运行ActiveMQ6.1.6版本需要Java compatibility:17+,因此我们首先需要在2台服务器上安装openjdk17。
yum install -y java-17-openjdk-*
6.配置环境变量
# 编辑文件:/etc/profile export JAVA_HOME=/usr/lib/jvm/java-17-openjdk export PATH=$JAVA_HOME/bin:$PATH export ACTIVEMQ_HOME=/usr/local/activemq export PATH=$ACTIVEMQ_HOME/bin:$PATH
使环境变量生效
source /etc/profile
7.下载ActiveMQ安装包
下载最新版本的ActiveMQ安装包需要访问官网,下载地址为:http://activemq.apache.org/download.html
在写文档的时候,最新版本为6.1.6版本,以下文档我们就用此版本来部署基于NFS共享文件系统的Activemq主从集群。
8.解压安装包
tar -xzvf apache-activemq-6.1.6-bin.tar.gz cp -arf apache-activemq-6.1.6/* /usr/local/activemq/
9.配置文件修改(主从节点相同)
(1)设置共享存储路径
修改activemq.xml中persistenceAdapter部分:
<!-- Persistence Adapter with Shared File System Locker -->
<persistenceAdapter>
<kahaDB directory="/usr/local/activemq/data/kahadb"
lockKeepAlivePeriod="2000"
enableJournalDiskSyncs="true"
journalMaxFileLength="256mb"
indexWriteBatchSize="4096"
concurrentStoreAndDispatchTopics="false"
concurrentStoreAndDispatchQueues="false"
checkForCorruptJournalFiles="true" >
<locker>
<shared-file-locker lockAcquireSleepInterval="5000" />
</locker>
</kahaDB>
</persistenceAdapter>
关键参数说明:
- directory=”/usr/local/activemq/data/kahadb”:指定 KahaDB 存储数据的目录。所有的消息日志文件、索引文件等都会存储在这个目录下。你需要确保该目录存在,并且 ActiveMQ 进程对其有读写权限。
- lockKeepAlivePeriod=”2000″:表示锁的保持活动周期,单位是毫秒。这里设置为 2000 毫秒(即 2 秒),意味着每 2 秒会检查一次锁的状态,以确保锁的有效性。
- enableJournalDiskSyncs=”true”:启用日志文件的磁盘同步。当设置为 true 时,写入日志文件的操作会同步到磁盘,这样可以保证数据的持久化,但会降低性能;设置为 false 则可以提高性能,但在系统崩溃时可能会丢失部分未同步的数据。
- journalMaxFileLength=”256mb”:指定日志文件的最大长度为 256MB。当日志文件达到这个大小后,会创建一个新的日志文件继续记录。
- indexWriteBatchSize=”4096″:索引写入的批量大小。表示每次写入索引时,会批量处理 4096 个操作,这样可以提高索引写入的性能。
- concurrentStoreAndDispatchTopics=”false”:对于主题(Topics),是否允许并发存储和分发消息。设置为 false 表示不允许并发操作,即存储和分发消息是串行进行的;设置为 true 则可以提高处理主题消息的性能,但可能会增加系统的复杂性。
- concurrentStoreAndDispatchQueues=”false”:对于队列(Queues),是否允许并发存储和分发消息。和 concurrentStoreAndDispatchTopics 类似,设置为 false 表示串行操作,设置为 true 可以提高队列消息的处理性能。
- checkForCorruptJournalFiles=”true”:是否在启动时检查日志文件是否损坏。设置为 true 会在启动时检查日志文件的完整性,如果发现损坏的文件会尝试进行修复;设置为 false 则跳过检查,启动速度会更快,但可能会导致使用损坏的日志文件。
- <shared-file-locker lockAcquireSleepInterval=”5000″ />:使用共享文件锁机制来确保在多节点环境下只有一个节点可以访问 KahaDB 存储。
- lockAcquireSleepInterval 属性表示在尝试获取锁失败后,线程休眠的时间间隔,单位是毫秒。这里设置为 5000 毫秒(即 5 秒),意味着每隔 5 秒会再次尝试获取锁。
(2)调整transportConnectors
按需调整transportConnectors,我这里仅保留了openwire。
<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"/>
</transportConnectors>
(3)修改brokerName名称、修改dataDirectory等
修改2台服务器上配置文件,在主从配置中2台服务器的配置是一样的。
<broker xmlns="http://activemq.apache.org/schema/core"
brokerName="yunweixia-ha"
useJmx="true"
advisorySupport="false"
persistent="true" deleteAllMessagesOnStartup="false"
useShutdownHook="false" schedulerSupport="true"
dataDirectory="${activemq.data}">
关键参数说明:
- brokerName=”yunweixia-ha”:标识当前消息代理的唯一名称,主从配置中2台服务器设置一样的名称。
- useJmx=”true”:启用 JMX(Java Management Extensions)监控和管理功能。
- advisorySupport=”false”:禁用通知消息(Advisory Messages)。通知消息用于广播代理事件(如队列创建、消费者连接等),禁用后可减少网络开销 • persistent=”true” :开启消息持久化:消息会被写入磁盘,确保代理重启后消息不丢失若设为false,消息仅存储在内存中。
- deleteAllMessagesOnStartup=”false”:禁用启动时删除所有消息,设为true会清空所有持久化消息。
- useShutdownHook=”false”:禁用JVM 关闭钩子(Shutdown Hook)。通常建议启用(true)以便优雅关闭代理,但容器化部署时可能需要禁用。
- schedulerSupport=”true”:启用消息调度功能(如延迟消息、定时任务)
- dataDirectory=”${activemq.data}”:指定消息持久化、日志等数据的存储目录。此目录非共享目录。
(4)调整plugins插件配置
修改2台服务器上的/usr/local/activemq/conf/activemq.xml,在标签中添加以下代码:
[root@yunweixia.com-test1 ~]# vi /usr/local/activemq/conf/activemq.xml
<plugins>
<simpleAuthenticationPlugin>
<users>
<authenticationUser username="${activemq.username}" password="${activemq.password}" groups="users,admins"/>
</users>
</simpleAuthenticationPlugin>
</plugins>
10.安全加固配置
(1)控制台访问控制
修改jetty.xml文件:
[root@yunweixia.com-test1 ~]# vi /usr/local/activemq/conf/jetty.xml
<!-- the default port number for the web console -->
<property name="host" value="0.0.0.0"/>
<property name="port" value="8161"/>
(2)登录凭证配置
修改jetty-realm.properties文件
# jetty-realm.properties admin: YourPassword, admin
11.创建Systemd服务
# 编辑文件:/usr/lib/systemd/system/activemq.service [Unit] Description=ActiveMQ Message Broker After=network.target [Service] Type=forking ExecStart=/usr/local/activemq/bin/activemq start ExecStop=/usr/local/activemq/bin/activemq stop User=root Restart=always [Install] WantedBy=multi-user.target
12.验证与测试
(1)服务状态检查
systemctl status activemq journalctl -u activemq -n 50 --no-pager
(2)主从切换验证
查看从节点日志:
tail -f /var/log/activemq/data/activemq.log INFO | Database /usr/local/activemq/data/kahadb/lock is locked by another server. This broker is now in slave mode waiting a lock to be acquired
总结扩展
此文档通过模块化结构设计,既可作为实施指南,也可作为运维知识库使用。建议部署前在测试环境完整验证流程。
技术评审
- 评审专家:保哥 | 某保险公司运维开发工程师
- 验证结论:验证通过
修订记录
- 2025-06-08 v1.0 初版发布
原创文章,作者:运维侠,如若转载,请注明出处:https://www.yunweixia.com/solutions/activemq-master-slave-cluster-deployment-guide-based-on-nfs-shared-storage.html