Akka.net集群Lighthouse/Seed节点是否需要配置split brain resolver?
配置问题核查结果
1. Lighthouse节点存在2个严重配置错误
- 多余的Sharding配置:你的推测正确,Lighthouse仅作为种子节点不需要承载分片逻辑,当前配置的
akka.cluster.sharding块完全冗余,不仅额外占用内存CPU,还会导致不必要的分片元数据同步开销,直接删除即可。 - Split Brain Resolver(SBR)配置完全错误:
- 全集群所有节点的SBR策略必须完全统一,你当前QueueServicer用
keep-majority策略、Lighthouse用keep-oldest策略,两类节点的集群视图逻辑完全冲突,会导致正常节点被标记为不可达,直接拒绝连接请求。 - 你为Lighthouse配置的
keep-oldest策略开启了down-if-alone = on,而Lighthouse总共只有2个实例,只要其中1个实例宕机,剩余的1个实例会判定自己是孤立节点自动下线,最终所有种子节点全部退出集群,新节点自然无法加入。 - 种子节点不是不需要配置SBR,而是必须和业务节点的SBR配置完全一致,否则脑裂恢复逻辑会完全错乱。
- 全集群所有节点的SBR策略必须完全统一,你当前QueueServicer用
2. QueueServicer节点配置基本合理,仅需配合全集群统一SBR规则即可
当前QueueServicer的分片、SBR配置本身没有逻辑问题,只要保证Lighthouse节点的SBR配置和它完全一致即可。
异常现象原因对应
你观察到的无法连接、CPU/内存占用高、GC耗时久、无队列Actor日志都是配置错误的直接结果:
- Lighthouse节点已经因为SBR配置错误全部下线/拒绝外部连接,所以QueueServicer节点抛出
Connection refused错误 - 节点持续重试连接种子节点,不断创建销毁连接、打印重试日志,同时分片初始化逻辑一直等待集群加入成功,大量临时对象被创建销毁,导致CPU、内存占用高,GC耗时过长
- 节点未成功加入集群,分片Actor无法启动,自然没有队列处理Actor的运行日志
修复步骤
第一步:先排查基础网络问题
先在无法加入的QueueServicer节点上执行网络连通性校验,排除防火墙/网络策略问题:
telnet lighthouse-0 7892 telnet lighthouse-1 7892
如果无法连通,先处理网络策略放行对应端口。
第二步:修正Lighthouse节点HOCON配置
删除冗余的Sharding配置,统一SBR策略和QueueServicer完全一致:
akka { loggers = ["Akka.Logger.log4net.Log4NetLogger, Akka.Logger.log4net"] log-config-on-start = on loglevel = "DEBUG" actor { provider = cluster serializers { hyperion = "Akka.Serialization.HyperionSerializer, Akka.Serialization.Hyperion" } serialization-bindings { "System.Object" = hyperion } } remote { dot-netty.tcp { # 保留原有端口、主机名配置 } } cluster { seed-nodes = ["akka.tcp://myapp@lighthouse-0:7892","akka.tcp://myapp@lighthouse-1:7892"] roles = ["lighthouse"] downing-provider-class = "Akka.Cluster.SplitBrainResolver, Akka.Cluster" split-brain-resolver { active-strategy = keep-majority stable-after = 20s keep-majority { role = "QueueProcessor" } } down-removal-margin = 20s } }
第三步:重启集群恢复
- 先停止所有Lighthouse、QueueServicer节点
- 先启动2个Lighthouse节点,确认节点正常启动、互相加入集群成功
- 再逐个启动3个QueueServicer节点,确认节点正常加入集群,分片Actor正常启动
内容的提问来源于stack exchange,提问作者user738338
相关产品推荐
相关产品推荐

