你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn

将 Service Fabric 群集迁移到可用性区域支持

本指南介绍如何将 Service Fabric 群集从非可用性区域支持迁移到可用性支持。 我们将介绍不同的迁移选项。 跨可用性区域分布的 Service Fabric 群集可确保群集状态的高可用性。

你可以迁移托管和非托管群集。 本文介绍了这两种方法。

对于非托管群集,我们将讨论两种不同的方案:

  • 迁移具有标准 SKU 负载均衡器和 IP 资源的群集。 此配置支持可用性区域,且无需创建新资源。
  • 迁移具有基本 SKU 负载均衡器和 IP 资源的群集。 此配置不支持可用性区域,需要创建新资源。

请参阅每个标题下适用于你的 Service Fabric 群集方案的部分。

注意

只有在组建了三个区域时,可用性区域中主节点类型的优势才能体现,如果只组建了两个区域,则看不到这种优势。 对于托管群集和非托管群集都是如此。

Service Fabric 跨可用性区域模板中提供了示例模板。

先决条件

Service Fabric 托管群集

必需:

建议:

  • 群集 SKU 必须为标准。
  • 主节点类型应该至少有九个节点才能获得最佳复原能力,但支持最少六个节点。
  • 辅助节点类型应该至少有六个节点才能获得最佳复原能力,但支持最少三个节点。

Service Fabric 非托管群集

必需:不适用。

建议:

  • 设置为 Platinum 的群集可靠性级别。
  • 单个使用标准 SKU 的公共 IP 资源。
  • 单个使用标准 SKU 的负载均衡器资源。
  • 由在其中部署虚拟机规模集的子网所引用的网络安全组 (NSG)。

现有的标准 SKU 负载均衡器和 IP 资源

此方案没有先决条件,因为它假设你已准备好必需的资源。

基本 SKU 负载均衡器和 IP 资源

  • 使用标准 SKU 的新负载均衡器,不同于现有的基本 SKU 负载均衡器。
  • 使用标准 SKU 的新 IP 资源,不同于现有的基本 SKU IP 资源。

注意

无法将现有资源从基本 SKU 升级到标准 SKU,因此需要新资源。

停机要求

Service Fabric 托管群集

迁移到区域复原配置可能会导致通过负载均衡器的外部连接短暂丢失,但不会影响群集运行状况。 如果需要创建新的公共 IP 才能使网络弹性应对区域故障,则会断开外部连接。 请相应地规划迁移。

Service Fabric 非托管群集

迁移 Service Fabric 非托管群集期间出现的停机时间根据群集中的 VM 和升级域 (UD) 数量而异。 UD 是 VM 的逻辑分组,决定了将升级推送到群集中 VM 的顺序。 停机时间还受群集升级模式的影响,该模式将处理群集中 UD 升级任务的处理方式。 后续部分更详细地介绍了用于控制升级模式的 sfZonalUpgradeMode 属性。

Service Fabric 托管群集的迁移

按照将 Service Fabric 托管群集迁移到区域复原中的步骤操作。

Service Fabric 非托管群集的迁移选项

迁移选项 1:在单个虚拟机规模集中启用多个可用性区域

何时使用此选项

此解决方案使用户可以在同一节点类型中跨越三个可用性区域。 这是建议的部署拓扑,因为它使你能够跨可用性区域进行部署,同时维护单个虚拟机规模集。

有关完整的示例模板,请参阅 GitHub

如果现有的 Service Fabric 非托管群集包含你要迁移的标准 SKU 负载均衡器和 IP 资源,则你应使用此选项。 如果现有的非托管群集包含基本 SKU 资源,则你应会看到下面的基本 SKU 迁移选项。

如何迁移包含现有标准 SKU 负载均衡器和 IP 资源的 Service Fabric 非托管群集

若要在虚拟机规模集上启用区域,请执行以下操作:

在虚拟机规模集资源中包含以下三个值:

  • 第一个值为 zones 属性,该属性指定虚拟机规模集中存在的可用性区域。

  • 第二个值是 singlePlacementGroup 属性,该属性应设置为 true。 即使 singlePlacementGroup = true,跨三个可用性区域的规模集也可纵向扩展至 300 个 VM。

  • 第三个值为 zoneBalance,该值可确保严格进行区域均衡。 该值应为 true。 它确保了 VM 跨区域均匀分布,这意味着当一个区域出现故障时,其他两个区域有足够的 VM 来保持群集运行。

    在一个区域出现故障的情况下,VM 分发不均衡的群集可能无法运行,因为该区域可能拥有大多数 VM。 VM 跨区域分发不均衡还会导致服务放置问题和基础结构更新停滞。 阅读有关 zoneBalancing 的详细信息。

