Aumentare o ridurre un cluster

Avviso

Leggere questa sezione prima di ridimensionare

Il ridimensionamento di risorse di calcolo per originare il carico di lavoro dell'applicazione richiede una pianificazione intenzionale, che quasi sempre richiede più di un'ora in un ambiente di produzione e richiede la comprensione del carico di lavoro e del contesto di business. Se non hai mai eseguito questa attività in precedenza, è consigliabile iniziare leggendo e comprendendo le considerazioni sulla pianificazione della capacità del cluster Service Fabric, prima di continuare con il resto di questo documento. Questo suggerimento intende evitare problemi LiveSite non intenzionali. Inoltre, si consiglia di testare correttamente le operazioni che si decide di eseguire su un ambiente non di produzione. È possibile segnalare, in qualsiasi momento, problemi di produzione o richiedere supporto a pagamento per Azure. Per i tecnici assegnati all’esecuzione di queste operazioni che conoscono il contesto di esecuzione appropriato, questo articolo descrive le operazioni di scalabilità, ma è necessario stabilire e comprendere quali operazioni siano appropriate per il caso d'uso in questione; ad esempio le risorse da ridimensionare (CPU, archiviazione, memoria), la direzione di ridimensionamento (orizzontale o verticale) e le operazioni da eseguire (distribuzione modelli delle risorse, portale, PowerShell/CLI).

Nota

È consigliabile usare il modulo Azure Az PowerShell per interagire con Azure. Per iniziare, vedere Installare Azure PowerShell. Per informazioni su come eseguire la migrazione al modulo AZ PowerShell, vedere Eseguire la migrazione di Azure PowerShell da AzureRM ad Az.

Aumentare o ridurre le istanze del cluster di Service Fabric con le regole di ridimensionamento automatico o manualmente

I set di scalabilità di macchine virtuali sono una risorsa di calcolo di Azure che è possibile usare per distribuire e gestire una raccolta di macchine virtuali come set. Ogni tipo di nodo definito in un cluster di Service Fabric viene configurato come set di scalabilità di macchine virtuali distinto. Ogni tipo di nodo può quindi essere aumentato o ridotto in modo indipendente, avere diversi set di porte aperte e avere metriche per la capacità diverse. Per altre informazioni, vedere il documento Sui tipi di nodo di Service Fabric . Poiché i tipi di nodo di Service Fabric nel cluster sono costituiti da set di scalabilità di macchine virtuali nel back-end, è necessario configurare regole di scalabilità automatica per ogni tipo di nodo/set di scalabilità di macchine virtuali.

Nota

È necessario che nella sottoscrizione sia incluso un numero di core sufficienti per aggiungere le nuove VM che costituiranno il cluster. Non esiste attualmente una funzionalità di convalida del modello quindi, se viene raggiunto uno dei limiti della quota, verrà visualizzato un errore in fase di distribuzione.

Nota

Se si usa l'immagine del sistema operativo Windows con il ruolo Hyper-V abilitato, ad esempio. la macchina virtuale verrà configurata per la virtualizzazione annidata, la metrica memoria disponibile non sarà disponibile, poiché il driver di memoria dinamica all'interno della macchina virtuale sarà arrestato.

Scegliere il tipo di nodo o il set di scalabilità di macchine virtuali da ridimensionare

Per creare un cluster di Service Fabric non è attualmente possibile specificare le regole di ridimensionamento automatico per i set di scalabilità di macchine virtuali tramite il portale. Si userà quindi Azure PowerShell 1.0 o versione successiva per elencare i tipi di nodo e aggiungervi poi le regole di ridimensionamento automatico.

Per ottenere l'elenco dei set di scalabilità di macchine virtuali che costituiscono il cluster, eseguire i cmdlet seguenti:

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

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

Impostare le regole di scalabilità automatica per il tipo di nodo/set di scalabilità di macchine virtuali

Se il cluster ha più tipi di nodo, ripetere questa operazione per ogni tipo di nodo/set di scalabilità di macchine virtuali che si desidera ridimensionare (in o in uscita). Considerare il numero di nodi che essere disponibili prima di configurare il ridimensionamento automatico. Il numero minimo di nodi necessari per il tipo di nodo primario è determinato dal livello di affidabilità scelto. Per altre informazioni, vedere la sezione relativa ai livelli di affidabilità.

Nota

