Artemis纯活跃集群缩容无法迁移消息,求可行解决方案
回答
ARTEMIS-3831文档里提到的「创建独立发现组及广播组」workaround是可行的,你尝试失败大概率是配置细节没匹配到位,结合你的Artemis 2.23.0 + jgroups-kubernetes环境,重点检查以下几点:
核心逻辑确认:这个workaround的本质是给缩容流程单独开辟一套不受待关闭broker影响的JGroups通信通道——原bug是缩容时待关闭broker的集群通道提前断开,导致消息分发的集群通信中断,独立通道能避开这个问题,逻辑本身是成立的。
配置隔离要彻底:
- 缩容专用的广播组、发现组必须使用完全独立的JGroups通道名,不能和主集群的通道重名(比如主集群用
artemis-cluster,缩容就用artemis-scale-down)。 - 缩容广播组的JGroups配置要和主集群保持一致(包括
useNotReadyAddresses="false"),但通道完全隔离,示例配置如下:<broadcast-groups> <!-- 主集群广播组 --> <broadcast-group name="main-broadcast"> <jgroups-channel>artemis-cluster</jgroups-channel> <jgroups-file>jgroups-kubernetes.xml</jgroups-file> </broadcast-group> <!-- 缩容专用广播组 --> <broadcast-group name="scale-down-broadcast"> <jgroups-channel>artemis-scale-down</jgroups-channel> <jgroups-file>jgroups-kubernetes.xml</jgroups-file> </broadcast-group> </broadcast-groups> <discovery-groups> <!-- 主集群发现组 --> <discovery-group name="main-discovery"> <broadcast-group-ref>main-broadcast</broadcast-group-ref> </discovery-group> <!-- 缩容专用发现组 --> <discovery-group name="scale-down-discovery"> <broadcast-group-ref>scale-down-broadcast</broadcast-group-ref> </discovery-group> </discovery-groups> <scale-down> <enabled>true</enabled> <discovery-group name="scale-down-discovery"/> <!-- 其他缩容参数(如消息迁移超时等) --> </scale-down>
- 缩容专用的广播组、发现组必须使用完全独立的JGroups通道名,不能和主集群的通道重名(比如主集群用
网络端口要开放:独立JGroups通道会使用单独的通信端口(默认7800,若自定义过需对应),要确保K8s的网络策略、StatefulSet的端口配置里开放这个端口,否则缩容时节点间无法通信。
适配
useNotReadyAddresses="false"设置:这个参数会让JGroups忽略NotReady状态的节点,缩容前要确保所有活跃broker处于Ready状态,避免待关闭broker进入NotReady后,缩容通道无法正常发现其他节点。
额外建议:如果条件允许,直接升级Artemis到2.25.0及以上版本——ARTEMIS-3831在这个版本之后已经被修复,能省去维护两套配置的麻烦;另外也可以关注ArtemisCloud的正式版,其缩容控制器可能已经优化了原生scale-down的问题,减少自定义配置的复杂度。
内容的提问来源于stack exchange,提问作者Bob Maloney
相关产品推荐
相关产品推荐

