通过

缩放到零 - 在 Azure Service Fabric 中禁用和启用服务

若要增加群集中的资源利用率,可以使用缩放到零功能释放当前未使用的服务所持有的资源。 本文介绍如何在 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)中,但处于 未知 状态。 在下一次DeleteServiceDisableService/EnableServiceAPI 调用中清理它们,这返回OperationFailedServicePurged意味着服务已清除,必须重新创建。

重要

同时处于禁用状态的服务的最大数目为 100,000。

注意

禁用的服务会在保留期 为 90 天后自动删除。 超时到期后,Service Fabric 会永久删除该服务。 若要使禁用的服务超出此期限,请在超时到期之前启用它。