共用方式為


將叢集相應縮小或相應放大

警告

縮放之前閱讀本節

調整計算資源來符合您的應用程式工作負載時,需要經過刻意規劃,生產環境幾乎一律需要超過一小時的時間才能完成規劃,而且會要求您了解您的工作負載和商務內容;事實上,如果您之前不曾執行這項活動,建議您先閱讀並了解 Service Fabric 叢集容量規劃考量,再繼續進行本文件的其餘部分。 此建議是為了避免非預期的 LiveSite 問題,此外,也建議您成功測試您決定要對非商業執行環境執行的作業。 您可以隨時報告實際執行問題,或要求 Azure 的付費支援。 針對配置來執行這些作業且擁有適當內容的工程師,本文將說明調整作業,但您必須決定並了解哪些作業適合您的使用案例;例如要調整哪些資源 (CPU、儲存體、記憶體)、調整方向為何 (水平或垂直),以及要執行哪些作業 (資源範本部署、入口網站、PowerShell/CLI)。

注意

建議您使用 Azure Az PowerShell 模組來與 Azure 互動。 若要開始使用,請參閱安裝 Azure PowerShell (部分機器翻譯)。 若要了解如何移轉至 Az PowerShell 模組,請參閱將 Azure PowerShell 從 AzureRM 移轉至 Az

使用自動調整規則或以手動方式相應縮小或放大 Service Fabric 叢集

虛擬機器擴展集是一個 Azure 計算資源,可以用來將一組虛擬機器當做一個集合加以部署和管理。 在 Service Fabric 叢集中定義的每個節點類型都會安裝為不同的虛擬機器擴展集。 然後每個節點類型可以獨立相應縮小或放大,可以開啟不同組的連接埠,並可以有不同的容量度量。 若要深入了解,請參閱 Service Fabric 節點類型文件。 因為叢集的 Service Fabric 節點類型由後端的虛擬機器擴展集組成,您必須為每個節點類型/虛擬機器擴展集設定自動調整規則。

注意

您的訂用帳戶必須要有足夠的核心,來新增構構成此叢集的虛擬機器。 目前沒有模型驗證,所以如果達到任一配額限制,就會收到部署時間失敗。

注意

如果使用已啟用 Hyper-V 角色的 Windows OS 映像,則會將 VM 設定為可進行巢狀虛擬化,而可用記憶體計量將無法使用,因為 VM 內的動態記憶體驅動程式會處於停止狀態。

選擇要調整規模的節點類型/虛擬機器擴展集

目前,您無法使用入口網站指定虛擬機器擴展集的自動調整規則,以建立 Service Fabric 叢集,因此我們將使用 Azure PowerShell (1.0+) 列出節點類型,然後為其新增自動調整規則。

若要取得建立叢集的虛擬機器擴展集清單,請執行下列 Cmdlet:

Get-AzResource -ResourceGroupName <RGname> -ResourceType Microsoft.Compute/VirtualMachineScaleSets

Get-AzVmss -ResourceGroupName <RGname> -VMScaleSetName <virtual machine scale set name>

為節點類型/虛擬機器擴展集設定自動調整規則

如果叢集有多個節點類型,請針對您要縮減或擴增的每個節點類型/虛擬機器擴展集,重複此動作。 請先考慮一定要有的節點數目,再設定自動調整規模。 主要節點類型一定要有的節點數目下限是由您已選擇的可靠性層級決定。 深入了解 可靠性層級

注意

將主要節點類型縮減到低於最小數目會造成叢集不穩定,甚至關閉。 這可能導致應用程式和系統服務資料遺失。

自動調整規模功能目前不是由應用程式可能向 Service Fabric 報告的負載所驅動。 所以,您現在取得的自動調整只由每個虛擬機器擴展集執行個體所發出的效能計數器驅動。

請遵循下列指示,為每個虛擬機器擴展集設定自動調整規模

注意

在縮減情況下,除非節點類型為 Gold 或 Silver 持久性層級,否則您必須以適當的節點名稱呼叫 Remove-ServiceFabricNodeState Cmdlet。 若為 Bronze 持久性,不建議一次縮減多個節點。

手動將 VM 新增至節點類型/虛擬機器擴展集

您擴增時,會將多個虛擬機器執行個體新增到擴展集。 這些執行個體會成為 Service Fabric 使用的節點。 擴展集有多個新增的執行個體 (透過相應放大) 時,Service Fabric 會知道並自動回應。

注意

新增 VM 需要時間,別期待新增立即生效。 事先妥善規劃增加容量,在 VM 容量可用之前預留 10 分鐘以上,讓複本/服務執行個體就定位。

使用範本新增 VM

