若要增加群集中的资源利用率,可以使用缩放到零功能释放当前未使用的服务所持有的资源。 本文介绍如何在 Azure Service Fabric 群集中禁用和启用服务。 禁用服务会删除其所有副本和实例,同时保留服务定义。 再次启用该服务时,Service Fabric 会重新生成副本,而无需完全重新创建。
Windows 和 Linux 平台上都支持有状态和无状态服务。
先决条件
运行版本 11.5 或更高版本的 Service Fabric 群集。
在
AllowDisableEnableServicetrue部分中: 的配置标志设置为:<Section Name="FailoverManager"> <Parameter Name="AllowDisableEnableService" Value="true" /> </Section>
禁用服务
禁用服务时,Service Fabric 会将其标记为 禁用、计划副本删除并立即返回。 删除所有副本后,服务会异步转换为 “禁用 ”。 轮询服务状态以确认服务操作完成。
Disable-ServiceFabricService -ServiceName "fabric:/MyApp/MyService"
强制禁用服务并绕过正常副本关闭:
Disable-ServiceFabricService -ServiceName "fabric:/MyApp/MyService" -ForceDisable
注意
ForceDisable 在有状态的服务中,由于副本在未进行正常关闭的情况下终止,磁盘上可能会遗留没有被正确清理的持久化状态。
启用服务
启用以前禁用的服务时,Service Fabric 会根据服务的当前配置(目标副本集大小、实例计数、放置约束等)生成副本和实例。
Enable-ServiceFabricService -ServiceName "fabric:/MyApp/MyService"
创建处于禁用状态的服务
可以在群集中注册服务,而无需放置任何副本或实例。 在显式启用该服务之前,服务将保持禁用状态。
将无状态服务创建为禁用状态:
New-ServiceFabricService `
-ApplicationName "fabric:/MyApp" `
-ServiceName "fabric:/MyApp/MyService" `
-ServiceTypeName "MyServiceType" `
-Stateless `
-InstanceCount 3 `
-PartitionSchemeSingleton `
-IsCreateAsDisabled
创建已禁用的有状态服务:
New-ServiceFabricService `
-ApplicationName "fabric:/MyApp" `
-ServiceName "fabric:/MyApp/MyStatefulService" `
-ServiceTypeName "MyStatefulServiceType" `
-Stateful `
-HasPersistedState `
-TargetReplicaSetSize 3 `
-MinReplicaSetSize 2 `
-PartitionSchemeSingleton `
-IsCreateAsDisabled
省略 -IsCreateAsDisabled 标志时,默认值为 false Service Fabric 会在创建时立即放置副本。
检查服务状态
查询服务以验证其当前状态。
Get-ServiceFabricService -ApplicationName "fabric:/MyApp" -ServiceName "fabric:/MyApp/MyService"
ServiceStatus 字段返回以下值之一:
| 地位 | 说明 |
|---|---|
| 积极 | 服务正常运行。 |
| 禁用 | 正在删除复制品。 删除完成后,服务将转换为“禁用”状态。 |
| 已禁用 | 该服务没有副本或实例。 |
删除已禁用的服务
可以删除处于“已禁用”状态的服务。 无需执行额外的步骤 - 标准删除流适用。
Remove-ServiceFabricService -ServiceName "fabric:/MyApp/MyService" -Force
了解升级模式
应用程序升级
无论应用程序中的服务是否已禁用,应用程序升级都会继续:
- 升级完成后,禁用的服务将保持禁用状态。
- 可以在升级期间随时禁用或启用服务。
- 保留服务说明和配置。 禁用服务时,副本计数才为零。
网络架构升级
禁用的服务不会阻止结构(运行时)升级。 但是,当集群中存在禁用的服务时,试图将结构升级回一个早于禁用/启用功能的版本将会被拒绝,因为回滚会导致服务状态不一致。
错误代码
下表列出了特定于禁用/启用功能的错误代码:
| 错误代码 | 说明 |
|---|---|
ServiceAlreadyInRequestedState |
该服务已处于请求状态(已禁用或已启用)。 |
ServiceDisableInProgress |
此服务的禁用操作正在进行中。 |
DisableEnableServiceFeatureDisabled |
该功能已关闭。 将AllowDisableEnableService设置为true中的FailoverManager配置。 |
MaxAllowedDisabledServicesReached |
禁用服务的集群限制已达到。 |
OperationFailedServicePurged |
在 FM 数据丢失事件后清除了该服务。 重新创建服务以还原该服务。 |
配置参考
在群集配置的 FailoverManager 部分中设置以下值:
| 设置 | 类型 | 默认 | 说明 |
|---|---|---|---|
AllowDisableEnableService |
布尔 | false |
打开或关闭“自动缩减至零”功能。 此设置是动态的,并且适用于整个群集。 |
已知的限制
- 无法禁用系统服务。
- 在 FM 出现不太可能的数据丢失事件时,已禁用的服务将会永久丢失,需重新创建。 恢复后,这些服务可能仍显示在 Service Fabric Explorer(SFX)中,但处于 未知 状态。 在下一次
DeleteService或DisableService/EnableServiceAPI 调用中清理它们,这返回OperationFailedServicePurged意味着服务已清除,必须重新创建。
重要
同时处于禁用状态的服务的最大数目为 100,000。
注意
禁用的服务会在保留期 为 90 天后自动删除。 超时到期后,Service Fabric 会永久删除该服务。 若要使禁用的服务超出此期限,请在超时到期之前启用它。