Planejamento de capacidade e dimensionamento do Azure Service Fabric

Antes de criar qualquer cluster do Service Fabric ou dimensionar recursos de computação hospedando o cluster, é importante planejar a capacidade. Para obter mais informações sobre o planejamento de capacidade, confira Planejamento de capacidade do cluster do Service Fabric. Para obter mais diretrizes de práticas recomendadas para a escalabilidade do cluster, veja Considerações sobre escalabilidade do Service Fabric.

Além de considerar o tipo de nó e as características do cluster, você deve esperar que as operações de dimensionamento demorem mais de uma hora para serem concluídas em um ambiente de produção. Essa consideração é verdadeira independentemente do número de VMs que você está adicionando.

Dimensionamento automático

Você deve executar operações de dimensionamento por meio de modelos do Azure Resource Manager, por essa ser a melhor prática de tratar as configurações de recursos como código.

Usar o dimensionamento automático por meio de conjuntos de dimensionamento de máquinas virtuais fará com que o modelo com versão do Resource Manager defina incorretamente as contagens de instâncias para conjuntos de dimensionamento de máquinas virtuais. A definição imprecisa aumenta o risco de implantações futuras causarem operações de dimensionamento indesejadas. Em geral, você deve usar o dimensionamento automático se:

  • Implantar modelos do Resource Manager com capacidade apropriada declarada não dá suporte a seu caso de uso.

    Além do dimensionamento manual, é possível configurar um pipeline de integração e entrega contínuas no Azure DevOps Services usando projetos de implantação do grupo de recursos do Azure. Esse pipeline é geralmente disparado por um aplicativo lógico que usa métricas de desempenho de máquina virtual consultada na API REST do Azure Monitor. O pipeline é efetivamente dimensionado de forma eficiente com base em quaisquer métricas que você desejar, ao mesmo tempo em que otimiza os modelos do Resource Manager.

  • Você só precisará escalar horizontalmente um nó do conjunto de dimensionamento de máquinas virtuais por vez.

    Para escalar horizontalmente três ou mais nós de uma vez, você deve escalar horizontalmente um cluster do Service Fabric adicionando um conjunto de dimensionamento de máquinas virtuais. É mais seguro reduzir e escalar horizontalmente os conjuntos de dimensionamento de máquinas virtuais, um nó por vez.

  • Você tem confiabilidade Silver ou superior para o cluster do Service Fabric e durabilidade Silver ou superior em qualquer dimensionamento em que configure regras de dimensionamento automático.

    A capacidade mínima para regras de dimensionamento automático deve ser igual ou maior que cinco instâncias de máquina virtual. Ela também deve ser igual ou maior que o mínimo da camada de confiabilidade para o tipo de nó primário.

Observação

O serviço com estado do Service Fabric fabric:/System/InfastructureService/<NODE_TYPE_NAME> é executado em cada tipo de nó que tem durabilidade Silver ou mais alta. É o único serviço do sistema com suporte para ser executado no Azure em qualquer um dos tipos de nó de clusters.

Importante

O dimensionamento automático do Service Fabric dá suporte às configurações de dimensionamentoDefault e NewestVM do conjunto de dimensionamento de máquinas virtuais.

Considerações de dimensionamento vertical

O dimensionamento vertical de um tipo de nó do Service Fabric requer várias etapas e considerações. Por exemplo:

  • O cluster deve estar íntegro antes do dimensionamento. Caso contrário, você desestabilizará o cluster.
  • O nível de durabilidade Silver ou superior é necessário para todos os tipos de nó do cluster do Service Fabric que hospedam serviços com estado.

Observação

O tipo de nó primário que hospeda os serviços de sistema do Service Fabric com estado deve ter um nível de durabilidade Silver ou superior. Depois de habilitar a durabilidade Silver, as operações de cluster, como atualizar, adicionar ou remover nós e assim por diante, serão mais lentas porque o sistema otimiza para segurança de dados em vez de velocidade das operações.

O dimensionamento vertical de um conjunto de dimensionamento de máquinas virtuais simplesmente alterando sua SKU de recursos é uma operação destrutiva, pois ele recria as imagens dos hosts, removendo todos os estados persistentes localmente. Em vez disso, dimensione horizontalmente o cluster adicionando um novo conjunto de dimensionamento com a SKU desejada e migre os serviços para o novo conjunto de dimensionamento para concluir uma operação de dimensionamento vertical segura.

O cluster usa as restrições de propriedades e posicionamento do nó do Service Fabric para decidir em que local hospedar os serviços de aplicativos. Ao dimensionar verticalmente um tipo de nó primário, você implantará um segundo tipo de nó primário e, em seguida, definirá ("isPrimary": false) no tipo de nó primário original, continuará a desabilitar os nós dele e removerá seu conjunto de dimensionamento e seus recursos relacionados. Para saber detalhes, veja Dimensionar um tipo de nó primário do cluster do Service Fabric.

Observação

Sempre valide as operações em ambientes de teste antes de tentar as alterações no ambiente de produção. Por padrão, os serviços do sistema de cluster do Service Fabric têm uma restrição de posicionamento para direcionar apenas ao tipo de nó primário.