不需要配置 FaultDomainUpgradeDomain 替代。

{
  "apiVersion": "2018-10-01",
  "type": "Microsoft.Compute/virtualMachineScaleSets",
  "name": "[parameters('vmNodeType1Name')]",
  "location": "[parameters('computeLocation')]",
  "zones": [ "1", "2", "3" ],
  "properties": {
    "singlePlacementGroup": true,
    "zoneBalance": true
  }
}

注意

  • Service Fabric 群集应至少有一个主节点类型。 主节点类型的持久性级别应为银级或更高级别。
  • 跨虚拟机规模集的可用性区域应至少配置三个可用性区域,无论其持久性级别如何。
  • 跨具有银级或更高级别持久性的虚拟机规模集的可用性区域应至少有 15 个 VM。
  • 跨具有铜级持久性的虚拟机规模集的可用性区域应至少有 6 个 VM。
启用对 Service Fabric 节点类型中多个区域的支持

若要支持多个可用性区域,必须启用 Service Fabric 节点类型。

  • 第一个值为 multipleAvailabilityZones,对于节点类型该值应设置为 true

  • 第二个值为 sfZonalUpgradeMode,该值为可选。 如果群集中已存在具有多个可用性区域的节点类型,则无法修改此属性。 此属性控制 UD 中 VM 的逻辑分组。

    • 如果此值设置为 Parallel:节点类型下的 VM 将分组到 UD,并忽略五个 UD 中的区域信息。 此设置会导致所有区域中的 UD 同时升级。 尽管此部署模式用于升级速度会更快,但不建议使用,因为它违反了 SDP 准则,该准则规定一次只能对一个区域应用更新。

    • 如果此值被省略或设置为 Hierarchical:VM 将分组以反映最多 15 个 UD 中的区域性分布。 三个区域各有五个 UD。 这样可以确保一次更新一个区域,仅在第一个区域内完成五个 UD 之后才移动到下一个区域。 更新过程对于群集和用户应用程序更安全。

    此属性仅定义 Service Fabric 应用程序和代码升级的升级行为。 基础虚拟机规模集升级仍在所有可用性区域中并行进行。 此属性不影响未启用多个区域的节点类型的 UD 分布。

  • 第三个值为 vmssZonalUpgradeMode,它为可选值,可以随时更新。 此属性定义虚拟机规模集跨可用性区域并行或按顺序进行的升级方案。

    • 如果将此值设置为 Parallel:所有规模集在所有区域中并行更新。 此部署模式用于升级速度会更快,因此我们不建议使用,因为它违反了 SDP 准则,该准则规定一次只能对一个区域应用更新。
    • 如果省略此值或将其设置为 Hierarchical:这样可以确保一次更新一个区域,仅在第一个区域内完成五个 UD 之后才移动到下一个区域。 此更新过程对于群集和用户应用程序更安全。

重要

Service Fabric 群集资源 API 版本应为 2020-12-01-preview 或更高版本。

群集代码版本至少应为 8.1.321 或更高版本。

{
  "apiVersion": "2020-12-01-preview",
  "type": "Microsoft.ServiceFabric/clusters",
  "name": "[parameters('clusterName')]",
  "location": "[parameters('clusterLocation')]",
  "dependsOn": [
    "[concat('Microsoft.Storage/storageAccounts/', parameters('supportLogStorageAccountName'))]"
  ],
  "properties": {
    "reliabilityLevel": "Platinum",
    "sfZonalUpgradeMode": "Hierarchical",
    "vmssZonalUpgradeMode": "Parallel",
    "nodeTypes": [
      {
        "name": "[parameters('vmNodeType0Name')]",
        "multipleAvailabilityZones": true
      }
    ]
  }
}

