Reduzir ou escalar um cluster horizontalmente

Aviso

Leia esta seção antes de dimensionar

O dimensionamento de recursos de computação para originar a carga de trabalho de seu aplicativo requer planejamento intencional, quase sempre levará mais de uma hora para ser concluído em um ambiente de produção e exige que você entenda sua carga de trabalho e contexto de negócios; Na verdade, se você nunca fez essa atividade antes, é recomendável começar lendo e compreendendo considerações sobre o planejamento de capacidade de cluster do Service Fabric, antes de continuar com o restante deste documento. Esta recomendação é para evitar problemas não intencionais do LiveSite, e também é recomendado testar com sucesso as operações que você decidir executar em um ambiente que não seja de produção. A qualquer momento você pode relatar problemas de produção ou solicitar suporte pago para o Azure. Para engenheiros alocados para executar essas operações que possuam contexto apropriado, este artigo descreverá as operações de dimensionamento, mas você deve decidir e entender quais operações são apropriadas para seu caso de uso; como os recursos a serem dimensionados (CPU, Armazenamento, Memória), a direção a ser dimensionada (vertical ou horizontalmente) e as operações a serem executadas (implantação de modelo de recurso, portal, PowerShell / CLI).

Observação

Recomendamos que você use o módulo Az PowerShell do Azure para interagir com o Azure. Confira Instalar o Azure PowerShell para começar. Para saber como migrar para o módulo Az PowerShell, confira Migrar o Azure PowerShell do AzureRM para o Az.

Reduzir horizontalmente ou escalar horizontalmente um cluster do Service Fabric usando regra de dimensionamento automático ou manualmente

Os conjuntos de escala de Máquina Virtual são um recurso de Computação do Azure que você pode usar para implantar e gerenciar uma coleção de máquinas virtuais como um conjunto. Cada tipo de nó definido em um cluster do Service Fabric está configurado como um conjunto de dimensionamento de máquinas virtuais separado. Cada tipo de nó pode ser escalado ou reduzido horizontalmente de forma independente, ter conjuntos diferentes de portas abertas e métricas de capacidade diferentes. Leia mais sobre isso no documento Tipos de nó do Service Fabric. Como os tipos de nós do Service Fabric no cluster são compostos por conjuntos de dimensionamento de máquinas virtuais no back-end, é necessário configurar regras de dimensionamento automático para cada tipo de nó/conjunto de dimensionamento de máquinas virtuais.

Observação

Sua assinatura precisa ter uma quantidade suficiente de núcleos para adicionar as novas VMs que compõe esse cluster. Atualmente, não há nenhuma validação de modelo. Logo, você receberá uma falha de tempo de implantação se qualquer um dos limites de cota for atingido.

Observação

Se estiver usando a imagem do sistema operacional Windows com a função Hyper-V habilitada, ou seja, a VM será configurada para virtualização aninhada, a Métrica de Memória Disponível não estará disponível, pois o driver de memória dinâmica dentro da VM estará em um estado parado.

Escolher o tipo de nó/conjunto de dimensionamento de máquinas virtuais a ser dimensionado

No momento, não é possível especificar as regras de dimensionamento automático para conjuntos de dimensionamento de máquinas virtuais usando o portal, portanto para criar um Cluster do Service Fabric. Portanto, vamos utilizar o Microsoft Azure PowerShell (1.0+) para listar os tipos de nó e, em seguida, adicionar regras de dimensionamento automático a eles.

Para obter a lista de conjuntos de dimensionamento de máquinas virtuais que compõem seu cluster, execute os seguintes cmdlets:

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

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

Definir regras de dimensionamento automático para o tipo de nó/conjunto de dimensionamento de máquinas virtuais

Se o cluster tiver vários tipos de nós, repita este procedimento para cada tipo de nó/conjuntos de dimensionamento de máquinas virtuais que você quiser escalar ou reduzir horizontalmente. Leve em conta o número de nós que você precisa ter antes de configurar o dimensionamento automático. O número mínimo de nós necessários para o tipo de nó primário é controlado pelo nível de confiabilidade escolhido. Leia mais sobre os níveis de confiabilidade.

Observação

