Akka.net:我是否应该为 Lighthouse/Seed 个节点指定 "split brain resolver" 配置

Akka.net: Should I specify "split brain resolver" configuration for Lighthouse/Seed nodes

我有此应用程序使用 Akka.net 集群功能。编写代码的人已经离开公司。 我正在尝试理解代码,我们正在计划部署。

集群有两种类型的节点

QueueServicer:支持分片,只有这些节点应该参与分片。
LightHouse:它们只是种子节点,没有别的。

灯塔:2 个节点
QueueServicer:3 个节点

我发现其中一个 QueueServicer 节点无法加入集群。两个灯塔节点都拒绝连接。它不断尝试加入,但从未成功。这种情况在过去 5 天左右一直在发生,而且节点也永远不会死。它的 CPU 和内存使用率很高。此外,当通过日志进行过滤搜索时,它没有任何队列处理器参与者 运行。垃圾收集等需要很长时间。我在该节点的日志中看到以下内容。

{"timestamp":"2021-09-08T22:26:59.025Z", "logger":"Akka.Event.DummyClassForStringSources", "message": 尝试关联无法访问的远程地址 [akka.tcp://myapp@lighthouse-1:7892]。地址现在被门控 5000 毫秒,所有发往该地址的消息都将传送到死信。原因:[关联失败 akka.tcp://myapp@lighthouse-1:7892] 原因:[System.AggregateException:发生了一个或多个错误。 (连接被拒绝 akka.tcp://myapp@lighthouse-1:7892)---> Akka.Remote.Transport.InvalidAssociationException:连接被拒绝 akka.tcp://myapp@lighthouse-1:7892 Akka.Remote.Transport.DotNetty.TcpTransport.AssociateInternal(Address remoteAddress) at Akka.Remote.Transport.DotNetty.DotNettyTransport.Associate(Address remoteAddress) --- 内部异常堆栈跟踪结束 --- at System.Threading.Tasks.Task1.GetResultCore(Boolean waitCompletionNotification) at Akka.Remote.Transport.ProtocolStateActor.<>c.<InitializeFSM>b__12_18(Task1 结果) at System.Threading.Tasks.ContinuationResultTaskFromResultTask`2.InnerInvoke() 在 System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext,ContextCallback 回调,对象状态)

{"timestamp":"2021-09-08T22:26:59.025Z", "logger":"Akka.Event.DummyClassForStringSources", "message": 尝试关联无法访问的远程地址[akka.tcp://myapp@lighthouse-0:7892]。地址现在被门控 5000 毫秒,所有发往该地址的消息都将传送到死信。原因:[关联失败 akka.tcp://myapp@lighthouse-0:7892] 原因:[System.AggregateException:发生一个或多个错误。 (连接被拒绝 akka.tcp://myapp@lighthouse-0:7892)---> Akka.Remote.Transport.InvalidAssociationException:连接被拒绝 akka.tcp://myapp@lighthouse-0:7892 Akka.Remote.Transport.DotNetty.TcpTransport.AssociateInternal(Address remoteAddress) at Akka.Remote.Transport.DotNetty.DotNettyTransport.Associate(Address remoteAddress) --- 内部异常堆栈跟踪结束 --- at System.Threading.Tasks.Task1.GetResultCore(Boolean waitCompletionNotification) at Akka.Remote.Transport.ProtocolStateActor.<>c.<InitializeFSM>b__12_18(Task1 结果) at System.Threading.Tasks.ContinuationResultTaskFromResultTask`2.InnerInvoke() 在 System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext,ContextCallback 回调,对象状态)

还有其他“正在监督”、“正在停止”、“已启动”的日志,我在这里省略了。

能否请您验证 HCON 配置是否适用于裂脑解析器和分片?

我认为 LightHouse/SeeNodes 不应该指定分片配置。我认为这是一个错误。 我还认为,LightHouse/SeedNodes 中的裂脑解析器配置可能有误,不应为种子节点指定。

感谢您的帮助。

这是 QueueServicer Trimmed 的 HOCON

阿卡{
loggers = ["Akka.Logger.log4net.Log4NetLogger, Akka.Logger.log4net"]
log-config-on-start = on
日志级别 =“调试”
演员 {
提供商 = 集群
序列化器 {
hyperion = "Akka.Serialization.HyperionSerializer, Akka.Serialization.Hyperion"
}
序列化绑定 {
"System.Object" = 超离子
}
}

remote {
    dot-netty.tcp {
    ….
    }
}

cluster {
    seed-nodes = ["akka.tcp://myapp@lighthouse-0:7892",akka.tcp://myapp@lighthouse-1:7892"]
    roles = ["QueueProcessor"]
    sharding {
        role = "QueueProcessor"
        state-store-mode = ddata
        remember-entities = true
        passivate-idle-entity-after = off
    }

    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
}

extensions = ["Akka.Cluster.Tools.PublishSubscribe.DistributedPubSubExtensionProvider,Akka.Cluster.Tools"]

}

这是 Lighthouse 的 HOCON

阿卡{
loggers = ["Akka.Logger.log4net.Log4NetLogger, Akka.Logger.log4net"]
log-config-on-start = on
日志级别 =“调试”
演员 {
提供商 = 集群
序列化器 {
hyperion = "Akka.Serialization.HyperionSerializer, Akka.Serialization.Hyperion"
}
序列化绑定 {
"System.Object" = 超离子
}
}

remote {
    dot-netty.tcp {
    …
    }
}

cluster {
    seed-nodes = ["akka.tcp://myapp@lighthouse-0:7892",akka.tcp://myapp@lighthouse-1:7892"]
    roles = ["lighthouse"]
    sharding {
        role = "lighthouse"
        state-store-mode = ddata
        remember-entities = true
        passivate-idle-entity-after = off
    }

    downing-provider-class = "Akka.Cluster.SplitBrainResolver, Akka.Cluster"
    split-brain-resolver {
                                  active-strategy = keep-oldest
                                  stable-after = 30s
              keep-oldest {
            down-if-alone = on
            role = "lighthouse"
              }
      }
 }

}

我本来打算早点回复的。

这是您的问题:您正在使用两种不同的裂脑解析器配置 - 一种用于 QueueServicer,一种用于 Lighthouse。因此,您的集群如何自行解决将完全不同,具体取决于谁是集群每一半的领导者

我会坚持简单的保持多数策略并在整个集群的所有节点上统一使用它 - 我们很可能会在 Akka.NET v1.5 中默认启用它。

如有任何疑问,请随时与我们联系:https://petabridge.com/