JetStream集群消费者无Quorum停滞问题的排查与修复咨询
这些告警日志表示JetStream的集群消费者无法达成法定人数(Quorum),已经停止工作(stalled)。
拆解日志中的关键信息:
nbo > notification > Hermes_xxx_notification:这是JetStream消费者的标识,格式为账户 > 流(Stream)名称 > 消费者名称,其中Hermes_xxx_notification是你的通知服务Hermes创建的集群消费者实例。has NO quorum, stalled:JetStream集群消费者依赖多副本机制保证高可用,需要超过半数的副本节点在线且正常通信才能维持Quorum(3个节点的集群中,Quorum为2)。当副本节点无法达成一致时,消费者会停止处理消息,避免数据不一致。
出现这个问题的常见原因包括:
- 部分NATS Pod离线或状态异常
- Pod之间存在网络分区,导致副本节点无法通信
- NATS节点资源不足(CPU/内存),无法处理JetStream的同步请求
- 消费者副本配置异常,或副本同步出现故障
针对你的环境(3个NATS Pod、2.6.5版本),可以按以下步骤排查修复:
检查NATS集群状态
执行nats server list命令,查看3个Pod的在线状态,确认是否有节点显示unavailable。如果有离线节点,先恢复该Pod(比如在K8s中重启Pod、检查Pod的资源限制或节点调度问题)。查看消费者副本详情
针对日志中的某个消费者(比如Hermes_Z6YxJu8DajHFPJHexMQ5A9_notification),执行nats consumer info nbo notification Hermes_Z6YxJu8DajHFPJHexMQ5A9_notification,查看消费者的副本分布和状态,确认是否有副本处于异常状态。排查网络连通性
检查NATS Pod之间的网络是否正常:可以在Pod内部ping其他Pod的IP,或者用nats ping命令测试节点间的连通性。如果存在网络分区,需要修复K8s集群的网络插件配置。重建异常消费者
如果消费者副本无法自动恢复,先删除异常消费者:nats consumer delete nbo notification Hermes_Z6YxJu8DajHFPJHexMQ5A9_notification然后让Hermes服务重新创建消费者。注意删除前确认未处理的消息是否可以重新消费,或已被其他副本处理。
升级NATS版本(推荐)
2.6.5版本存在不少JetStream的已知bug(包括Quorum处理、副本同步等问题),升级到较新的稳定版本(如2.9.x或更高)可以大幅减少这类异常的发生。检查资源配置
确认NATS Pod的CPU、内存资源是否满足需求,资源不足会导致节点无法及时处理JetStream的同步请求,进而丢失Quorum。可以查看Pod的监控指标(CPU使用率、内存占用),调整资源限制。
内容的提问来源于stack exchange,提问作者Mohammad Reza Karimi