O dimensionamento no tipo de nó primário para um número inferior ao mínimo causará a instabilidade ou indisponibilidade do cluster. Isso poderá resultar em perda de dados de seus aplicativos e dos serviços do sistema.

Atualmente, o recurso de escala automática não é controlado pelas cargas que os aplicativos podem relatar ao Service Fabric. Portanto, nesse momento, o dimensionamento automático obtido é meramente controlado pelos contadores de desempenho que são emitidos por cada uma das instâncias do conjunto de dimensionamento de máquinas virtuais.

Siga estas instruções para configurar o dimensionamento automático para cada conjunto de dimensionamento de máquinas virtuais.

Observação

Em um cenário de redução vertical, a menos que o tipo de nó tenha um nível de durabilidade Gold ou Silver, você precisará chamar o cmdlet Remove-ServiceFabricNodeState pelo nome de nó apropriado. Para a durabilidade Bronze, não recomendamos reduzir horizontalmente mais de um nó por vez.

Adicionar as VMs manualmente a um tipo de nó/conjunto de dimensionamento de máquinas virtuais

Ao aumentar, você adicionar mais instâncias de máquina virtual ao conjunto de dimensionamento. Essas instâncias tornam-se os nós que o Service Fabric usa. O Service Fabric sabe quando o conjunto de dimensionamento tem mais instâncias adicionadas (aumentando) e reage automaticamente.

Observação

O processo de adicionar VMs leva tempo. Portanto, não espere que as adições sejam instantâneas. Planeje adicionar capacidade com bastante antecedência para permitir mais 10 minutos antes que a capacidade da VM esteja disponível para que as réplicas/instâncias de serviço sejam alocadas.

Adicionar VMs usando um modelo

Siga os modelos/instruções da galeria de modelos de Início Rápido para alterar o número de VMs em cada tipo de nó.

Adicionar VMs usando o PowerShell ou comandos da CLI

O código a seguir obtém um conjunto de dimensionamento por nome e aumenta a capacidade do conjunto de dimensionamento em 1.

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

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

Esse código define a capacidade para 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

Remover as VMs manualmente do tipo de nó/conjunto de dimensionamento de máquinas virtuais

Quando você dimensiona em um tipo de nó, remove instâncias de VM do conjunto de dimensionamento. Se o tipo de nó for nível de durabilidade Bronze, o Service Fabric não está ciente do que aconteceu e informa que um nó desapareceu. Service Fabric então relata um estado não íntegro para o cluster. Para evitar esse estado inválido, você deve remover explicitamente o nó do cluster e remover o estado do nó.

Os serviços do sistema Service Fabric são executados no tipo de nó primário do cluster. Ao dimensionar o tipo de nó primário, nunca dimensione no número de instâncias para menos do que aquilo que a camada de confiabilidade requer.

Para um serviço com estado, você precisa de um determinado número de nós que devem estar sempre ativos para manter a disponibilidade e preservar o estado do serviço. No mínimo, é necessário que o número de nós seja igual à contagem de conjunto de réplicas de destino do serviço/partição.

Remover o nó do Service Fabric

As etapas para remover manualmente o estado do nó se aplicam somente a tipos de nó com uma camada de durabilidade Bronze. Para o nível de durabilidade Prata e Ouro, essas etapas são executadas automaticamente pela plataforma. Para obter mais informações sobre durabilidade, consulte Planejamento de capacidade do cluster do Service Fabric.

Observação

Mantenha uma contagem mínima de cinco nós para qualquer conjunto de dimensionamento de máquinas virtuais que tenha o nível de durabilidade Ouro ou Prata habilitado. O cluster entrará no estado de erro se você estiver abaixo desse limite e precisará limpar manualmente os nós removidos.

Para manter os nós do cluster distribuídos uniformemente entre domínios de falha e atualização e, portanto, habilitar sua utilização uniforme, o nó criado mais recentemente deve ser removido primeiro. Em outras palavras, os nós devem ser removidos na ordem inversa à de sua criação. O nó criado mais recentemente é aquele com o maior valor da propriedade virtual machine scale set InstanceId. Os exemplos de código a seguir retornam o nó criado mais recentemente.

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