Il ridimensionamento del tipo di nodo primario a un numero inferiore al numero minimo renderà il cluster instabile o anche inattivo. In questo caso, è possibile che si verifichi una perdita di dati per le applicazioni e per i servizi di sistema.

Attualmente la funzionalità di ridimensionamento automatico non è determinata dai carichi che le applicazioni segnalano a Service Fabric. Al momento, il ridimensionamento automatico che si ottiene dipende esclusivamente dai contatori delle prestazioni generati da ognuna delle istanze del set di scalabilità di macchine virtuali.

Seguire queste istruzioni per configurare la scalabilità automatica per ogni set di scalabilità di macchine virtuali.

Nota

In uno scenario con scalabilità orizzontale, a meno che il tipo di nodo non abbia un livello di durabilità Gold o Silver, è necessario chiamare il cmdlet Remove-ServiceFabricNodeState con il nome del nodo appropriato. Per la durabilità Bronze, non è consigliabile ridimensionare più nodi alla volta.

Aggiungere manualmente macchine virtuali a un tipo di nodo o a un set di scalabilità di macchine virtuali

Quando si aumenta il numero di istanze, si aggiungono altre istanze di una macchina virtuale al set di scalabilità. Queste istanze diventano i nodi usati da Service Fabric. Service Fabric determina quando vengono aggiunte altre istanze al set di scalabilità e reagisce automaticamente.

Nota

L'aggiunta di macchine virtuali richiede tempo, quindi non aspettarsi che le aggiunte siano istantanee. Pianificare l'aggiunta della capacità in anticipo, consentendo più di 10 minuti prima che la capacità della macchina virtuale sia disponibile per l'inserimento delle repliche o delle istanze del servizio.

Aggiungere macchine virtuali usando un modello

Seguire l'esempio/istruzioni nella raccolta di modelli di avvio rapido per modificare il numero di macchine virtuali in ogni tipo di nodo.

Aggiungere macchine virtuali usando i comandi di PowerShell o dell'interfaccia della riga di comando

Il codice seguente ottiene un set di scalabilità in base al nome e aumenta di 1 la capacità del set di scalabilità.

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

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

Questo codice imposta la capacità su 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

Rimuovere manualmente le macchine virtuali da un tipo di nodo o da un set di scalabilità di macchine virtuali

Quando si esegue la scalabilità in un tipo di nodo, rimuovere le istanze di macchina virtuale dal set di scalabilità. Se il tipo di nodo è di livello di durabilità Bronze, Service Fabric non è a conoscenza di ciò che è accaduto e segnala che un nodo è scomparso. Service Fabric segnala quindi uno stato non integro per il cluster. Per evitare che lo stato non sia valido, è necessario rimuovere in modo esplicito il nodo dal cluster e rimuovere lo stato del nodo.

I servizi di sistema di Service Fabric vengono eseguiti nel tipo di nodo primario del cluster. Quando si ridimensiona il tipo di nodo primario, non ridimensionare mai il numero di istanze a un livello di affidabilità inferiore a quello garantito dal livello di affidabilità .

Per un servizio con stato, è necessario un determinato numero di nodi per essere sempre in grado di assicurare la disponibilità e mantenere lo stato del servizio. Come minimo, è necessario un numero di nodi uguale al conteggio dei set di repliche di destinazione della partizione o dei servizi.

Rimuovere il nodo di Service Fabric

I passaggi per la rimozione manuale dello stato del nodo si applicano solo ai tipi di nodo con un livello di durabilità Bronze . Per il livello di durabilità Silver e Gold , questi passaggi vengono eseguiti automaticamente dalla piattaforma. Per altre informazioni sulla durabilità, vedere Pianificazione della capacità dei cluster di Service Fabric.

Nota

Mantenere un numero minimo di cinque nodi per tutti i set di scalabilità di macchine virtuali con livello di durabilità Gold o Silver abilitato. Il cluster immetterà lo stato di errore se si aumenta al di sotto di questa soglia e sarà necessario pulire manualmente i nodi rimossi.

Per garantire la distribuzione uniforme dei nodi del cluster tra i domini di aggiornamento e di errore e consentirne quindi un utilizzo uniforme, è opportuno rimuovere per primo l'ultimo nodo creato. In altre parole, i nodi devono essere rimossi in ordine inverso rispetto a quello in cui sono stati creati. L'ultimo nodo creato è quello che presenta il valore più elevato per la proprietà virtual machine scale set InstanceId. Negli esempi di codice seguenti viene restituito l'ultimo nodo creato.

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