注意

  • 公共 IP 和负载均衡器资源应使用本文前面所述的标准 SKU。
  • 节点类型上的 multipleAvailabilityZones 属性只能在创建节点类型时定义,且以后不能修改。 无法使用此属性配置现有的节点类型。
  • 如果 sfZonalUpgradeMode 被省略或设置为 Hierarchical,则群集和应用程序部署将会变慢,因为群集中存在更多升级域。 必须正确调整升级策略的超时,以考虑 15 个升级域所需的升级时间。 应更新应用程序和群集的升级策略,以确保部署不会超过 12 小时的 Azure 资源服务部署时间限制。 这意味着部署 15 个 UD 不应超过 12 小时(也就是说,每个 UD 不应超过 40 分钟)。
  • 将群集可靠性级别设置为 Platinum,以确保群集在一个区域出现故障的情况下能正常运行。
  • 不支持为具有多个可用性区域的节点类型升级持久性级别。 请改为创建具有更高持久性的新节点类型。
  • SF 仅支持 3 个可用性区域。 目前不支持任何更高的数目。

提示

建议将 sfZonalUpgradeMode 设置为 Hierarchical 或将其省略。 部署将遵循 VM 的区域性分布并将影响少量副本或实例,使其更安全。 如果部署速度是优先考虑的事项,或者只有无状态工作负载在具有多个可用性区域的节点类型上运行,请使用设置为 ParallelsfZonalUpgradeMode。 这会使 UD 遍历在所有可用性区域中并行发生。

迁移到具有多个可用性区域的节点类型

对于所有迁移方案,都需要添加支持多个可用性区域的新节点类型。 无法迁移现有节点类型以支持多个区域。 纵向扩展 Service Fabric 群集主节点类型一文包括添加新节点类型和该新节点类型所需的其他资源(如 IP 和负载均衡器资源)的详细步骤。 本文还介绍了如何在将具有多个可用性区域的新节点类型添加到群集后停用现有节点类型。

  • 从使用基本负载均衡器和 IP 资源的节点类型迁移:对于每个可用性区域有一个节点类型的解决方案,下面的子部分已描述了此过程。

    对于新的节点类型,唯一的区别是所有可用性区域只有一个虚拟机规模集和一个节点类型,而不是每个可用性区域各一个。

  • 从使用标准 SKU 负载均衡器和带有 NSG 的 IP 资源的节点类型进行迁移:遵循前面描述的相同过程。 但是,无需添加新的负载均衡器、IP 和 NSG 资源。 可以在新节点类型中重复使用相同的资源。

如果遇到任何问题,请联系支持人员寻求帮助。

迁移选项 2:将一个虚拟机规模集固定到每个区域以部署区域

何时使用此选项

这是目前提供的一般配置。

若要使 Service Fabric 群集跨越可用性区域,必须在该区域支持的每个可用性区域中创建一个主节点类型。 这会在每个主节点类型上平均分布种子节点。

建议用于主节点类型的拓扑需要以下内容:

  • 三个标记为主节点的节点类型
    • 每个节点类型都应映射到其自己的位于不同区域的虚拟机规模集。
    • 每个虚拟机规模集应至少具有五个节点(银级持续性)。

如果现有的 Service Fabric 非托管群集包含你要迁移的标准 SKU 负载均衡器和 IP 资源,则你应使用此选项。 如果现有的非托管群集包含基本 SKU 资源,则你应会看到下面的基本 SKU 迁移选项。

如何迁移包含现有标准 SKU 负载均衡器和 IP 资源的 Service Fabric 非托管群集

在虚拟机规模集上启用区域