O cluster do Service Fabric precisa saber que este nó será removido. Você precisa executar três etapas:

  1. Desabilite o nó para que ele não seja mais uma replicação de dados.
    PowerShell: Disable-ServiceFabricNode
    sfctl: sfctl node disable

  2. Pare o nó de modo que o runtime do Service Fabric seja desligado corretamente e o aplicativo obtenha uma solicitação de encerramento.
    PowerShell: Start-ServiceFabricNodeTransition -Stop
    sfctl: sfctl node transition --node-transition-type Stop

  3. Remova o nó do cluster.
    PowerShell: Remove-ServiceFabricNodeState
    sfctl: sfctl node remove-state

Depois que essas três etapas tiverem sido aplicadas ao nó, ele poderá ser removido do conjunto de dimensionamento. Se você estiver usando qualquer camada de durabilidade além bronze, estas etapas serão executadas para você quando a instância do conjunto de dimensionamento for removida.

O bloco de código a seguir obtém o último nó criado, desabilita, para e remove o nó do 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
    }
}

No código sfctl abaixo, o comando a seguir é usado para obter o valor node-name do último nó criado: 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

Dica

Use as seguintes consultas sfctl para verificar o status de cada etapa

Verificar o status de desativaçãosfctl node list --query "sort_by(items[*], &name)[-1].nodeDeactivationInfo"

Verificar o status de paradasfctl node list --query "sort_by(items[*], &name)[-1].isStopped"

Reduzir horizontalmente o conjunto de dimensionamento

Agora que o nó do Service Fabric foi removido do cluster, o conjunto de dimensionamento de máquinas virtuais pode ser reduzido horizontalmente. No exemplo a seguir, a capacidade do conjunto de dimensionamento é reduzida em 1.

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

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

Esse código define a capacidade para 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

Comportamentos que podem ser observados no Service Fabric Explorer

Ao escalar horizontalmente um cluster, o Service Fabric Explorer refletirá o número de nós (instâncias de conjunto de dimensionamento de máquinas virtuais) que fazem parte do cluster. No entanto, ao reduzir horizontalmente um cluster, você verá o nó removido/instância VM exibida em um estado não íntegro, a menos que você chame o cmdlet Remove-ServiceFabricNodeState pelo nome de nó apropriado.

Veja a seguir a explicação para esse comportamento.

Os nós listados no Service Fabric Explorer são um reflexo do que os serviços do sistema Service Fabric (FM especificamente) sabem sobre o número de nós que o cluster tinha. Ao reduzir horizontalmente o conjunto de dimensionamento de máquinas virtuais, observe que a VM é excluída, mas o serviço de sistema do FM ainda admitirá que o nó (mapeado para a VM que foi excluída) retornará. Portanto, o Service Fabric Explorer continua exibindo o nó (embora o estado de integridade possa ser erro ou desconhecido).

Para certificar-se de que um nó será removido quando uma VM for removida, você tem duas opções:

  1. Escolha um nível de durabilidade de Gold ou Silver para os tipos de nó no seu cluster, o que fornece a integração de infraestrutura. Quando você dimensionar, os nós serão removidos automaticamente do estado de nossos serviços do sistema (FM). Confira os detalhes sobre os níveis de durabilidade aqui

Observação

Mantenha uma contagem mínima de cinco nós para qualquer conjunto de dimensionamento de máquinas virtuais que tenha o nível de durabilidade Ouro ou Prata habilitado. O cluster entrará no estado de erro se você reduzir horizontalmente abaixo desse limite e precisará limpar manualmente os nós removidos.

  1. Depois que a instância VM tiver sido reduzida horizontalmente, você precisará chamar o cmdlet Remove-ServiceFabricNodeState.

Observação

Os clusters do Service Fabric exigem determinado número de nós que devem estar ativos o tempo todo para manter a disponibilidade e preservar o estado, conhecido como "manter o quórum". Desta forma, em geral, não é seguro desligar todos os computadores no cluster, a menos que você tenha feito primeiro um backup completo do estado.

Próximas etapas

Leia os seguintes artigos para saber também sobre como planejar a capacidade do cluster, atualizar um cluster e particionar os serviços: