如何从 Service Fabric 运行时 restart/recycle 底层 VM
How to restart/recycle underlying VM from Service Fabric runtime
当应用处于不良状态时,我想实现以下恢复尝试:
- 正在重新启动应用本身
- 正在重新启动基础 VM
- 重建底层 VM
使用 Cloud Service 调用 Environment.FailFast
并自动触发上述序列就足够了。
如何使用 Service Fabric 实现同样的功能?目前它被用作 VM 规模集之上的 deployment/maintenance 层(每个 VM 一个应用程序实例)。
更新:无法使用 Service Fabric 执行此操作。对于我们的服务,我们决定直接在 VM 规模集之上构建它。希望我们也能看到基于 VM 规模集构建的 Cloud Service v2,它将处理 deployment/maintenance.
Service Fabric 具有重启失败应用程序的内置机制,但 Service Fabric 不理解 'bad state' 是什么。如果应用程序失败并且进程关闭,SF 将重新启动它几次,直到它放弃并认为该应用程序已损坏并阻止重新启动。
如果它偶尔发生,例如,一周几次,它不会有任何问题,因为它会在多长时间内将连续失败视为同一问题的一部分。
当您说 Bad State 时,每个应用程序可能对 Bad State, 有不同的概念,因此无法识别 SF它除非应用程序通过健康事件报告它。
示例:
- The application might be consuming too memory (memory leak) 你唯一能做的就是限制app memory setting a limit,SF不知道那是leak,也许是内存消耗部分的设计你的申请。
- 另一个问题,API 由于配置无效或相关服务已关闭而返回错误响应。如果错误是由于应用程序故障或您的服务设计造成的,则服务结构不会打结。
在这些情况下,您必须实施一种机制来告诉 SF 这些错误不是预期的,并且 SF 将为您处理故障转移。您可以将其实现为:
- 你的应用程序的一部分,它会发出自己的健康报告
- 集群中的监视程序应用程序 运行 监视服务事件或日志并代表其他服务发出事件。
对于第一种方法,将此报告为 发生故障 的快速方法是使用 ReportFault:
Enables the replica to report a fault to the runtime and indicates
that it has encountered an error from which it cannot recover and must
either be restarted or removed.
有关其他健康报告的更多信息,请查看此文档:Service Fabric health reports
对于您问题的第 2 项和第 3 项,
有一种机制可以识别集群中的节点何时不可用,它会被降级并且 SF 会暂时将其从 RING 中移除。常见问题是当网络问题阻止节点相互通信时,在某些情况下,内存不足可能会影响 SF 主机管理器并且它开始失败,响应缓慢,然后 SF 将从可用节点列表中删除该节点,直到它恢复健康。
我不知道 SF 中的某些东西确实会重启 VM,可能是因为前面提到的相同原因,它会在 SF Explorer 中引发故障以通知该问题,您将不得不处理它。
您可以将解决方案作为上述看门狗方法的一部分,它将 Disable-ServiceFabricNode
to move any Healthy services from the node, and then you can restart the underlying VM using the Azure SDK。
当应用处于不良状态时,我想实现以下恢复尝试:
- 正在重新启动应用本身
- 正在重新启动基础 VM
- 重建底层 VM
使用 Cloud Service 调用 Environment.FailFast
并自动触发上述序列就足够了。
如何使用 Service Fabric 实现同样的功能?目前它被用作 VM 规模集之上的 deployment/maintenance 层(每个 VM 一个应用程序实例)。
更新:无法使用 Service Fabric 执行此操作。对于我们的服务,我们决定直接在 VM 规模集之上构建它。希望我们也能看到基于 VM 规模集构建的 Cloud Service v2,它将处理 deployment/maintenance.
Service Fabric 具有重启失败应用程序的内置机制,但 Service Fabric 不理解 'bad state' 是什么。如果应用程序失败并且进程关闭,SF 将重新启动它几次,直到它放弃并认为该应用程序已损坏并阻止重新启动。
如果它偶尔发生,例如,一周几次,它不会有任何问题,因为它会在多长时间内将连续失败视为同一问题的一部分。
当您说 Bad State 时,每个应用程序可能对 Bad State, 有不同的概念,因此无法识别 SF它除非应用程序通过健康事件报告它。
示例:
- The application might be consuming too memory (memory leak) 你唯一能做的就是限制app memory setting a limit,SF不知道那是leak,也许是内存消耗部分的设计你的申请。
- 另一个问题,API 由于配置无效或相关服务已关闭而返回错误响应。如果错误是由于应用程序故障或您的服务设计造成的,则服务结构不会打结。
在这些情况下,您必须实施一种机制来告诉 SF 这些错误不是预期的,并且 SF 将为您处理故障转移。您可以将其实现为:
- 你的应用程序的一部分,它会发出自己的健康报告
- 集群中的监视程序应用程序 运行 监视服务事件或日志并代表其他服务发出事件。
对于第一种方法,将此报告为 发生故障 的快速方法是使用 ReportFault:
Enables the replica to report a fault to the runtime and indicates that it has encountered an error from which it cannot recover and must either be restarted or removed.
有关其他健康报告的更多信息,请查看此文档:Service Fabric health reports
对于您问题的第 2 项和第 3 项, 有一种机制可以识别集群中的节点何时不可用,它会被降级并且 SF 会暂时将其从 RING 中移除。常见问题是当网络问题阻止节点相互通信时,在某些情况下,内存不足可能会影响 SF 主机管理器并且它开始失败,响应缓慢,然后 SF 将从可用节点列表中删除该节点,直到它恢复健康。
我不知道 SF 中的某些东西确实会重启 VM,可能是因为前面提到的相同原因,它会在 SF Explorer 中引发故障以通知该问题,您将不得不处理它。
您可以将解决方案作为上述看门狗方法的一部分,它将 Disable-ServiceFabricNode
to move any Healthy services from the node, and then you can restart the underlying VM using the Azure SDK。