Reduzir ou aumentar horizontalmente um cluster

Aviso

Ler esta secção antes de dimensionar

O dimensionamento dos recursos de computação para obter a carga de trabalho da aplicação requer planeamento intencional, demorará quase sempre mais de uma hora a concluir para um ambiente de produção e exige que compreenda a carga de trabalho e o contexto empresarial; Na verdade, se nunca tiver feito esta atividade, recomenda-se que comece por ler e compreender as considerações de planeamento da capacidade do cluster do Service Fabric antes de continuar o resto deste documento. Esta recomendação é para evitar problemas inesperados do LiveSite e também é recomendado que teste com êxito as operações que decide realizar num ambiente de não produção. Em qualquer altura, pode comunicar problemas de produção ou pedir suporte pago para o Azure. Para que os engenheiros alocados efetuem estas operações que possuam o contexto adequado, este artigo descreve as operações de dimensionamento, mas tem de decidir e compreender que operações são adequadas para o seu caso de utilização; como os recursos a dimensionar (CPU, Armazenamento, Memória), que direção deve dimensionar (Vertical ou Horizontalmente) e que operações executar (implementação do Modelo de Recurso, Portal, PowerShell/CLI).

Nota

Recomendamos que utilize o módulo Azure Az PowerShell para interagir com o Azure. Veja Instalar o Azure PowerShell para começar. 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 com 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 pode utilizar para implementar e gerir uma coleção de máquinas virtuais como um conjunto. Cada tipo de nó definido num cluster do Service Fabric é configurado como um conjunto de dimensionamento de máquinas virtuais separado. Em seguida, cada tipo de nó pode ser aumentado ou reduzido horizontalmente de forma independente, ter diferentes conjuntos de portas abertos e pode ter métricas de capacidade diferentes. Leia mais sobre o mesmo no documento Tipos de nó do Service Fabric . Uma vez que os tipos de nó do Service Fabric no cluster são compostos por conjuntos de dimensionamento de máquinas virtuais no back-end, tem de configurar regras de dimensionamento automático para cada tipo de nó/conjunto de dimensionamento de máquinas virtuais.

Nota

A sua subscrição tem de ter núcleos suficientes para adicionar as novas VMs que compõem este cluster. Não existe nenhuma validação de modelo atualmente, pelo que obtém uma falha no tempo de implementação, se algum dos limites de quota for atingido.

Nota

Se estiver a utilizar a imagem do SO Windows com a função Hyper-V ativada, 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 controlador de memória dinâmica dentro da VM estará num estado parado.

Escolher o tipo de nó/Conjunto de dimensionamento de Máquinas Virtuais a dimensionar

Atualmente, não é possível especificar as regras de dimensionamento automático para conjuntos de dimensionamento de máquinas virtuais através do portal para criar um Cluster do Service Fabric, por isso, vamos utilizar Azure PowerShell (1.0+) para listar os tipos de nós e, em seguida, adicionar regras de dimensionamento automático aos mesmos.

Para obter a lista de conjuntos de dimensionamento de máquinas virtuais 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 dimensionamento de máquinas virtuais

Se o cluster tiver vários tipos de nós, repita-o para cada tipo de nó/conjuntos de dimensionamento de máquinas virtuais que pretende 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

Dimensionar no tipo de nó primário para menos do que o número mínimo tornará o cluster instável ou até mesmo derrubá-lo. Isto pode resultar na perda de dados para as suas aplicações e para os serviços do sistema.

Atualmente, a funcionalidade de dimensionamento automático não é condicionada pelas cargas que as suas aplicações podem estar a reportar ao Service Fabric. Por isso, neste momento, o dimensionamento automático que obtém é apenas impulsionado pelos contadores de desempenho 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.

Nota

Num cenário de redução horizontal, a menos que o tipo de nó tenha um nível de durabilidade de Gold ou Silver, tem de chamar o cmdlet Remove-ServiceFabricNodeState com o nome de nó adequado. Para a durabilidade bronze, não é recomendado dimensionar em mais do que um nó de cada vez.

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

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

A adição de VMs demora algum tempo, pelo que não espere que as adições sejam instantâneas. Planeie adicionar a capacidade com muita antecedência, permitindo que mais de 10 minutos antes de a capacidade da VM estar disponível para as réplicas/instâncias de serviço serem colocadas.

Adicionar VMs com 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 com comandos do PowerShell ou da 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 dimensionamento de máquinas virtuais

Quando dimensiona um tipo de nó, remove as instâncias de VM do conjunto de dimensionamento. Se o tipo de nó for Nível de durabilidade Bronze, o Service Fabric não sabe o que aconteceu e comunica que um nó desapareceu. O Service Fabric comunica então o mau estado de funcionamento do cluster. Para evitar esse estado incorreto, tem de remover explicitamente o nó do cluster e remover o estado do nó.

Os serviços do sistema do service fabric 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 que o escalão de fiabilidade garante.

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

Remover o nó do Service Fabric

Os passos para remover manualmente o estado do nó aplicam-se apenas a tipos de nós com uma camada de durabilidade Bronze . Para o escalão de durabilidade Silver e Gold , estes passos são realizados 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áquinas virtuais que tenha o nível de durabilidade de Ouro ou Prata ativado. O cluster irá introduzir o estado de erro se reduzir horizontalmente abaixo deste limiar e terá de 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

Dica

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

Quando aumenta horizontalmente um cluster, o Service Fabric Explorer refletirá o número de nós (instâncias do conjunto de dimensionamento de máquinas virtuais) que fazem parte do cluster. No entanto, quando dimensiona um cluster no, verá a instância do nó/VM removida apresentada num estado de mau estado de funcionamento, a menos que chame o cmd Remove-ServiceFabricNodeState com o nome de nó adequado.

Eis a explicação para este comportamento.

Os nós listados no Service Fabric Explorer são um reflexo do que os serviços de sistema do Service Fabric (FM especificamente) sabem sobre o número de nós que o cluster tinha/tem. Quando dimensiona o conjunto de dimensionamento de máquinas virtuais, a VM foi eliminada, mas o serviço de sistema FM ainda pensa que o nó (que foi mapeado para a VM que foi eliminada) voltará. Assim, Service Fabric Explorer continua a apresentar esse nó (embora o estado de funcionamento possa ser um erro ou desconhecido).

Para se certificar de que um nó é removido quando uma VM é removida, tem duas opções:

  1. Escolha um nível de durabilidade de Gold ou Silver para os tipos de nós no cluster, o que lhe dá a integração da infraestrutura. Quando reduzir horizontalmente, os nós serão automaticamente removidos do estado dos nossos serviços de sistema (FM). Veja 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áquinas virtuais que tenha o nível de durabilidade de Ouro ou Prata ativado. O cluster irá introduzir o estado de erro se reduzir horizontalmente abaixo deste limiar e terá de limpar manualmente os nós removidos.

  1. Assim que a instância da VM tiver sido reduzida horizontalmente, tem de chamar o cmdlet Remove-ServiceFabricNodeState.

Nota

Os clusters do Service Fabric exigem que um determinado número de nós esteja sempre ativo para manter a disponibilidade e preservar o estado , referido como "manter o quórum". Por isso, normalmente, não é seguro encerrar todas as máquinas no cluster, a menos que tenha efetuado primeiro uma cópia de segurança completa do seu estado.

Passos seguintes

Leia o seguinte para saber mais sobre o planeamento da capacidade do cluster, a atualização de um cluster e os serviços de criação de partições: