Planeamento de capacidade e dimensionamento no Azure Service Fabric

Antes de criar qualquer cluster do Azure Service Fabric ou dimensionar recursos de computação que alojam o cluster, é importante planear a capacidade. Para obter mais informações sobre o planeamento da capacidade, veja Planear a capacidade do cluster do Service Fabric. Para obter mais orientações sobre as melhores práticas para a escalabilidade do cluster, veja Considerações de escalabilidade do Service Fabric.

Para além de considerar o tipo de nó e as características do cluster, deve esperar que as operações de dimensionamento decorram mais de uma hora para concluir para um ambiente de produção. Esta consideração é verdadeira independentemente do número de VMs que está a adicionar.

Dimensionamento automático

Deve realizar operações de dimensionamento através do Azure Resource Manager modelos, uma vez que é a melhor prática tratar as configurações de recursos como código.

A utilização do dimensionamento automático através de conjuntos de dimensionamento de máquinas virtuais fará com que o modelo de Resource Manager versão defina incorretamente as contagens de instâncias para conjuntos de dimensionamento de máquinas virtuais. A definição imprecisa aumenta o risco de futuras implementações causarem operações de dimensionamento não intencionais. Em geral, deve utilizar o dimensionamento automático se:

  • Implementar os modelos de Resource Manager com a capacidade adequada declarada não suporta o seu caso de utilização.

    Além do dimensionamento manual, pode configurar um pipeline de integração e entrega contínua nos Serviços de DevOps do Azure com projetos de implementação de grupos de recursos do Azure. Este pipeline é normalmente acionado por uma aplicação lógica que utiliza métricas de desempenho de máquinas virtuais consultadas a partir da API REST do Azure Monitor. O pipeline dimensiona automaticamente de forma eficaz com base nas métricas pretendidas, ao mesmo tempo que otimiza para modelos de Resource Manager.

  • Só tem de dimensionar horizontalmente um nó de conjunto de dimensionamento de máquinas virtuais de cada vez.

    Para aumentar horizontalmente em três ou mais nós de cada vez, deve aumentar horizontalmente um cluster do Service Fabric ao adicionar um conjunto de dimensionamento de máquinas virtuais. É mais seguro dimensionar e aumentar horizontalmente os conjuntos de dimensionamento de máquinas virtuais, um nó de cada vez.

  • Tem fiabilidade silver ou superior para o cluster do Service Fabric e Durabilidade silver ou superior em qualquer escala em que configure regras de dimensionamento automático.

    A capacidade mínima para regras de dimensionamento automático tem de ser igual ou superior a cinco instâncias de máquina virtual. Também tem de ser igual ou superior ao mínimo da Camada de Fiabilidade para o tipo de nó primário.

Nota

Os recursos de infraestrutura de serviço com estado do Service Fabric:/System/InfastructureService/<NODE_TYPE_NAME> são executados em todos os tipos de nós com silver ou maior durabilidade. É o único serviço de sistema que é suportado para ser executado no Azure em qualquer um dos tipos de nó de clusters.

Importante

O dimensionamento automático do Service Fabric suporta Default e NewestVMconfigurações de dimensionamento de conjuntos de dimensionamento de máquinas virtuais.

Considerações de dimensionamento vertical

O dimensionamento vertical de um tipo de nó no Azure Service Fabric requer vários passos e considerações. Por exemplo:

  • O cluster tem de estar em bom estado de funcionamento antes do dimensionamento. Caso contrário, irá desestabilizar ainda mais o cluster.
  • O nível de durabilidade silver ou superior é necessário para todos os tipos de nó de cluster do Service Fabric que alojam serviços com estado.

Nota

O seu tipo de nó principal que aloja serviços de sistema do Service Fabric com estado tem de ser o nível de durabilidade silver ou superior. Depois de ativar a durabilidade do Silver, as operações de cluster, como atualizações, a adição ou remoção de nós, etc., serão mais lentas porque o sistema otimiza a segurança dos dados em vez da velocidade das operações.

O dimensionamento vertical de um conjunto de dimensionamento de máquinas virtuais ao alterar simplesmente o SKU do recurso é uma operação destrutiva, uma vez que reencaminha os anfitriões, removendo assim todo o estado localmente persistente. Em vez disso, vai querer dimensionar horizontalmente o cluster ao adicionar um novo conjunto de dimensionamento com o SKU pretendido e, em seguida, migrar os seus serviços para o novo conjunto de dimensionamento para concluir uma operação de dimensionamento vertical segura.

O cluster utiliza propriedades de nó do Service Fabric e restrições de colocação para decidir onde alojar os serviços da sua aplicação. Ao dimensionar verticalmente um tipo de nó primário, irá implementar um segundo tipo de nó primário e, em seguida, definir ("isPrimary": false) no tipo de nó primário original e continuar a desativar os respetivos nós e remover o conjunto de dimensionamento e os respetivos recursos relacionados. Para obter detalhes, veja Aumentar verticalmente um tipo de nó primário do cluster do Service Fabric.

Nota

Valide sempre as operações em ambientes de teste antes de tentar alterar o ambiente de produção. Por predefinição, os serviços do sistema de clusters do Service Fabric têm uma restrição de colocação apenas para o tipo de nó primário de destino.

