【问题标题】:Service Fabric errors during IStatefulServiceReplica.ChangeRole(P)IStatefulServiceReplica.ChangeRole(P) 期间的 Service Fabric 错误
【发布时间】:2023-04-02 20:15:01
【问题描述】:

在我们的实时系统上,我们突然开始遇到错误,Service Fabric 无法进行故障转移。该系统最后一次部署是在 5 月,从那时起一直运行良好。我们尚未在虚拟机上安装任何更新。错误信息是:

Error event: SourceId='System.RA', Property='ReplicaChangeRoleStatus'. Replica had multiple failures during change role on _stdNT_4. API call: IStatefulServiceReplica.ChangeRole(P); Error = System.Fabric.FabricObjectClosedException (-2147017730) The object is closed. System.Runtime.InteropServices.COMException (-2147017730) Exception from HRESULT: 0x80071BFE at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) at Microsoft.ServiceFabric.Services.Remoting.V1.FabricTransport.Runtime.FabricTransportServiceRemotingListener.<>c__DisplayClass10_0.<b__0>d.MoveNext() --- End of stack trace from previous location where exception was thrown --- at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) at Microsoft.ServiceFabric.Services.Runtime.StatefulServiceReplicaAdapter.d__26.MoveNext() --- End of stack trace from previous location where exception was thrown --- at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) at Microsoft.ServiceFabric.Services.Runtime.StatefulServiceReplicaAdapter.d__18.MoveNext() For more information see: http://aka.ms/sfhealth

我们还看到 System.Fabric.ServiceFabricException。此操作期间发生错误。请查看跟踪日志以获取更多信息。

我在跟踪或虚拟机上的事件日志中找不到任何其他有用的错误。

唯一有趣的是,唯一受影响的服务是我们唯一一个有状态的服务。我们在上一个版本中使其成为有状态的,以便我们可以使用演员提醒。

一旦集群开始出现故障,它将永远将主节点从一个节点移动到另一个节点。我们通过重新部署到新集群解决了这个问题,但几天后问题又出现了。

我想要一些关于我们如何能够诊断问题的建议,或者是否有人看到过类似的情况。

使用 Service Fabric 版本 6.1.456、Asp.Net 核心版本 1.1.2 和 .net 框架版本 4.7.1。

【问题讨论】:

    标签: azure azure-service-fabric service-fabric-stateful


    【解决方案1】:

    有状态服务具有每个分区的主副本和辅助副本的概念。

    也就是说,只有主节点可以处理任何工作(读写操作),而从节点用于复制主节点中发生的状态更改。

    在配置这些副本时,SF 调用 Primary 接收“ChangeRole”并将其设置为主副本,这将调用 OpenAsync() 以打开侦听器以进行调用并执行与该副本相关的任何工作。

    当您进行升级或集群重新平衡您的服务时,它会再次调用 ChangeRole 以将主节点降级为辅助节点,这将取消取消令牌(您的服务在 OpenAsync 上收到的)并且它会关闭侦听器并且您应该停止服务中发生的任何工作(如循环或阻塞操作),如果 OnChangeRoleAsync 在您的服务上被覆盖,也会被调用。

    这种情况下的常见错误是您的代码没有监听令牌取消或遵守角色更改以停止任何待处理的工作,这将导致您的服务挂起角色更改,从而导致这些故障。

    如果您的服务未在合理的时间内响应这些 API 调用,Service Fabric 可以强制终止您的服务。通常这只发生在应用程序升级或服务被删除时。此超时默认为 15 分钟。

    查看此文档以获取更多信息: https://docs.microsoft.com/en-us/azure/service-fabric/service-fabric-reliable-services-lifecycle#stateful-service-startup

    【讨论】:

    • 您好 Diego,感谢您的回复。我们覆盖的唯一回调是 OnActivateAsync(),它会在几毫秒内完成。受影响的服务是一个参与者,其接口上的所有方法都很快返回 - 最多 5 秒左右,当然少于链接中提到的 15 分钟。我正在寻找更多日志的来源,这可能表明出了什么问题。
    • 如果您更新答案以添加来自 StatefulService 的代码,则可以提供更多信息以了解真正的问题。对于日志,如果你有 SF 6.2,你可以试试这个:docs.microsoft.com/en-us/azure/service-fabric/…
    猜你喜欢
    • 2018-10-05
    • 2016-10-19
    • 2017-06-17
    • 2018-03-01
    • 2019-05-30
    • 2017-04-17
    • 2018-01-25
    • 2016-03-16
    • 1970-01-01
    相关资源
    最近更新 更多