Il cluster di Service Fabric deve determinare che questo nodo verrà rimosso. È necessario eseguire tre passaggi:

  1. Disabilitare il nodo in modo che non sia più una replica per i dati.
    PowerShell: Disable-ServiceFabricNode
    sfctl: sfctl node disable

  2. Arrestare il nodo in modo che il runtime di Service Fabric venga arrestato normalmente e l'app riceva una richiesta di interruzione.
    PowerShell: Start-ServiceFabricNodeTransition -Stop
    sfctl: sfctl node transition --node-transition-type Stop

  3. Rimuovere il nodo dal cluster.
    PowerShell: Remove-ServiceFabricNodeState
    sfctl: sfctl node remove-state

Dopo avere applicato questi tre passaggi al nodo, è possibile rimuoverlo dal set di scalabilità. Se si usa un livello di durabilità superiore a Bronze, questi passaggi vengono eseguiti automaticamente quando viene rimossa l'istanza del set di scalabilità.

Il blocco di codice seguente ottiene l'ultimo nodo creato, disabilita, arresta e rimuove il nodo dal cluster.

#### 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
    }
}

Nel codice sfctl riportato più avanti il comando seguente viene usato per ottenere il valore node-name dell'ultimo nodo creato: 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

Suggerimento

Usare le query sfctl seguenti per controllare lo stato di ogni passaggio

Controllare lo stato di disattivazionesfctl node list --query "sort_by(items[*], &name)[-1].nodeDeactivationInfo"

Controllare lo stato di arrestosfctl node list --query "sort_by(items[*], &name)[-1].isStopped"

Ridurre il numero di istanze del set di scalabilità

Ora che il nodo di Service Fabric è stato rimosso dal cluster, è possibile ridurre il numero di istanze del set di scalabilità di macchine virtuali. Nell'esempio seguente la capacità del set di scalabilità è ridotta di 1.

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

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

Questo codice imposta la capacità su 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

Comportamenti che è possibile osservare in Service Fabric Explorer

Quando si aumenta il numero di istanze di un cluster, il Service Fabric Explorer rifletterà il numero di nodi (istanze del set di scalabilità di macchine virtuali) che fanno parte del cluster. Tuttavia, quando si ridimensiona un cluster in verrà visualizzata l'istanza di nodo/macchina virtuale rimossa in uno stato non integro, a meno che non si chiami Remove-ServiceFabricNodeState cmd con il nome del nodo appropriato.

Ecco la spiegazione di questo comportamento.

I nodi elencati in Service Fabric Explorer sono una riflessione di ciò che i servizi di sistema di Service Fabric (FM in particolare) sanno sul numero di nodi che il cluster aveva/ha. Quando si ridimensiona il set di scalabilità di macchine virtuali in, la macchina virtuale è stata eliminata, ma il servizio di sistema FM ritiene ancora che il nodo (mappato alla macchina virtuale eliminata) tornerà. Service Fabric Explorer continua quindi a visualizzare tale nodo, anche se lo stato di integrità è sconosciuto o di errore.

Per assicurarsi che un nodo venga rimosso quando si rimuove una VM, sono disponibili due opzioni:

  1. Scegliere un livello di durabilità Gold o Silver per i tipi di nodo del cluster, che offre l'integrazione dell'infrastruttura. Quando si esegue la scalabilità orizzontale, i nodi verranno rimossi automaticamente dallo stato dei servizi di sistema (FM). Fare riferimento ai i dettagli sui livelli di durabilità qui

Nota

Mantenere un numero minimo di cinque nodi per tutti i set di scalabilità di macchine virtuali con livello di durabilità Gold o Silver abilitato. Il cluster immetterà lo stato di errore se si esegue la scalabilità inferiore a questa soglia e sarà necessario pulire manualmente i nodi rimossi.

  1. Dopo aver ridimensionato l'istanza della macchina virtuale, è necessario chiamare il cmdlet Remove-ServiceFabricNodeState.

Nota

I cluster di Service Fabric richiedono un determinato numero di nodi per essere aggiornati in modo da mantenere la disponibilità e mantenere lo stato, definito "gestione del quorum". Pertanto, in genere non è sicuro arrestare tutti i computer nel cluster, a meno che non sia stato eseguito prima un backup completo dello stato.

Passaggi successivi

Per altre informazioni sulla pianificazione della capacità del cluster, l'aggiornamento di un cluster e il partizionamento dei servizi, vedere gli articoli seguenti: