Docker容器部署ActiveMQ Artemis HA集群配置故障排查
问题根因与修复方案
1. broker.xml核心配置错误修复
1.1 acceptor绑定地址错误
当前主/从节点的acceptor都绑定到了localhost,该地址仅允许容器内部进程访问,其他容器、宿主机都无法建立连接,直接导致主从节点无法通信:
- 主节点修复:将
<acceptor name="netty-acceptor">tcp://localhost:61616</acceptor>改为<acceptor name="netty-acceptor">tcp://0.0.0.0:61616</acceptor> - 从节点修复:将
<acceptor name="netty-acceptor">tcp://localhost:61617</acceptor>改为<acceptor name="netty-acceptor">tcp://0.0.0.0:61617</acceptor>
1.2 connector广播地址错误
主/从节点的netty-connector配置为localhost地址,该地址通过广播同步到其他节点后,其他节点会尝试访问自身的localhost端口,无法定位到对应节点:
- 主节点修复:将
<connector name="netty-connector">tcp://localhost:61616</connector>改为<connector name="netty-connector">tcp://172.20.0.100:61616</connector> - 从节点修复:将
<connector name="netty-connector">tcp://localhost:61617</connector>改为<connector name="netty-connector">tcp://172.20.0.101:61617</connector>
1.3 集群同步地址配置错误
主节点的cluster-connection中address配置为jms,仅会同步jms前缀的地址信息,无法覆盖HA集群所需的全量同步:
- 主节点修复:将
<address>jms</address>改为<address/>
2. Docker网络适配修复
Docker默认的自定义bridge网络未开启UDP组播支持,当前使用的组播发现机制无法正常工作,可选两种修复方案:
方案A:改用静态集群发现(更稳定,推荐)
删除主从节点配置中的broadcast-groups和discovery-groups段,修改cluster-connection配置为静态连接器引用:
- 主节点修改:
<cluster-connections> <cluster-connection name="my-cluster"> <address/> <connector-ref>netty-connector</connector-ref> <retry-interval>500</retry-interval> <use-duplicate-detection>true</use-duplicate-detection> <message-load-balancing>ON_DEMAND</message-load-balancing> <max-hops>1</max-hops> <static-connectors> <connector-ref>server1-connector</connector-ref> </static-connectors> </cluster-connection> </cluster-connections>
- 从节点修改:
<cluster-connections> <cluster-connection name="my-cluster"> <address/> <connector-ref>netty-connector</connector-ref> <retry-interval>500</retry-interval> <use-duplicate-detection>true</use-duplicate-detection> <message-load-balancing>ON_DEMAND</message-load-balancing> <max-hops>1</max-hops> <static-connectors> <connector-ref>server0-connector</connector-ref> </static-connectors> </cluster-connection> </cluster-connections>
方案B:开启Docker网络组播支持
修改docker-compose.yml的网络配置,开启组播:
networks: artemis-cluster-network: driver: bridge ipam: config: - subnet: 172.20.0.0/16 driver_opts: com.docker.network.enable_ipv6: "false" com.docker.network.driver.mtu: 1500
3. Java客户端适配修复
如果客户端运行在宿主机上,宿主机与Docker容器不在同一二层网络,无法接收容器内发出的UDP组播包,建议修改客户端逻辑,使用静态连接器列表连接集群:
// 替换为实际宿主机IP String host = "你的宿主机IP"; TransportConfiguration[] transportConfigs = new TransportConfiguration[] { new TransportConfiguration(NettyConnectorFactory.class.getName(), Map.of("host", host, "port", "61616")), new TransportConfiguration(NettyConnectorFactory.class.getName(), Map.of("host", host, "port", "61618")) }; ConnectionFactory jmsConnectionFactory = ActiveMQJMSClient.createConnectionFactoryWithHA(JMSFactoryType.CF, transportConfigs); // 连接时需要传入你配置的账号密码 Connection jmsConnection = jmsConnectionFactory.createConnection("admin", "admin");
验证步骤
- 重建容器:执行
docker-compose down -v && docker-compose up --build - 查看主节点日志,出现
Backup server is connected类日志即主从连接成功 - 查看从节点日志,出现
Applying for replication、Successfully synced with master类日志即备份节点启动正常
内容的提问来源于stack exchange,提问作者Bernard Burn
相关产品推荐
相关产品推荐