遵循快速入門範本資源庫中的範例/指示,變更每個節點類型中的 VM 數目。

使用 PowerShell 或 CLI 命令新增 VM

下列程式碼會按照名稱取得擴展集,並將擴展集的容量增加 1。

$scaleset = Get-AzVmss -ResourceGroupName SFCLUSTERTUTORIALGROUP -VMScaleSetName nt1vm
$scaleset.Sku.Capacity += 1

Update-AzVmss -ResourceGroupName $scaleset.ResourceGroupName -VMScaleSetName $scaleset.Name -VirtualMachineScaleSet $scaleset

這段程式碼將容量設定為 6。

# Get the name of the node with
az vmss list-instances -n nt1vm -g sfclustertutorialgroup --query [*].name

# Use the name to scale
az vmss scale -g sfclustertutorialgroup -n nt1vm --new-capacity 6

手動從節點類型/虛擬機器擴展集移除 VM

縮減節點類型時會從擴展集移除 VM 執行個體。 如果節點類型是 Bronze 持久性層級,則 Service Fabric 不會知道情況,只是回報節點已遺失。 Service Fabric 接著會報告叢集狀況不良的狀態。 若要避免該不良狀態,您必須明確從叢集移除節點,並移除節點狀態。

Service Fabric 系統服務在叢集是主要節點類型中執行。 縮減主要節點類型時,切勿將執行個體數目縮減到低於可靠性層保證的數目。

如果是具狀態服務,您需要一些永遠啟動的節點來維持可用性,以及維持服務的狀態。 您至少需要與資料分割/服務的目標複本集計數相等的節點數目。

移除 Service Fabric 節點

手動移除節點狀態的步驟只適用於 Bronze 持久性層的節點類型。 若為 Silver 和 Gold 持久性層,則由平台自動完成這些步驟。 如需持久性的詳細資訊,請參閱 Service Fabric 叢集容量規劃

注意

針對所有啟用 Gold 或 Silver 持久性的虛擬機器擴展集維持至少五個節點。 如果縮減到低於此閾值,則叢集會陷入錯誤狀態,您將需要手動清除已移除的節點。

為了讓叢集節點在升級和容錯網域之間平均分配,因而讓它們的使用率更加平均,應該先移除最近建立的節點。 換句話說,節點的移除順序應該與建立順序相反。 最近建立的節點具有最大的 virtual machine scale set InstanceId 屬性值。 下列程式碼範例會傳回最近建立的節點。

Get-ServiceFabricNode | Sort-Object NodeInstanceId -Descending | Select-Object -First 1
sfctl node list --query "sort_by(items[*], &name)[-1]"

Service Fabric 叢集必須知道將移除此節點。 您需要採取三個步驟:

  1. 停用節點,以免節點再成為資料的複本。
    PowerShell:Disable-ServiceFabricNode
    sfctl:sfctl node disable

  2. 停止節點,以便 Service Fabric 執行階段正常關閉,而且應用程式取得終止要求。
    PowerShell:Start-ServiceFabricNodeTransition -Stop
    sfctl:sfctl node transition --node-transition-type Stop

  3. 從叢集移除該節點。
    PowerShell:Remove-ServiceFabricNodeState
    sfctl:sfctl node remove-state

這三個步驟套用至節點之後,即可從擴展集移除節點。 如果在 bronze 之外使用任何持久性層,則移除擴展集執行個體時,將完成這些步驟。

下列程式碼區塊會取得、停用、停止最後建立的節點,並從叢集移除該節點。

#### After you've connected.....
# Get the node that was created last
$node = Get-ServiceFabricNode | Sort-Object { $_.NodeName.Substring($_.NodeName.LastIndexOf('_') + 1) } -Descending | Select-Object -First 1

# Node details for the disable/stop process
$nodename = $node.NodeName
$nodeid = $node.NodeInstanceId

$loopTimeout = 10

# Run disable logic
Disable-ServiceFabricNode -NodeName $nodename -Intent RemoveNode -TimeoutSec 300 -Force

$state = Get-ServiceFabricNode | Where-Object NodeName -eq $nodename | Select-Object -ExpandProperty NodeStatus

while (($state -ne [System.Fabric.Query.NodeStatus]::Disabled) -and ($loopTimeout -ne 0))
{
    Start-Sleep 5
    $loopTimeout -= 1
    $state = Get-ServiceFabricNode | Where-Object NodeName -eq $nodename | Select-Object -ExpandProperty NodeStatus
    Write-Host "Checking state... $state found"
}

