问题描述
发现 Service Fabric 的节点状态异常,如出现 Disabling, Warning,或者 RemoveNode的情况,并且持续很长时间都没有变化(2小时以上)。如何来缓解这种问题呢?
问题解答
面对这样的情况,首先需要进入每一个节点中,查看对应的 Warning 信息。如果Warning 中包含具体的信息,就根据内容尝试缓解问题。如果消息不能明确指出问题所在,则可以尝试通过 节点右边的 Restart 按钮来重启节点。
比如截图中的消息 'System.FM' reported Warning for property 'State'. Fabric node is taking longer than expected to deactivate.,关闭 Fabric 节点所耗的时间比预期的要长,并且节点状态一直显示 Disabling。表示节点已经Block了。Service Fabric 自身已经无法完成修复工作,需要手动接入。
修复Service Fabric中Application错误
当通过Service Fabric Explorer中的Restart也无法对此情况有任何帮助时,就需要查看集群的状态,应用是否存在错误。
比如截图中,Service Fabric中的应用出现Error, 消息显示 Partition is quorum loss. As the replicas come up, partition should recover from the quorum loss. 应用Partition丢失,当Replicas被选中成为Primary后,Partition将从Quorum Loss的情况中恢复。但是由于SF的应用设置的QuorumLossWaitDuration 的时间戳为infinite(无限)。所以错误就无法完成自动修复。
需要通过如下命令来修改QuorumLossWaitDuration的值
Update-ServiceFabricService -Stateful -ServiceName "fabric:/<Application Name, need replace>" -TargetReplicaSetSize 5 -MinReplicaSetSize 5 -ReplicaRestartWaitDuration 10 -QuorumLossWaitDuration 60 -Force
- Update-ServiceFabricService :https://docs.microsoft.com/en-us/powershell/module/servicefabric/update-servicefabricservice?view=azureservicefabricps
- StatefulServiceDescription.QuorumLossWaitDuration Property : https://docs.microsoft.com/en-us/dotnet/api/system.fabric.description.statefulservicedescription.quorumlosswaitduration?view=azure-dotnet#system-fabric-description-statefulservicedescription-quorumlosswaitduration
- Gets or sets the maximum duration, for which a partition is allowed to be in a state of quorum loss.【获取或设置允许分区处于仲裁丢失状态的最大持续时间。】
- If the partition is still in quorum loss after this duration, Service Fabric will recover the partition from the quorum loss by considering the down replicas as lost. Note that this can potentially incur data loss. The default value is Infinity and it is not recommended to change this value.【如果在此持续时间后分区仍处于仲裁丢失状态,Service Fabric 将通过将关闭的副本视为丢失来从仲裁丢失中恢复分区。请注意,这可能会导致数据丢失。默认值为"无穷大",不建议更改此值。】
修复Service Fabric节点错误
只有当SF中的应用信息已经被修复后,就可以通过以下几种常规的手段来Restart,Replace 节点:
1)通过 Service Fabric Explorer工具,在节点右侧点击“Restart”按钮重启节点
2)进入Service Fabric的VMSS门户页面,选中问题节点后,可以执行删除,重启,重置等按钮。
也可以使用PowerShell指令,如 Remove-ServiceFabricNode,Restart-ServiceFabricNode,Disable-ServiceFabricNode 等指令完成相同的操作。
PS: 特别注意,当操作的节点为种子节点(Seed Node), 不能直接删除,需要先Disable后,然Seed Node转移到其他节点,然后删除。操作方式可见:(如何转移Service Fabric集群中的种子节点(Seed Node):https://www.cnblogs.com/lulight/p/13691999.html)
参考资料
ServiceFabric:https://docs.microsoft.com/en-us/powershell/module/servicefabric/?view=azureservicefabricps