在我们的实时系统上,我们突然开始遇到错误,其中Service Fabric无法执行故障转移。该系统上次部署于5月,此后一直运行良好。我们尚未在VM上安装任何更新。错误消息是:
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。在此操作期间发生错误。请检查跟踪日志以获取更多信息。
在跟踪或VM的事件日志中找不到其他有用的错误。
唯一有趣的是,受影响的唯一服务是我们的唯一一个有状态服务。在上一发行版中我们将其设置为有状态,以便我们可以使用角色提醒。
一旦群集开始发生故障,它将继续将主节点从一个节点永久移动到另一个节点。我们通过重新部署到新的群集来解决了该问题,但是几天后问题又回来了。
我想就如何诊断问题或是否有人看到过类似问题提出一些建议。
使用Service Fabric版本6.1.456,Asp.Net核心版本1.1.2和.net Framework版本4.7.1。
答案 0 :(得分:0)
有状态服务具有每个分区的主副本和辅助副本的概念。
这意味着,只有主服务器可以处理任何工作(读写操作),而辅助服务器则用于复制主服务器中发生的状态更改。
在设置这些副本时,SF调用Primary接收方的“ ChangeRole”并将其设置为Primary副本,这将调用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