如何移除 Service Fabric 節點類型

此文章說明如何透過將現有的節點類型從叢集移除,來調整 Azure Service Fabric 叢集的規模。 Service Fabric 叢集是一組由網路連接的虛擬或實體機器,可用來將您的微服務部署到其中並進行管理。 屬於叢集一部分的機器或 VM 都稱為節點。 虛擬機器擴展集是一個 Azure 計算資源,可以用來將一組虛擬機器當做一個集合加以部署和管理。 在 Azure 叢集中定義的每個節點類型,會設定為不同的擴展集。 隨後,您即可個別管理每個節點類型。 建立 Service Fabric 叢集之後,您可以透過移除節點類型 (虛擬機器擴展集) 與其所有節點,來水平調整叢集規模。 您可以隨時調整叢集,即使正在叢集上執行工作負載,也是如此。 在叢集進行調整時,您的應用程式也會自動調整。

警告

不建議經常使用此方法移除生產環境叢集的節點類型。 它是非常危險的命令,因為它會刪除節點類型後的虛擬機器擴展集資源。

持久性特性

使用 Remove-AzServiceFabricNodeType 時,安全性會優先於速度。 節點類型必須是銀級或金級持久性層級,因為:

  • 銅級不提供關於儲存狀態資訊的任何保證。
  • 銀級和金級持久性可以攔截對擴展集的任何變更。
  • 金級也可提供您對擴展集下 Azure 更新的控制。

Service Fabric 會「協調」基礎結構變更和更新,如此資料就不會遺失。 但移除具銅級持久性的節點類型時,則可能遺失狀態資訊。 若要移除的是主要節點類型,且應用程式為無狀態,銅級則可接受。 當您在生產環境中執行具狀態工作負載時,最低設定應該是銀級。 同樣地,針對生產環境案例,主要節點類型應該一律為銀級或金級。

深入了解銅級持久性

當移除銅級的節點類型時,該節點類型中的所有節點會立即停機。 Service Fabric 不會攔截任何銅級節點擴展集更新,因此所有的 VM 會立即停機。 如果您有具狀態的任何項目在這些節點上,資料會遺失。 現在,即使您是無狀態的,Service Fabric 中的所有節點都會參與通道,因此整個鄰近的資料都會遺失,這可能會造成叢集本身不穩定。

移除節點類型

  1. 開始程序前,請先處理這項必要條件。

    • 叢集狀況良好。
    • 移除節點類型後仍會有足夠容量,例如要放置所需複本計數的節點數目。
  2. 若服務具有使用節點類型的位置條件約束,針對所有這類服務移開該節點類型。

    • 修改應用程式/服務資訊清單,不再參考該節點類型。
    • 部署變更。

    接著驗證:

    • 該節點類型的所屬節點已不再執行進行上述修改的所有服務。
    • 所有服務皆狀況良好。
  3. 將非主要節點類型的節點類型取消標示 (跳過非主要節點類型)

    • 找出部署所用的 Azure Resource Manager 範本。
    • 在 Service Fabric 區段中,尋找節點類型相關區段。
    • 將 isPrimary 屬性變更為 false。 * * 請勿移除此工作中的節點類型相關區段。
    • 部署已修改的 Azure Resource Manager 範本。 * * 視叢集設定而定,此步驟可能需要一些時間。

    接著驗證:

    • 入口網站中的 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 Resource Manager 範本。
    • 在 Service Fabric 區段中,尋找節點類型相關區段。
    • 移除對應至該節點類型的區段。
    • 僅限銀級以上的持久性叢集:請在叢集資源下 properties 新增 applicationDeltaHealthPolicies (如下所示),更新範本中的叢集資源,並將健全狀況原則設為略過 fabric:/System application health。 下列原則應會略過現有錯誤,但不允許發生新的健康情況錯誤。
    "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 Resource Manager 範本。 ** 此步驟需要一段時間,通常最多兩個小時。 這項升級會將設定變更為 InfrastructureService,因此需要重新啟動節點。 在此情況下即會略過 forceRestart。 參數 upgradeReplicaSetCheckTimeout 用於指定 Service Fabric 等待分割區轉為安全狀態 (若尚未處於安全狀態) 的時間上限。 當節點的所有分割區皆通過安全性檢查,Service Fabric 便會於該節點繼續進行升級。 參數 upgradeTimeout 的值可縮減為 6 小時,但應使用安全性最高的 12 小時。

    接著驗證:

    • 入口網站中的 Service Fabric 資源顯示已就緒。
  9. 從 ARM 範本移除節點類型相關資源的所有參考。

    • 找出部署所用的 Azure Resource Manager 範本。
    • 從範本中移除虛擬機器擴展集及節點類型相關的其他資源。
    • 部署變更。

    接下來:

    • 等候部署完成。
  10. 移除已不再使用的節點類型相關資源。 範例 Load Balancer 和公用 IP。

    • 若要移除這些資源,您可使用步驟 6 中用於指定特定資源類型和 API 版本的相同 PowerShell 命令。
    • 針對銀級和金級持久性,叢集中剩餘的任何修復工作,其目標為已移除之 nodetype 中的任何節點,應該使用以下命令完成:
       Complete-ServiceFabricRepairTask -TaskId <repair task name>
    

注意

若 Load Balancer 相同,且 IP 重複用於不同節點類型,則此為選擇性步驟。

下一步