Partager via

如何删除 Service Fabric 节点类型

本文介绍如何通过删除群集的现有节点类型来缩放 Azure Service Fabric 群集。 Service Fabric 群集是通过网络连接在一起的一组虚拟机或物理机,可在其中部署和管理微服务。 属于群集一部分的计算机或 VM 称为节点。 虚拟机规模集是一种 Azure 计算资源,用于将一组 VM 作为一个集进行部署和管理。 Azure 群集中定义的每个节点类型设置为独立的规模集。 然后可以单独管理每个节点类型。 创建 Service Fabric 群集之后,可以通过删除节点类型(虚拟机规模集)及其所有节点来水平缩放群集。 随时可以缩放群集,即使该群集上正在运行工作负荷。 在缩放群集的同时,应用程序也会随之自动缩放。

警告

不建议经常使用此方法从生产群集中删除节点类型。 这是一个危险的命令,因为它删除与节点类型相关联的虚拟机规模集资源。

持续性特征

使用 Remove-AzServiceFabricNodeType 时,安全性优先于速度。 节点类型必须为银级或金级持续性级别,原因如下:

  • 铜牌不提供保存状态信息的任何保证。
  • 银级和金级持续性阻止对规模集的任何更改。
  • 金级还使您能够控制规模集基础设施下的 Azure 更新。

Service Fabric 会“协调”基础更改和更新,以便不会丢失数据。 但是,当删除具有铜级耐用性的节点类型时,可能会丢失状态信息。 如果要删除主节点类型且应用程序是无状态的,则铜级是可接受的。 在生产环境中运行有状态工作负载时,最低配置应为银级。 同样,对于生产方案,主节点类型应始终为银级或金级。

青铜耐用性相关的更多信息

删除铜级的节点类型时,节点类型中的所有节点都会立即关闭。 Service Fabric 不会捕获任何铜牌节点的规模集更新,因此所有 VM 会立即关闭。 如果这些节点上有任何有状态的内容,则数据将丢失。 现在,即使节点是无状态的,Service Fabric 中的所有节点也会参与环形结构,因此整个网络可能会丢失,这可能会导致群集本身不稳定。