Com as propriedades de nó e as restrições de posicionamento declaradas, siga estas etapas uma instância de VM por vez. Isso permite que os serviços do sistema (e os serviços com estado) sejam desligados normalmente na instância de VM que você estiver removendo conforme novas réplicas são criadas em outro lugar.

  1. No PowerShell, execute Disable-ServiceFabricNode com a intenção RemoveNode para desabilitar o nó que você vai remover. Remova o tipo de nó que tem o número mais alto. Por exemplo, se você tiver um cluster de seis nós, remova a instância de máquina virtual “MyNodeType_5”.
  2. Execute Get-ServiceFabricNode para garantir que o nó tenha feito a transição para desabilitado. Caso contrário, aguarde até que o nó seja desabilitado. Isso pode levar algumas horas para cada nó. Não continue até que o nó tenha feito a transição para desabilitado.
  3. Diminua o número de VMs para uma naquele tipo de nó. A instância da VM mais alta agora será removida.
  4. Repita as etapas 1 a 3 conforme necessário, mas nunca reduza verticalmente o número de instâncias no tipo de nó primário para uma quantidade menor do que a camada de confiabilidade garante. Confira Planejamento de capacidade do cluster do Service Fabric para obter uma lista de instâncias recomendadas.
  5. Depois que todas as VMs estiverem ausentes (representadas como “Inativas”), o fabric:/System/InfrastructureService/[nome do nó] mostrará um estado de erro. Em seguida, será possível atualizar o recurso de cluster para remover o tipo de nó. É possível usar a implantação do modelo do ARM ou editar o recurso de cluster por meio do Azure Resource Manager. Isso iniciará uma atualização do cluster, o que removerá o serviço fabric:/System/InfrastructureService/[tipo do nó] que está em estado de erro.
  6. Depois disso, você pode, opcionalmente, excluir o VMScaleSet. No entanto, ainda verá os nós como “Inativos” no modo de exibição do Service Fabric Explorer. A última etapa seria limpá-los com o comando Remove-ServiceFabricNodeState.

Dimensionamento horizontal

Você pode fazer o dimensionamento horizontal de forma manual ou programática.

Observação

Se você estiver dimensionando um tipo de nó que tenha durabilidade Silver ou Gold, o dimensionamento será lento.

Expansão

Escale horizontalmente um cluster do Service Fabric aumentando a contagem de instâncias para um determinado conjunto de dimensionamento de máquinas virtuais. É possível escalar horizontalmente de modo programático usando o AzureClient e a ID do conjunto de dimensionamento desejado para aumentar a capacidade.

var scaleSet = AzureClient.VirtualMachineScaleSets.GetById(ScaleSetId);
var newCapacity = (int)Math.Min(MaximumNodeCount, scaleSet.Capacity + 1);
scaleSet.Update().WithCapacity(newCapacity).Apply(); 

Para escalar horizontalmente de forma manual, atualize a capacidade na propriedade SKU do recurso conjunto de dimensionamento de máquinas virtuais desejado.

"sku": {
    "name": "[parameters('vmNodeType0Size')]",
    "capacity": "[parameters('nt0InstanceCount')]",
    "tier": "Standard"
}

Redução horizontal

Reduzir exige mais consideração do que expandir. Por exemplo:

  • Os serviços do sistema do Service Fabric são executados no tipo de nó primário do cluster. Nunca desligue nem reduza verticalmente o número de instâncias desse tipo de nó para que você tenha menos instâncias do que aquilo que a camada de confiabilidade requer.
  • Para um serviço com estado, você precisa que um determinado número de nós estejam sempre ativos para manter a disponibilidade e preservar o estado do serviço. No mínimo, você precisa de um número de nós que seja igual à contagem de conjunto de réplicas de destino do serviço ou partição.

Para reduzir manualmente, siga estas etapas:

  1. No PowerShell, execute Disable-ServiceFabricNode com a intenção RemoveNode para desabilitar o nó que você vai remover. Remova o tipo de nó que tem o número mais alto. Por exemplo, se você tiver um cluster de seis nós, remova a instância de máquina virtual “MyNodeType_5”.
  2. Execute Get-ServiceFabricNode para garantir que o nó tenha feito a transição para desabilitado. Caso contrário, aguarde até que o nó seja desabilitado. Isso pode levar algumas horas para cada nó. Não continue até que o nó tenha feito a transição para desabilitado.
  3. Diminua o número de VMs para uma naquele tipo de nó. A instância da VM mais alta agora será removida.
  4. Repita as etapas 1 a 3 conforme necessário até provisionar a capacidade desejada. Não reduza horizontalmente o número de instâncias nos tipos de nó primários para menos do que aquilo que a camada de confiabilidade requer. Confira Planejamento de capacidade do cluster do Service Fabric para obter uma lista de instâncias recomendadas.

Para reduzir horizontalmente de forma manual, atualize a capacidade na propriedade SKU do recurso conjunto de dimensionamento de máquinas virtuais desejado.