# Exit if the node was unable to be disabled
if ($state -ne [System.Fabric.Query.NodeStatus]::Disabled)
{
    Write-Error "Disable failed with state $state"
}
else
{
    # Stop node
    $stopid = New-Guid
    Start-ServiceFabricNodeTransition -Stop -OperationId $stopid -NodeName $nodename -NodeInstanceId $nodeid -StopDurationInSeconds 300

    $state = (Get-ServiceFabricNodeTransitionProgress -OperationId $stopid).State
    $loopTimeout = 10

    # Watch the transaction
    while (($state -eq [System.Fabric.TestCommandProgressState]::Running) -and ($loopTimeout -ne 0))
    {
        Start-Sleep 5
        $state = (Get-ServiceFabricNodeTransitionProgress -OperationId $stopid).State
        Write-Host "Checking state... $state found"
    }

    if ($state -ne [System.Fabric.TestCommandProgressState]::Completed)
    {
        Write-Error "Stop transaction failed with $state"
    }
    else
    {
        # Remove the node from the cluster
        Remove-ServiceFabricNodeState -NodeName $nodename -TimeoutSec 300 -Force
    }
}

在下方的 sfctl 程式碼中,會使用下列命令來取得最後建立節點的 node-name 值:sfctl node list --query "sort_by(items[*], &name)[-1].name"

# Inform the node that it is going to be removed
sfctl node disable --node-name _nt1vm_5 --deactivation-intent 4 -t 300

# Stop the node using a random guid as our operation id
sfctl node transition --node-instance-id 131541348482680775 --node-name _nt1vm_5 --node-transition-type Stop --operation-id c17bb4c5-9f6c-4eef-950f-3d03e1fef6fc --stop-duration-in-seconds 14400 -t 300

# Remove the node from the cluster
sfctl node remove-state --node-name _nt1vm_5

提示

使用下列 sfctl 查詢,檢查每個步驟的狀態

檢查停用狀態sfctl node list --query "sort_by(items[*], &name)[-1].nodeDeactivationInfo"

檢查停止狀態sfctl node list --query "sort_by(items[*], &name)[-1].isStopped"

縮減擴展集

已從叢集移除 Service Fabric 節點之後,即可相應縮小虛擬機器擴展集。 在下列範例中,擴展集容量減少 1。

$scaleset = Get-AzVmss -ResourceGroupName SFCLUSTERTUTORIALGROUP -VMScaleSetName nt1vm
$scaleset.Sku.Capacity -= 1

Update-AzVmss -ResourceGroupName SFCLUSTERTUTORIALGROUP -VMScaleSetName nt1vm -VirtualMachineScaleSet $scaleset

這段程式碼將容量設定為 5。

# Get the name of the node with
az vmss list-instances -n nt1vm -g sfclustertutorialgroup --query [*].name

# Use the name to scale
az vmss scale -g sfclustertutorialgroup -n nt1vm --new-capacity 5

Service Fabric Explorer 可能出現的行為

當您擴增叢集時,Service Fabric Explorer 會反映屬於叢集的節點數目 (虛擬機器擴展集執行個體)。 不過,當您縮減叢集時,除非以適當的節點名稱呼叫 Remove-ServiceFabricNodeState cmd,否則會看到已移除的節點/VM 執行個體顯示為狀況不良狀態。

以下是這種行為的說明。

Service Fabric Explorer 列出的節點會反映出 Service Fabric 系統服務 (特別是 FM) 所知叢集曾經有過/現有擁有的節點數目。 當您縮減虛擬機器擴展集時,雖然已刪除 VM,但 FM 系統服務仍然認為節點 (對應至已刪除的 VM) 會回復。 所以 Service Fabric Explorer 會繼續顯示該節點 (雖然健全狀況狀態可能是錯誤或未知)。

為確保移除 VM 時也移除節點,您有兩個選項︰

  1. 為叢集中的節點類型選擇 Gold 或 Silver 持久性層級,提供您基礎結構的整合。 縮減時,節點會自動從我們的系統服務 (FM) 狀態中移除。 請參閱 持久性層級的詳細資訊

注意

針對所有啟用 Gold 或 Silver 持久性的虛擬機器擴展集維持至少五個節點。 如果縮減到低於此閾值,則叢集會陷入錯誤狀態,您將需要手動清除已移除的節點。

  1. VM 執行個體縮減之後,您必須呼叫 Remove-ServiceFabricNodeState Cmdlet

注意

Service Fabric 叢集需要有一定數量的節點隨時都處於啟動,以維持可用性並維持狀態 - 稱為「維持仲裁」。因此,除非您已先執行 狀態的完整備份,否則關閉叢集中的所有電腦通常並不安全。

下一步

亦請參閱下列文章,了解規劃叢集容量、升級叢集和分割服務︰