删除节点类型

  1. 在开始此过程之前,请处理这些先决条件。

    • 群集状态良好。
    • 删除节点类型后,仍有足够的容量,例如,用于放置所需副本计数的节点数。
  2. 移动其放置约束要求使用该节点类型的所有服务。

    • 修改应用程序/服务清单,以不再引用该节点类型。
    • 部署更改。

    然后验证以下事项:

    • 上面修改的所有服务不再在属于该节点类型的节点上运行。
    • 所有服务正常运行。
  3. 将节点类型标记为非主节点类型(对于非主节点类型跳过)。

    • 找到用于部署的 Azure 资源管理器模板。
    • 在“Service Fabric”部分中找到与该节点类型相关的部分。
    • 将 isPrimary 属性更改为 false。 ** 请勿删除与此任务中的节点类型相关的节。
    • 部署修改后的 Azure 资源管理器模板。 ** 此步骤可能需要一段时间,具体取决于群集配置。

    然后验证以下事项:

    • 门户中的“Service Fabric”部分指示群集已准备就绪。
    • 群集状态良好。
    • 未将属于该节点类型的任何节点标记为种子节点。
  4. 禁用节点类型中的每个节点。

    使用 PowerShell 连接到群集,然后运行以下步骤。

    $nodeType = "" # specify the name of node type
    $nodes = Get-ServiceFabricNode
    
    foreach($node in $nodes)
    {
      if ($node.NodeType -eq $nodeType)
      {
        $node.NodeName
    
        Disable-ServiceFabricNode -Intent RemoveNode -NodeName $node.NodeName -Force
      }
    }
    
    • 对于实现铜级耐久性,请等待所有节点进入已禁用状态。
    • 对于银和金级持久性,某些节点将进入禁用状态,其他节点将处于禁用中状态。 检查处于正在禁用状态的节点的详细信息选项卡,如果这些节点全部停滞在确保基础结构服务分区的仲裁状态,则可以安全地继续操作。
  5. 停止与节点类型相关的数据。

    使用 PowerShell 连接到群集,然后运行以下步骤。

    foreach($node in $nodes)
    {
      if ($node.NodeType -eq $nodeType)
      {
        $node.NodeName
    
        Start-ServiceFabricNodeTransition -Stop -OperationId (New-Guid) -NodeInstanceId $node.NodeInstanceId -NodeName $node.NodeName -StopDurationInSeconds 10000
      }
    }
    

    等待该节点类型的所有节点被标记为“宕机”。

  6. 将节点从原始虚拟机规模集中解除分配

    登录到在其中部署了规模集的 Azure 订阅,删除虚拟机规模集。

    $scaleSetName="myscaleset"
    $scaleSetResourceType="Microsoft.Compute/virtualMachineScaleSets"
    
    Remove-AzResource -ResourceName $scaleSetName -ResourceType $scaleSetResourceType -ResourceGroupName $resourceGroupName -Force
    
  7. 删除该节点类型的数据。

    使用 PowerShell 连接到群集,然后运行以下步骤。

    foreach($node in $nodes)
    {
      if ($node.NodeType -eq $nodeType)
      {
        $node.NodeName
    
        Remove-ServiceFabricNodeState -NodeName $node.NodeName -Force
      }
    }
    

    等到所有节点被从群集中删除。 节点应当不再显示在 SFX 中。

  8. 从“Service Fabric”部分中删除节点类型。

    • 找到用于部署的 Azure 资源管理器模板。
    • 在“Service Fabric”部分中找到与该节点类型相关的部分。
    • 删除与节点类型对应的部分。
    • (仅适用于银级和更高持久性级别的群集)在模板中更新群集资源,并通过在群集资源applicationDeltaHealthPolicies下添加properties,从而设置运行状况策略以忽略 fabric:/System 应用程序的运行状况,如下所示。 以下策略应忽略现有错误,但须防止新的健康错误。
    "upgradeDescription":  
    { 
     "forceRestart": false, 
     "upgradeReplicaSetCheckTimeout": "10675199.02:48:05.4775807", 
     "healthCheckWaitDuration": "00:05:00", 
     "healthCheckStableDuration": "00:05:00", 
     "healthCheckRetryTimeout": "00:45:00", 
     "upgradeTimeout": "12:00:00", 
     "upgradeDomainTimeout": "02:00:00", 
     "healthPolicy": { 
       "maxPercentUnhealthyNodes": 100, 
       "maxPercentUnhealthyApplications": 100 
     }, 
     "deltaHealthPolicy":  
     { 
       "maxPercentDeltaUnhealthyNodes": 0, 
       "maxPercentUpgradeDomainDeltaUnhealthyNodes": 0, 
       "maxPercentDeltaUnhealthyApplications": 0, 
       "applicationDeltaHealthPolicies":  
       { 
           "fabric:/System":  
           { 
               "defaultServiceTypeDeltaHealthPolicy":  
               { 
                       "maxPercentDeltaUnhealthyServices": 0 
               } 
           } 
       } 
     } 
    },
    
    • 部署修改后的 Azure 资源管理器模板。 ** 此步骤将需要一段时间,通常最长为两个小时。 此升级会将设置更改为 InfrastructureService,因此需要重启节点。 在这种情况下,将会忽略 forceRestart。 参数 upgradeReplicaSetCheckTimeout 指定 Service Fabric 等待分区进入安全状态(如果尚未进入安全状态)的最长时间。 一旦节点上的所有分区都已通过安全检查,Service Fabric 就会在该节点上继续升级。 可将参数 upgradeTimeout 的值减至 6 小时,但若要获得最高安全性,应使用 12 小时。

    然后验证以下事项:

    • 门户中的 Service Fabric 资源显示准备就绪。
  9. 从 ARM 模板中删除对与节点类型相关的资源的所有引用。

    • 找到用于部署的 Azure 资源管理器模板。
    • 从模板中删除与节点类型相关的虚拟机规模集及其他资源。
    • 部署更改。

    然后:

    • 等待部署完成。
  10. 删除与不再使用的节点类型相关的资源。 示例负载均衡器和公共 IP。

    • 若要删除这些资源,可以使用在步骤 6 中使用的 PowerShell 命令来指定具体的资源类型和 API 版本。
    • 对于白银和黄金级的持久性,任何在群集中仍然需要完成的修复任务(目标是删除的节点类型中存在的任何节点)都应使用以下命令完成:
       Complete-ServiceFabricRepairTask -TaskId <repair task name>
    

注释

如果使用相同的负载均衡器,则此步骤是可选的,并可在节点类型之间重用 IP。

后续步骤