若要在虚拟机规模集上启用区域,请在虚拟机规模集资源中包含以下三个值:

  • 第一个值为 zones 属性,它指定虚拟机规模集部署到的可用性区域。
  • 第二个值是 singlePlacementGroup 属性,该属性应设置为 true
  • 第三个值为 Service Fabric 虚拟机规模集扩展中的 faultDomainOverride 属性。 此属性应只包含放置此虚拟机规模集的区域。 示例:"faultDomainOverride": "az1"。 所有虚拟机规模集资源必须放置在同一区域,因为 Azure Service Fabric 群集没有跨区域支持。
{
  "apiVersion": "2018-10-01",
  "type": "Microsoft.Compute/virtualMachineScaleSets",
  "name": "[parameters('vmNodeType1Name')]",
  "location": "[parameters('computeLocation')]",
  "zones": [
    "1"
  ],
  "properties": {
    "singlePlacementGroup": true
  },
  "virtualMachineProfile": {
    "extensionProfile": {
      "extensions": [
        {
          "name": "[concat(parameters('vmNodeType1Name'),'_ServiceFabricNode')]",
          "properties": {
            "type": "ServiceFabricNode",
            "autoUpgradeMinorVersion": false,
            "publisher": "Microsoft.Azure.ServiceFabric",
            "settings": {
              "clusterEndpoint": "[reference(parameters('clusterName')).clusterEndpoint]",
              "nodeTypeRef": "[parameters('vmNodeType1Name')]",
              "dataPath": "D:\\\\SvcFab",
              "durabilityLevel": "Silver",
              "certificate": {
                "thumbprint": "[parameters('certificateThumbprint')]",
                "x509StoreName": "[parameters('certificateStoreValue')]"
              },
              "systemLogUploadSettings": {
                "Enabled": true
              },
              "faultDomainOverride": "az1"
            },
            "typeHandlerVersion": "1.0"
          }
        }
      ]
    }
  }
}
在 Service Fabric 群集资源中启用多个主节点类型

若要在群集资源中将一个或多个节点类型设置为无状态,请将 isPrimary 属性设置为 true。 跨可用性区域部署 Service Fabric 群集时,应该在不同的区域有三种节点类型。

{
  "reliabilityLevel": "Platinum",
  "nodeTypes": [
    {
      "name": "[parameters('vmNodeType0Name')]",
      "applicationPorts": {
        "endPort": "[parameters('nt0applicationEndPort')]",
        "startPort": "[parameters('nt0applicationStartPort')]"
      },
      "clientConnectionEndpointPort": "[parameters('nt0fabricTcpGatewayPort')]",
      "durabilityLevel": "Silver",
      "ephemeralPorts": {
        "endPort": "[parameters('nt0ephemeralEndPort')]",
        "startPort": "[parameters('nt0ephemeralStartPort')]"
      },
      "httpGatewayEndpointPort": "[parameters('nt0fabricHttpGatewayPort')]",
      "isPrimary": true,
      "vmInstanceCount": "[parameters('nt0InstanceCount')]"
    },
    {
      "name": "[parameters('vmNodeType1Name')]",
      "applicationPorts": {
        "endPort": "[parameters('nt1applicationEndPort')]",
        "startPort": "[parameters('nt1applicationStartPort')]"
      },
      "clientConnectionEndpointPort": "[parameters('nt1fabricTcpGatewayPort')]",
      "durabilityLevel": "Silver",
      "ephemeralPorts": {
        "endPort": "[parameters('nt1ephemeralEndPort')]",
        "startPort": "[parameters('nt1ephemeralStartPort')]"
      },
      "httpGatewayEndpointPort": "[parameters('nt1fabricHttpGatewayPort')]",
      "isPrimary": true,
      "vmInstanceCount": "[parameters('nt1InstanceCount')]"
    },
    {
      "name": "[parameters('vmNodeType2Name')]",
      "applicationPorts": {
        "endPort": "[parameters('nt2applicationEndPort')]",
        "startPort": "[parameters('nt2applicationStartPort')]"
      },
      "clientConnectionEndpointPort": "[parameters('nt2fabricTcpGatewayPort')]",
      "durabilityLevel": "Silver",
      "ephemeralPorts": {
        "endPort": "[parameters('nt2ephemeralEndPort')]",
        "startPort": "[parameters('nt2ephemeralStartPort')]"
      },
      "httpGatewayEndpointPort": "[parameters('nt2fabricHttpGatewayPort')]",
      "isPrimary": true,
      "vmInstanceCount": "[parameters('nt2InstanceCount')]"
    }
  ]
}

如果遇到任何问题,请联系支持人员寻求帮助。

迁移选项:包含基本 SKU 负载均衡器和 IP 资源的 Service Fabric 非托管群集

何时使用此选项

如果现有的 Service Fabric 非托管群集包含你要迁移的基本 SKU 负载均衡器和 IP 资源,则你应使用此选项。 如果现有的非托管群集包含标准 SKU 资源,则应会看到上面的迁移选项。 如果你尚未创建非托管群集,但确认要为它启用 AZ,请使用标准 SKU 资源创建该群集。

