Reduzir ou aumentar um cluster horizontalmente

Aviso

Leia esta seção antes de dimensionar

Dimensionar recursos de computação para originar a carga de trabalho do 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ê compreenda sua carga de trabalho e contexto de negócios; na verdade, se você nunca fez essa atividade antes, é recomendável começar lendo e entendendo as considerações de planejamento de capacidade de cluster do Service Fabric antes de continuar o restante deste documento. Essa recomendação é para evitar problemas não intencionais do LiveSite, e também é recomendado que você teste com êxito as operações que decide 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 possuem 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 quais recursos dimensionar (CPU, Armazenamento, Memória), em que direção dimensionar (Vertical ou Horizontalmente) e quais operações executar (implantação de Modelo de Recurso, Portal, PowerShell/CLI).

Nota

Recomendamos que utilize o módulo Azure Az do PowerShell para interagir com o Azure. Para começar, consulte Instalar o Azure PowerShell. Para saber como migrar para o módulo do Az PowerShell, veja Migrar o Azure PowerShell do AzureRM para o Az.

Dimensionar um cluster do Service Fabric para dentro ou para fora usando regras de dimensionamento automático ou manualmente

Os conjuntos de dimensionamento de máquinas virtuais 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 é configurado como um conjunto de escala de máquina virtual separado. Cada tipo de nó pode então ser dimensionado para dentro ou para fora independentemente, ter diferentes conjuntos de portas abertas e pode ter métricas de capacidade diferentes. Leia mais sobre isso no documento de tipos de nó do Service Fabric. Como os tipos de nó do Service Fabric em seu cluster são feitos de conjuntos de escala de máquina virtual no back-end, você precisa configurar regras de dimensionamento automático para cada tipo de nó/conjunto de escala de máquina virtual.

Nota

Sua assinatura deve ter núcleos suficientes para adicionar as novas VMs que compõem esse cluster. Não há validação de modelo atualmente, portanto, você obtém uma falha de tempo de implantação, se qualquer um dos limites de cota for atingido.

Nota

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, uma vez que o driver de memória dinâmica dentro da VM estará em um estado interrompido.

Escolha o tipo de nó/escala da máquina virtual definida para dimensionar

Atualmente, você não pode especificar as regras de dimensionamento automático para conjuntos de dimensionamento de máquina virtual usando o portal para criar um Cluster do Service Fabric, portanto, vamos usar o 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áquina virtual que compõem o 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 escala de máquina virtual

Se o cluster tiver vários tipos de nó, repita isso para cada tipo de nó/conjunto de dimensionamento de máquina virtual que você deseja dimensionar (para dentro ou para fora). Antes de configurar o dimensionamento automático, tenha em conta o número de nós que tem de ter. O número mínimo de nós que tem de ter para o tipo de nó principal é condicionado pelo nível de fiabilidade que escolheu. Leia mais sobre os níveis de fiabilidade.

Nota

O dimensionamento no tipo de nó primário para menos do que o número mínimo tornará o cluster instável ou até mesmo o derrubará. Isso pode resultar em perda de dados para seus aplicativos e para os serviços do sistema.

Atualmente, o recurso de dimensionamento automático não é orientado pelas cargas que seus aplicativos podem estar relatando ao Service Fabric. Portanto, neste momento, a escala automática que você obtém é puramente impulsionada pelos contadores de desempenho emitidos por cada uma das instâncias do conjunto de escala da máquina virtual.

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

Nota

Em um cenário de escala, a menos que seu tipo de nó tenha um nível de durabilidade de Gold ou Silver, você precisa chamar o cmdlet Remove-ServiceFabricNodeState com o nome de nó apropriado. Para a durabilidade do Bronze, não é recomendado dimensionar em mais de um nó de cada vez.

Adicionar manualmente VMs a um tipo de nó/conjunto de escala de máquina virtual

Ao aumentar horizontalmente, adiciona mais instâncias de máquina virtual ao conjunto de dimensionamento. Estas instâncias tornam-se os nós que o Service Fabric utiliza. O Service Fabric sabe quando são adicionadas mais instâncias ao conjunto de dimensionamento (ao aumentar horizontalmente) e reage automaticamente.

Nota

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

Adicionar VMs usando um modelo

Siga o exemplo/instruções na galeria de modelos de início rápido para alterar o número de VMs em cada tipo de nó.

Adicionar VMs usando comandos PowerShell ou CLI