"sku": {
    "name": "[parameters('vmNodeType0Size')]",
    "capacity": "[parameters('nt0InstanceCount')]",
    "tier": "Standard"
}

Você deve preparar o nó para desligamento para reduzir de modo programático. Localize o nó a ser removido (o nó de instância mais alta). Por exemplo:

using (var client = new FabricClient())
{
    var mostRecentLiveNode = (await client.QueryManager.GetNodeListAsync())
        .Where(n => n.NodeType.Equals(NodeTypeToScale, StringComparison.OrdinalIgnoreCase))
        .Where(n => n.NodeStatus == System.Fabric.Query.NodeStatus.Up)
        .OrderByDescending(n =>
        {
            var instanceIdIndex = n.NodeName.LastIndexOf("_");
            var instanceIdString = n.NodeName.Substring(instanceIdIndex + 1);
            return int.Parse(instanceIdString);
        })
        .FirstOrDefault();

Desative e remova o nó usando a mesma instância FabricClient (client, neste caso) e a instância de nó (instanceIdString, neste caso) que você usou no código anterior:

var scaleSet = AzureClient.VirtualMachineScaleSets.GetById(ScaleSetId);

// Remove the node from the Service Fabric cluster
ServiceEventSource.Current.ServiceMessage(Context, $"Disabling node {mostRecentLiveNode.NodeName}");
await client.ClusterManager.DeactivateNodeAsync(mostRecentLiveNode.NodeName, NodeDeactivationIntent.RemoveNode);

// Wait (up to a timeout) for the node to gracefully shut down
var timeout = TimeSpan.FromMinutes(5);
var waitStart = DateTime.Now;
while ((mostRecentLiveNode.NodeStatus == System.Fabric.Query.NodeStatus.Up || mostRecentLiveNode.NodeStatus == System.Fabric.Query.NodeStatus.Disabling) &&
        DateTime.Now - waitStart < timeout)
{
    mostRecentLiveNode = (await client.QueryManager.GetNodeListAsync()).FirstOrDefault(n => n.NodeName == mostRecentLiveNode.NodeName);
    await Task.Delay(10 * 1000);
}

// Decrement virtual machine scale set capacity
var newCapacity = (int)Math.Max(MinimumNodeCount, scaleSet.Capacity - 1); // Check min count 

scaleSet.Update().WithCapacity(newCapacity).Apply();

Observação

Ao dimensionar em um cluster, você verá a instância do nó/VM removida exibida em um estado não íntegro no Service Fabric Explorer. Para obter uma explicação desse comportamento, veja Comportamentos que podem ser observados no Service Fabric Explorer. Você pode:

Níveis de confiabilidade

O nível de confiabilidade é uma propriedade do recurso de cluster do Service Fabric. Ele não pode ser configurado de modo diferente para tipos de nó individuais. Ele controla o fator de replicação dos serviços do sistema para o cluster e é uma configuração no nível do recurso de cluster.

O nível de confiabilidade determinará o número mínimo de nós que o tipo de nó primário deve ter. A camada de confiabilidade pode ter os valores a seguir:

  • Platinum: executa serviços do sistema com uma contagem de conjunto de réplicas de destino de sete e nove nós de semente.
  • Gold: executa serviços do sistema com uma contagem de conjunto de réplicas de destino de sete e sete nós de semente.
  • Silver: executa serviços do sistema com uma contagem de conjunto de réplicas de destino de cinco e cinco nós de semente.
  • Bronze: executa serviços do sistema com uma contagem de conjunto de réplicas de destino de três e três nós de semente.

O nível mínimo recomendado de confiabilidade é Prata.

O nível de confiabilidade é definido na seção de propriedades do recurso Microsoft.ServiceFabric/clusters, semelhante a isto:

"properties":{
    "reliabilityLevel": "Silver"
}

Níveis de durabilidade

Aviso

Tipos de nó executados com durabilidade Bronze não têm nenhum privilégio. Os trabalhos de infraestrutura que afetam as cargas de trabalho sem estado não serão interrompidos ou atrasados, o que pode afetar as cargas de trabalho.

Use a durabilidade Bronze somente para tipos de nós que executam cargas de trabalho sem estado. Para cargas de trabalho de produção, execute Silver ou superior para garantir a consistência do estado. Escolha a confiabilidade correta com base nas diretrizes na documentação de planejamento de capacidade.

O nível de durabilidade deve ser definido em dois recursos. Um é o perfil da extensão do recurso do conjunto de dimensionamento de máquinas virtuais:

"extensionProfile": {
    "extensions":          {
        "name": "[concat('ServiceFabricNodeVmExt','_vmNodeType0Name')]",
        "properties": {
            "settings": {
                "durabilityLevel": "Bronze"
            }
        }
    }
}

E o outro recurso está em nodeTypes, no recurso Microsoft.ServiceFabric/clusters:

"nodeTypes": [
    {
        "name": "[variables('vmNodeType0Name')]",
        "durabilityLevel": "Bronze"
    }
]

Próximas etapas