如何迁移包含基本 SKU 负载均衡器和 IP 资源的 Service Fabric 非托管群集

若要迁移使用基本 SKU 负载均衡器和 IP 的群集,必须先使用标准 SKU 创建全新的负载均衡器和 IP 资源。 目前无法更新这些资源。

在要使用的新跨可用性区域节点类型中引用新的负载均衡器和 IP。 在上一个示例中,区域 1、2 和 3 中添加了三个新的虚拟机规模集资源。 这些虚拟机规模集引用新创建的负载均衡器和 IP,并在 Service Fabric 群集资源中被标记为主节点类型。

  1. 首先,将新资源添加到现有 Azure 资源管理器模板。 这些资源包括:

    • 使用标准 SKU 的公共 IP 资源
    • 使用标准 SKU 的负载均衡器资源
    • 由在其中部署虚拟机规模集的子网所引用的 NSG
    • 三个标记为主节点的节点类型
      • 每个节点类型都应映射到其自己的位于不同区域的虚拟机规模集。
      • 每个虚拟机规模集应至少具有五个节点(银级持续性)。

    可在示例模板中找到这些资源的示例。

    New-AzureRmResourceGroupDeployment `
        -ResourceGroupName $ResourceGroupName `
        -TemplateFile $Template `
        -TemplateParameterFile $Parameters
    
  2. 部署完资源后,便可以从原始群集禁用主节点类型中的节点。 禁用节点之后,系统服务将迁移到之前部署的新主节点类型。

    Connect-ServiceFabricCluster -ConnectionEndpoint $ClusterName `
        -KeepAliveIntervalInSec 10 `
        -X509Credential `
        -ServerCertThumbprint $thumb  `
        -FindType FindByThumbprint `
        -FindValue $thumb `
        -StoreLocation CurrentUser `
        -StoreName My 
    
    Write-Host "Connected to cluster"
    
    $nodeNames = @("_nt0_0", "_nt0_1", "_nt0_2", "_nt0_3", "_nt0_4")
    
    Write-Host "Disabling nodes..."
    foreach($name in $nodeNames) {
        Disable-ServiceFabricNode -NodeName $name -Intent RemoveNode -Force
    }
    
  3. 禁用全部节点之后,系统服务将在跨区域分布的主节点类型上运行。 然后,可以从群集中删除禁用的节点。 删除节点后,可以删除原始 IP、负载均衡器和虚拟机规模集资源。

    foreach($name in $nodeNames){
        # Remove the node from the cluster
        Remove-ServiceFabricNodeState -NodeName $name -TimeoutSec 300 -Force
        Write-Host "Removed node state for node $name"
    }
    
    $scaleSetName="nt0"
    Remove-AzureRmVmss -ResourceGroupName $groupname -VMScaleSetName $scaleSetName -Force
    
    $lbname="LB-cluster-nt0"
    $oldPublicIpName="LBIP-cluster-0"
    $newPublicIpName="LBIP-cluster-1"
    
    Remove-AzureRmLoadBalancer -Name $lbname -ResourceGroupName $groupname -Force
    Remove-AzureRmPublicIpAddress -Name $oldPublicIpName -ResourceGroupName $groupname -Force
    
  4. 然后,从已部署的资源管理器模板中删除对这些资源的引用。

  5. 最后,更新 DNS 名称和公共 IP。

$oldprimaryPublicIP = Get-AzureRmPublicIpAddress -Name $oldPublicIpName  -ResourceGroupName $groupname
$primaryDNSName = $oldprimaryPublicIP.DnsSettings.DomainNameLabel
$primaryDNSFqdn = $oldprimaryPublicIP.DnsSettings.Fqdn

Remove-AzureRmLoadBalancer -Name $lbname -ResourceGroupName $groupname -Force
Remove-AzureRmPublicIpAddress -Name $oldPublicIpName -ResourceGroupName $groupname -Force

$PublicIP = Get-AzureRmPublicIpAddress -Name $newPublicIpName  -ResourceGroupName $groupname
$PublicIP.DnsSettings.DomainNameLabel = $primaryDNSName
$PublicIP.DnsSettings.Fqdn = $primaryDNSFqdn
Set-AzureRmPublicIpAddress -PublicIpAddress $PublicIP

如果遇到任何问题,请联系支持人员寻求帮助。

后续步骤