ActiveMQ主从集群部署文档(基于NFS共享存储)

本文档旨在指导在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主从集群。ActiveMQ主从集群部署文档(基于NFS共享存储)

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

(0)
运维侠的头像运维侠共建用户
上一篇 2025年6月7日 18:11
下一篇 2025年6月9日 18:11

相关推荐

发表回复

登录后才能评论