Com as propriedades do nó e as restrições de colocação declaradas, siga os seguintes passos uma instância de VM de cada vez. Isto permite que os serviços de sistema (e os seus serviços com monitorização de estado) sejam encerrados corretamente na instância da VM que está a remover à medida que são criadas novas réplicas noutro local.

  1. No PowerShell, execute Disable-ServiceFabricNode com a intenção RemoveNode de desativar o nó que vai remover. Remova o tipo de nó que tem o número mais alto. Por exemplo, se tiver um cluster de seis nós, remova a instância da máquina virtual "MyNodeType_5".
  2. Execute Get-ServiceFabricNode para se certificar de que o nó fez a transição para desativado. Caso contrário, aguarde até que o nó esteja desativado. Pode demorar algumas horas para cada nó. Não prossiga até que o nó tenha transitado para desativado.
  3. Diminua o número de VMs por uma nesse tipo de nó. A instância de VM mais alta será agora removida.
  4. Repita os passos 1 a 3 conforme necessário, mas nunca dimensione o número de instâncias nos tipos de nó primários inferiores ao que o escalão de fiabilidade garante. Veja Planear a capacidade do cluster do Service Fabric para obter uma lista de instâncias recomendadas.
  5. Assim que todas as VMs desaparecerem (representadas como "Para Baixo") os recursos de infraestrutura:/System/InfrastructureService/[nome do nó] mostrarão um estado de erro. Em seguida, pode atualizar o recurso do cluster para remover o tipo de nó. Pode utilizar a implementação do modelo arm ou editar o recurso de cluster através do gestor de recursos do Azure. Esta ação iniciará uma atualização do cluster que removerá o serviço fabric:/System/InfrastructureService/[node type] que está no estado de erro.
  6. Depois disso, opcionalmente, pode eliminar o VMScaleSet, mas continuará a ver os nós como "Baixo" da vista Service Fabric Explorer. O último passo seria limpá-los com Remove-ServiceFabricNodeState o comando .

Dimensionamento horizontal

Pode efetuar o dimensionamento horizontal manualmente ou programaticamente.

Nota

Se estiver a dimensionar um tipo de nó com durabilidade Silver ou Gold, o dimensionamento será lento.

Aumentar horizontalmente

Aumente horizontalmente um cluster do Service Fabric ao aumentar a contagem de instâncias para um determinado conjunto de dimensionamento de máquinas virtuais. Pode aumentar horizontalmente através de programação através da utilização AzureClient e do ID do conjunto de dimensionamento pretendido 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 aumentar horizontalmente manualmente, atualize a capacidade na propriedade SKU do recurso do conjunto de dimensionamento de máquinas virtuais pretendido.

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

Dimensionamento no

O dimensionamento requer mais consideração do que aumentar horizontalmente. Por exemplo:

  • Os serviços de sistema do Service Fabric são executados no tipo de nó principal no cluster. Nunca encerre ou dimensione o número de instâncias desse tipo de nó para que tenha menos instâncias do que o que o escalão de fiabilidade garante.
  • Para um serviço com estado, precisa de um determinado número de nós que estejam sempre à altura para manter a disponibilidade e preservar o estado do seu serviço. No mínimo, precisa de um número de nós iguais à contagem de conjuntos de réplicas de destino da partição ou serviço.

Para dimensionar manualmente, siga estes passos:

  1. No PowerShell, execute Disable-ServiceFabricNode com a intenção RemoveNode de desativar o nó que vai remover. Remova o tipo de nó que tem o número mais alto. Por exemplo, se tiver um cluster de seis nós, remova a instância da máquina virtual "MyNodeType_5".
  2. Execute Get-ServiceFabricNode para se certificar de que o nó fez a transição para desativado. Caso contrário, aguarde até que o nó esteja desativado. Pode demorar algumas horas para cada nó. Não prossiga até que o nó tenha transitado para desativado.
  3. Diminua o número de VMs por uma nesse tipo de nó. A instância de VM mais alta será agora removida.
  4. Repita os passos 1 a 3 conforme necessário até aprovisionar a capacidade pretendida. Não dimensione o número de instâncias nos tipos de nó primário para menos do que o que o escalão de fiabilidade garante. Veja Planear a capacidade do cluster do Service Fabric para obter uma lista de instâncias recomendadas.

Para dimensionar manualmente, atualize a capacidade na propriedade SKU do recurso do conjunto de dimensionamento de máquinas virtuais pretendido.

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

Tem de preparar o nó para que o encerramento seja dimensionado programaticamente. Localize o nó a remover (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ó utilizando a mesma FabricClient instância (client neste caso) e a instância do nó (instanceIdString neste caso) que utilizou 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();

Nota

Quando dimensiona num cluster, verá a instância de nó/VM removida apresentada num estado de mau estado de funcionamento no Service Fabric Explorer. Para obter uma explicação deste comportamento, veja Comportamentos que pode observar no Service Fabric Explorer. Pode:

Níveis de fiabilidade

O nível de fiabilidade é uma propriedade do recurso de cluster do Service Fabric. Não pode ser configurado de forma diferente para tipos de nós individuais. Controla o fator de replicação dos serviços de sistema do cluster e é uma definição ao nível do recurso do cluster.

O nível de fiabilidade determinará o número mínimo de nós que o tipo de nó principal tem de ter. O escalão de fiabilidade pode utilizar os seguintes valores:

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

O nível mínimo de fiabilidade recomendado é Silver.

O nível de fiabilidade é definido na secção de propriedades do recurso Microsoft.ServiceFabric/clusters, da seguinte forma:

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

Níveis de durabilidade

Aviso

Os tipos de nós em execução com durabilidade bronze não obtêm privilégios. As tarefas de infraestrutura que afetam as cargas de trabalho sem estado não serão paradas nem atrasadas, o que poderá afetar as cargas de trabalho.

Utilize a durabilidade bronze apenas 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 fiabilidade certa com base na documentação de orientação do planeamento de capacidade.

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

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

O outro recurso encontra-se nodeTypes no recurso Microsoft.ServiceFabric/clusters:

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

Passos seguintes