如何配置WildFly 10中ActiveMQ子系统的共享存储与复制功能
别发愁啦,我帮你梳理清楚WildFly 10上ActiveMQ子系统共享存储+复制的配置步骤,刚好适配你两台虚拟机的测试场景,一步步来肯定能搞定👇
- 两台虚拟机都安装好WildFly 10,版本保持完全一致
- 准备一个共享存储(测试用NFS最方便,生产可用SAN),在两台机器上挂载同一个目录,比如
/mnt/wildfly/shared-jms,并且确保WildFly进程对这个目录有读写权限 - 两台机器网络互通,开放集群相关端口:54321(ActiveMQ节点通信)、45700(JGroups组播)、7600(JGroups TCP),管理端口9990可选,方便查看状态
standalone-ha-full.xml配置 找到WildFly安装目录下的standalone/configuration/standalone-ha-full.xml,两台机器都要做以下修改:
2.1 配置ActiveMQ服务器的共享存储与复制
找到<subsystem xmlns="urn:jboss:domain:messaging-activemq:1.0">节点下的<server name="default">,替换为以下配置:
<server name="default"> <!-- 开启共享存储模式 --> <shared-store>true</shared-store> <!-- 启用持久化,指定共享存储的各类数据目录 --> <persistence-enabled>true</persistence-enabled> <journal-directory>/mnt/wildfly/shared-jms/journal</journal-directory> <bindings-directory>/mnt/wildfly/shared-jms/bindings</bindings-directory> <large-messages-directory>/mnt/wildfly/shared-jms/large-messages</large-messages-directory> <paging-directory>/mnt/wildfly/shared-jms/paging</paging-directory> <!-- 配置集群复制 --> <cluster password="my-cluster-pass"> <connector-ref connector-name="netty"/> <replication>true</replication> <discovery-group-ref discovery-group-name="default"/> </cluster> <!-- 保留原有其他配置,比如jms-queue、connection-factory等 --> </server>
💡 注意:cluster password两台机器必须设为同一个值;共享目录路径要和你实际挂载的路径完全匹配。
2.2 配置集群节点自动发现
确保<discovery-group>配置正确,它用来让两台节点自动找到彼此:
<discovery-group name="default"> <socket-binding>jgroups-mping</socket-binding> <refresh-timeout>10000</refresh-timeout> </discovery-group>
这个配置用JGroups的MPING组播机制,默认组播地址是230.0.0.4,如果你的虚拟机在同一网段,无需修改;如果不在同一网段,可以换成TCPPING(需要手动指定节点IP),测试场景用MPING足够。
2.3 检查Socket Bindings
找到<socket-binding-group>节点,确保集群相关的socket配置存在:
<socket-binding-group name="standard-sockets" default-interface="public" port-offset="${jboss.socket.binding.port-offset:0}"> <!-- 保留原有其他socket绑定,比如http、management等 --> <!-- JGroups集群通信相关 --> <socket-binding name="jgroups-mping" port="0" multicast-address="${jboss.default.multicast.address:230.0.0.4}" multicast-port="45700"/> <socket-binding name="jgroups-tcp" port="7600"/> <!-- ActiveMQ节点间通信 --> <socket-binding name="netty" port="54321"/> </socket-binding-group>
💡 如果第二台机器需要避免端口冲突,可以启动时加-Djboss.socket.binding.port-offset=100,这样所有端口都会自动加100。
2.4 调整本地连接器的Server ID
找到<in-vm-connector>和<in-vm-acceptor>的server-id,两台机器要设成不同值,比如第一台设0,第二台设1,避免本地VM通信冲突:
<connectors> <in-vm-connector name="in-vm" server-id="0"/> <!-- 第二台改成1 --> <!-- 其他连接器保留 --> </connectors> <acceptors> <in-vm-acceptor name="in-vm" server-id="0"/> <!-- 第二台改成1 --> <!-- 其他接收器保留 --> </acceptors>
第一台机器启动命令(绑定所有IP,方便另一台访问):
./bin/standalone.sh -c standalone-ha-full.xml -b 0.0.0.0 -bmanagement 0.0.0.0
第二台机器如果需要端口偏移,启动命令:
./bin/standalone.sh -c standalone-ha-full.xml -b 0.0.0.0 -bmanagement 0.0.0.0 -Djboss.socket.binding.port-offset=100
启动后查看控制台日志,出现类似Joined cluster [default]的信息,说明集群加入成功。
- 测试消息高可用:发送一条消息到某个队列,关闭第一台节点,第二台节点应该能自动接管队列,正常消费这条消息
- 检查共享存储:查看
/mnt/wildfly/shared-jms下的文件,两台节点都会读写这些文件,说明共享存储生效 - 查看集群状态:访问WildFly管理控制台(比如
http://你的节点IP:9990),进入Messaging->Servers->default->Cluster,能看到两个节点都在线
内容的提问来源于stack exchange,提问作者chris taylor

