代码之家  ›  专栏  ›  技术社区  ›  Code Monkey

IStatefulServiceReplica期间出现服务结构错误。改变角色(P)

  •  0
  • Code Monkey  · 技术社区  · 6 年前

    在我们的实时系统上,我们突然开始遇到错误,服务结构无法进行故障切换。该系统上次部署是在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

    我们也看到了这个系统。织物ServiceFabriceException。此操作期间出错。有关更多信息,请查看跟踪日志。

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

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

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

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

    使用ServiceFabric版本6.1.456,Asp。Net核心版本1.1.2和。net framework 4.7.1版。

    1 回复  |  直到 6 年前
        1
  •  0
  •   Diego Mendes    6 年前

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

    这意味着,只有主服务器可以处理任何工作(读写操作),而次服务器用于复制主服务器中发生的状态更改。

    在设置这些副本时,SF调用主接收以“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