O código seguinte 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

Este 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 manualmente VMs de um tipo de nó/conjunto de escala de máquina virtual

Ao dimensionar em um tipo de nó, você remove instâncias de VM do conjunto de escala. Se o tipo de nó for o nível de durabilidade Bronze, o Service Fabric não saberá o que aconteceu e informará que um nó desapareceu. O Service Fabric comunica então o mau estado de funcionamento do cluster. Para evitar esse estado incorreto, você deve remover explicitamente o nó do cluster e remover o estado do nó.

Os serviços do sistema de malha de serviço são executados no tipo de nó primário no cluster. Ao dimensionar no tipo de nó primário, nunca dimensione o número de instâncias para menos do que o nível de confiabilidade garante.

Para um serviço com monitoração de estado, você precisa que um certo número de nós esteja sempre ativo para manter a disponibilidade e preservar o estado do seu serviço. No mínimo, você precisa do número de nós igual à contagem do conjunto de réplicas de destino da partição/serviço.

Remover o nó do Service Fabric

As etapas para remover manualmente o estado do nó aplicam-se apenas aos tipos de nó com uma camada de durabilidade Bronze . Para o nível de durabilidade Silver e Gold , essas etapas são feitas automaticamente pela plataforma. Para obter mais informações sobre a durabilidade, veja Planeamento da capacidade de cluster do Service Fabric.

Nota

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

Para manter os nós do cluster distribuídos uniformemente entre os domínios de atualização e de falha e, por conseguinte, ativar a utilização dos mesmos, o nó criado mais recentemente deve ser removido primeiro. Por outras palavras, os nós devem ser removidos na ordem inversa da 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 abaixo devolvem 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 tem de saber que este nó vai ser removido. Tem de seguir três passos:

  1. Desative o nó para que deixe de ser uma replicação dos dados.
    PowerShell: Disable-ServiceFabricNode
    sfctl: sfctl node disable

  2. Pare o nó, para que o runtime do Service Fabric encerre corretamente e que a aplicação obtenha um pedido para terminar.
    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 de estes três passos serem aplicados ao nó, este pode ser removido do conjunto de dimensionamento. Se estiver a utilizar qualquer escalão de durabilidade além de bronze, estes passos serão efetuados quando a instância do conjunto de dimensionamento for removida.

O bloco de código seguinte obtém o último nó criado, desativa, interrompe 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 seguinte é utilizado para aceder ao 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

Gorjeta

Utilize as seguintes consultas sfctl para verificar o estado de cada passo

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

Verificar o estado de paragemsfctl 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 abaixo, a capacidade do conjunto de dimensionamento foi reduzida em 1.

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

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

Este 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 você pode observar no Service Fabric Explorer

Quando você dimensiona um cluster, o Service Fabric Explorer reflete o número de nós (instâncias de conjunto de escala de máquina virtual) que fazem parte do cluster. No entanto, ao dimensionar um cluster, você verá a instância de nó/VM removida exibida em um estado não íntegro, a menos que você chame Remove-ServiceFabricNodeState cmd com o nome de nó apropriado.

Aqui está 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 do Service Fabric (FM especificamente) sabem sobre o número de nós que o cluster tinha/tem. Quando você dimensiona a escala da máquina virtual definida, a VM foi excluída, mas o serviço do sistema FM ainda pensa que o nó (que foi mapeado para a VM que foi excluída) voltará. Portanto, o Service Fabric Explorer continua a exibir esse nó (embora o estado de integridade possa ser erro ou desconhecido).

Para garantir que um nó seja removido quando uma VM for removida, você tem duas opções:

  1. Escolha um nível de durabilidade Gold ou Silver para os tipos de nó em seu cluster, o que lhe dá a integração de infraestrutura. Quando você é dimensionado, os nós serão automaticamente removidos do nosso estado de serviços do sistema (FM). Consulte os detalhes sobre os níveis de durabilidade aqui

Nota

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

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

Nota

Os clusters do Service Fabric exigem que um determinado número de nós esteja ativo o tempo todo para manter a disponibilidade e preservar o estado - conhecido como "manutenção do quórum". Portanto, normalmente não é seguro desligar todas as máquinas no cluster, a menos que você tenha primeiro realizado um backup completo do seu estado.

Próximos passos

Leia o seguinte para saber mais sobre como planejar a capacidade do cluster, atualizar um cluster e particionar serviços: