Share via


將您的 Service Fabric 叢集移轉至可用性區域支援

本指南說明如何將 Service Fabric 叢集從非可用性區域支援移轉至可用性支援。 我們將引導您完成移轉的不同選項。 分散於可用性區域的 Service Fabric 叢集可確保叢集狀態的高可用性。

您可以移轉受控和非受控叢集。 本文涵蓋這兩者。

針對非受控叢集,我們會討論兩個不同的案例:

  • 使用標準 SKU 負載平衡器和 IP 資源移轉叢集。 此設定支援可用性區域,而不需要建立新的資源。
  • 使用基本 SKU 負載平衡器和 IP 資源移轉叢集。 此設定不支援可用性區域,而且需要建立新的資源。

請參閱 Service Fabric 叢集案例每個標頭底下的適當區段。

注意

跨可用性區域跨越主要節點類型的優點僅適用於三個區域,而不只是兩個區域。 這適用於受控和非受控叢集。

Service Fabric 跨可用性區域範本提供 範例範本

必要條件

Service Fabric 受控叢集

必要:

建議配備:

  • 叢集 SKU 必須是「標準」。
  • 主要節點類型應該至少有九個節點,以獲得最佳復原能力,但支援最少六個節點。
  • 次要節點類型應該至少有 6 個節點才能獲得最佳復原能力,但最少有 3 個時便可支援。

Service Fabric 非受控叢集

必要:N/A。

建議配備:

  • 叢集可靠性層級設定為 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 叢集應該至少有一個主要節點類型。 主要節點類型的持久性等級應該為銀級或更高。
  • 不論持久性層級為何,都應該使用至少三個 可用性區域 設定跨越虛擬機擴展集的可用性區域。
  • 跨越具有 Silver 或更高持久性之虛擬機擴展集的可用性區域應該至少有 15 部 VM。
  • 跨越具有銅級持久性之虛擬機擴展集的可用性區域應該至少有六部 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 個升級網域所需的升級時間,正確調整升級原則逾時。 應該更新應用程式和叢集的升級原則,以確保部署不超過 Azure 資源服務部署時間限制 12 小時。 這表示部署 15 個 UD 不應該超過 12 小時 (亦即每個 UD 不應該超過 40 分鐘)。
  • 將叢集可靠性等級設定為 Platinum,以確保叢集經得起一次區域關閉情況。
  • 不支援針對具有 multipleAvailabilityZones 的 nodetype 升級 DurabilityLevel。 請改為建立具有較高持久性的新節點類型。
  • SF 僅支援 3 個 AvailabilityZones。 目前不支援任何更高的數目。

提示

建議將 sfZonalUpgradeMode 設定為 Hierarchical 或省略。 部署遵循 VM 的區域性分佈,只影響少數複本或執行個體,較為安全。 如果部署速度是首要考量,或在具有多個可用性區域的節點類型上只執行無狀態工作負載,請將 sfZonalUpgradeMode 設定為 Parallel。 這會使得 UD 在所有可用性區域中平行發生。

遷移至具有多個可用性區域的節點類型

在所有移轉情節中,您需要新增支援多個可用性區域的新節點類型。 無法遷移現有的節點類型來支援多個區域。 擴大 Service Fabric 叢集的主要節點類型一文包含詳細步驟來新增節點類型,以及新節點類型所需的其他資源,例如 IP 和負載平衡器資源。 該文章也說明將具有多個可用性區域的新節點類型加入叢集之後,如何淘汰現有的節點類型。

  • 從使用基本負載平衡器和 IP 資源的節點類型移轉:下列一小節中,已針對每個可用性區域各有一個節點類型的解決方案來描述此流程。

    對於新的節點類型,唯一的差異在於所有 可用性區域 只有一個虛擬機擴展集和一個節點類型,而不是每個可用性區域各一個。

  • 從使用標準 SKU 負載平衡器和 IP 資源及 NSG 的節點類型移轉:遵循前述的相同程序。 但是,不需要加入新的負載平衡器、IP 和 NSG 資源。 相同的資源可以重複用在新的節點類型中。

如果您遇到任何問題,請連絡以支持協助。

移轉選項 2:將一個虛擬機擴展集釘選到每個區域,以部署區域

使用此選項的時機

這是目前常用的設定。

若要讓 Service Fabric 叢集跨可用性區域,您必須在該區域所支援的每個可用性區域中建立主要節點類型。 這樣會將種子節點平均分散至每個主要節點類型。

主要節點類型的建議拓撲需要:

  • 三個標示為主要的節點類型
    • 每個節點類型都應該對應至位於不同區域的虛擬機擴展集。
    • 每個虛擬機擴展集都應該至少有五個節點(銀級持久性)。

當您有現有的 Service Fabric 非受控叢集與您想要移轉的標準 SKU 負載平衡器和 IP 資源時,您應該使用此選項。 如果您現有的非受控叢集有基本 SKU 資源,您應該會看到下方的基本 SKU 移轉選項。

如何使用現有的標準 SKU 負載平衡器和 IP 資源來移轉 Service Fabric 非受控叢集

啟用虛擬機擴展集上的區域

若要在虛擬機擴展集上啟用區域,請在虛擬機擴展集資源中包含下列三個值:

  • 第一個值是 zones 屬性,指定虛擬機擴展集部署至哪個可用性區域。
  • 第二個值是 singlePlacementGroup 屬性,必須設定為 true
  • 第三個值是 faultDomainOverride Service Fabric 虛擬機擴展集擴充功能中的 屬性。 此屬性應該只包含將放置此虛擬機擴展集的區域。 範例:"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 非受控叢集

若要遷移使用負載平衡器和 IP 及基本 SKU 的叢集,您必須先使用標準 SKU 來建立全新的負載平衡器和 IP 資源。 無法更新這些資源。

在您要使用的跨可用性區域新節點類型中,參考新的負載平衡器和 IP。 在上一個範例中,已在區域1、2和3中新增三個新的虛擬機擴展集資源。 這些 虛擬機器擴展集 參考新建立的負載平衡器和IP,並標示為Service Fabric叢集中的主要節點類型。

  1. 若要開始,請將新資源新增至現有的 Azure Resource Manager 範本。 這些資源包括:

    • 使用標準 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. 接著,從您部署的 Resource Manager 範本中移除對這些資源的參考。

  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

如果您遇到任何問題,請連絡以支持協助。

下一步