Partilhar via


Dimensionamento automático

O dimensionamento automático é o processo de alocar dinamicamente recursos para satisfazer requisitos de desempenho. À medida que o volume de trabalho cresce, as aplicações podem precisar de mais recursos para manter os níveis de desempenho pretendidos e satisfazer os contratos de nível de serviço (SLAs). À medida que a demanda diminui e os recursos extras não são mais necessários, eles podem ser desalocados para minimizar os custos.

O dimensionamento automático tira partido da elasticidade dos ambientes alojados na cloud e alivia a gestão administrativa. Reduz a necessidade de um operador monitorizar continuamente o desempenho de um sistema e tomar decisões quanto a adicionar ou remover recursos.

As aplicações podem ser dimensionadas de duas formas principais:

  • O dimensionamento vertical, também chamado de escalonamento para cima e para baixo, significa alterar a capacidade de um recurso. Por exemplo, você pode mover um aplicativo para um tamanho de máquina virtual maior. O dimensionamento vertical geralmente requer tornar o sistema temporariamente indisponível enquanto está sendo reimplantado. Portanto, é menos comum automatizar o dimensionamento vertical.

  • O dimensionamento horizontal, também chamado de dimensionamento para fora e para dentro, significa adicionar ou remover instâncias de um recurso. A aplicação continua a ser executada sem interrupção enquanto os recursos novos são aprovisionados. Quando o processo de provisionamento é concluído, a solução é implantada nesses recursos extras. Se a demanda cair, os recursos extras podem ser desligados de forma limpa e deslocalizados.

Muitos sistemas baseados na nuvem, incluindo o Microsoft Azure, oferecem suporte ao dimensionamento horizontal automático. O restante deste artigo se concentra no dimensionamento horizontal.

Observação

O dimensionamento automático aplica-se principalmente a recursos de computação. Embora seja possível dimensionar horizontalmente um banco de dados ou uma fila de mensagens, esse processo geralmente envolve o particionamento de dados, que geralmente não é automatizado.

Componentes de dimensionamento automático

Uma estratégia de dimensionamento automático normalmente envolve os seguintes componentes:

  • Sistemas de instrumentação e monitoramento nos níveis de aplicação, serviço e infraestrutura. Esses sistemas capturam métricas-chave, como tempos de resposta, comprimentos de fila, utilização da CPU e uso de memória.

  • A lógica de tomada de decisão avalia essas métricas de uso ao vivo em relação a limites ou cronogramas predefinidos e decide se deve ser dimensionada.

  • Componentes e mecanismos executam a ação de dimensionamento. Idealmente, esses componentes e mecanismos devem ser dissociados do próprio código de carga de trabalho e gerenciados como um processo externo. O código que está ocioso ou sobrecarregado não deve, por si só, ser responsável pelo dimensionamento.

  • Recursos de teste, monitoramento e ajuste para a estratégia de dimensionamento automático para garantir que ela funcione conforme o esperado.

O Azure fornece mecanismos internos de dimensionamento automático que abordam cenários comuns. Se um determinado serviço ou tecnologia não tiver funcionalidade de dimensionamento automático integrada ou se você tiver requisitos específicos de dimensionamento automático além de seus recursos, considere uma implementação personalizada. Uma implementação personalizada coleta métricas operacionais e do sistema, analisa as métricas e dimensiona os recursos de acordo.

Configurar o dimensionamento automático para uma solução do Azure

O Azure fornece dimensionamento automático interno para a maioria das opções de computação.

Todas essas opções de computação usam o recurso de dimensionamento automático do Azure Monitor para fornecer um conjunto comum de funcionalidade de dimensionamento automático.

  • O Azure Functions difere das opções de computação anteriores porque você não precisa configurar nenhuma regra de dimensionamento automático. Em vez disso, o Azure Functions aloca automaticamente o poder de computação quando seu código é executado. O Azure Functions é dimensionado conforme necessário para lidar com a carga. Para obter mais informações, consulte Escolher o plano de hospedagem correto para o Azure Functions.

Uma solução de dimensionamento automático personalizada às vezes pode ser útil. Por exemplo, você pode usar o Diagnóstico do Azure e métricas baseadas em aplicativos, juntamente com código personalizado para monitorar e exportar as métricas do aplicativo. Em seguida, você pode definir regras personalizadas com base nessas métricas e usar as APIs REST do Azure Resource Manager para acionar o dimensionamento automático. No entanto, uma solução personalizada não é simples de implementar e deve ser considerada apenas se nenhuma das abordagens anteriores puder atender aos seus requisitos.

Use os recursos de dimensionamento automático integrados da plataforma se eles atenderem às suas necessidades. Caso contrário, considere cuidadosamente se você precisa de recursos de dimensionamento mais complexos. Exemplos de outros requisitos podem incluir mais granularidade de controle, diferentes maneiras de detetar eventos de gatilho para dimensionamento, dimensionamento entre assinaturas e dimensionamento de outros tipos de recursos.

Usar o recurso de dimensionamento automático do Azure Monitor

A funcionalidade de dimensionamento automático do Azure Monitor fornece um conjunto comum de funcionalidades de dimensionamento automático para conjuntos de escalas de máquinas virtuais, Serviço de Aplicativos e Serviços de Nuvem do Azure. O dimensionamento pode ser executado em um cronograma ou com base em uma métrica de tempo de execução, como uso de CPU ou memória.

Considere os seguintes exemplos:

  • Dimensione para 10 instâncias nos dias úteis e aumente para quatro instâncias no sábado e no domingo.

  • Expanda por uma instância se o uso médio da CPU estiver acima de 70%, e reduza por uma instância se o uso da CPU cair abaixo de 50%.

  • Dimensione por uma instância se o número de mensagens em uma fila exceder um determinado limite.

Aumente a escala do recurso quando a carga aumentar para garantir a disponibilidade. Em momentos de baixo uso, reduza a escala para que você possa otimizar os custos. Use sempre uma combinação de regras de escalonamento horizontal e redução. Caso contrário, o dimensionamento automático ocorrerá apenas em uma direção até atingir o limite (contagens máximas ou mínimas de instâncias) definido no perfil.

Selecione uma contagem de instâncias padrão que seja segura para sua carga de trabalho. O recurso será dimensionado com base nesse valor se as contagens máximas ou mínimas de instâncias não estiverem definidas.

Para obter uma lista de métricas internas, consulte Azure Monitor autoscaling common metrics. Você também pode implementar métricas personalizadas usando o Application Insights.

Você pode configurar o dimensionamento automático usando o PowerShell, a CLI do Azure, um modelo do Azure Resource Manager ou o portal do Azure. Para obter um controle mais detalhado, use a API REST do Gerenciador de Recursos. A Biblioteca de Gerenciamento de Monitoramento do Azure e a Biblioteca do Microsoft Insights (em visualização) são SDKs que permitem coletar métricas de diferentes recursos e executar o dimensionamento automático usando as APIs REST. Para recursos em que o suporte do Gerenciador de Recursos não está disponível, ou se você usar os Serviços de Nuvem do Azure, a API REST de Gerenciamento de Serviços pode ser usada para dimensionamento automático. Em todos os outros casos, use o Gerenciador de Recursos.

Considere os seguintes pontos ao usar o dimensionamento automático:

  • Considere se você pode prever a carga no aplicativo com precisão suficiente para usar o dimensionamento automático agendado, adicionando e removendo instâncias para atender aos picos de demanda previstos. Se não for possível, use o dimensionamento automático reativo com base em métricas de tempo de execução para lidar com alterações imprevisíveis na demanda. Normalmente, você pode combinar essas abordagens.

    Por exemplo, crie uma estratégia que adicione recursos com base em uma programação dos horários em que você sabe que o aplicativo está mais ocupado. Recursos extras ajudam a garantir que a capacidade esteja disponível quando necessário, sem qualquer atraso no início de novas instâncias. Para cada regra agendada, defina métricas que permitam o dimensionamento automático reativo durante esse período para garantir que o aplicativo possa lidar com picos de demanda sustentados, mas imprevisíveis.

  • Muitas vezes, é difícil entender a relação entre métricas e requisitos de capacidade, especialmente quando um aplicativo é implantado inicialmente. Configure um pouco de capacidade extra no início e, em seguida, monitore e ajuste as regras de dimensionamento automático para aproximar a capacidade da carga real.

  • Configure as regras de dimensionamento automático e, em seguida, monitore o desempenho do seu aplicativo ao longo do tempo. Utilize os resultados desta monitorização para ajustar a forma como o sistema é dimensionado, se necessário. No entanto, tenha em mente que o dimensionamento automático não é um processo instantâneo. Leva tempo para reagir a uma métrica, como a utilização média da CPU excedendo ou ficando abaixo de um limite especificado.

  • As regras de dimensionamento automático que usam um mecanismo de deteção baseado em um atributo de gatilho medido usam um valor agregado ao longo do tempo, em vez de valores instantâneos, para disparar uma ação de dimensionamento automático. Os atributos de gatilho incluem o uso da CPU ou o comprimento da fila. Por padrão, o agregado é uma média dos valores. Essa abordagem evita que o sistema reaja muito rapidamente ou cause oscilação rápida. Também permite tempo para que novas instâncias iniciadas automaticamente entrem em modo de execução. Outras ações de dimensionamento automático não podem ocorrer enquanto as novas instâncias estão sendo iniciadas. Para os Serviços de Nuvem do Azure e as Máquinas Virtuais do Azure, o período padrão para a agregação é de 45 minutos. Portanto, pode levar até esse período de tempo para que a métrica acione o dimensionamento automático em resposta a picos de demanda. Você pode alterar o período de agregação usando o SDK, mas períodos inferiores a 25 minutos podem causar resultados imprevisíveis. Para a funcionalidade Web Apps do App Service, o período de média é mais curto, permitindo que novas instâncias estejam disponíveis em cerca de cinco minutos após uma alteração na medida média de gatilho.

  • Evite oscilação onde as ações de aumento e redução de escala ocorrem repetidamente. Suponhamos que existam duas instâncias. O limite superior é de 80% CPU e o limite inferior é de 60%. Quando a carga está em 85%, outra instância é adicionada. Após algum tempo, a carga diminui para 60%. Antes que o serviço de dimensionamento automático seja dimensionado, ele calcula a distribuição da carga total (de três instâncias) quando uma instância é removida, levando-a a 90%. Teria de voltar a expandir-se imediatamente. Assim, ele ignora o dimensionamento e você pode nunca ver os resultados de dimensionamento esperados.

    A situação de flapping pode ser controlada através da escolha de uma margem adequada entre os limiares de expansão e de redução.

  • O redimensionamento manual é redefinido com base no número máximo e mínimo de instâncias usadas para escalonamento automático. Se você atualizar manualmente a contagem de instâncias para um valor maior ou menor do que o valor máximo, o mecanismo de dimensionamento automático será automaticamente reduzido para o mínimo (se menor) ou máximo (se maior). Por exemplo, você define o intervalo entre três e seis. Se você tiver uma instância em execução, o mecanismo de dimensionamento automático será dimensionado para três instâncias em sua próxima execução. Da mesma forma, se você definir manualmente a escala para oito instâncias, na próxima execução a escala automática a dimensionará de volta para seis instâncias em sua próxima execução. O dimensionamento manual é temporário, a menos que você redefina as regras de dimensionamento automático também.

  • O motor de escala automática processa apenas um perfil de cada vez. Se uma condição não for atendida, verifica o próximo perfil. Mantenha as principais métricas fora do perfil padrão porque esse perfil é verificado por último. Dentro de um perfil, você pode ter várias regras. Na expansão, o dimensionamento automático é executado se alguma regra for atendida. No scale-in, o dimensionamento automático exige que todas as regras sejam cumpridas.

    Para obter mais informações sobre como o Azure Monitor é dimensionado, consulte Práticas recomendadas para dimensionamento automático.

  • Se você configurar o dimensionamento automático usando o SDK em vez do portal, poderá especificar um cronograma mais detalhado durante o qual as regras estarão ativas. Você também pode criar suas próprias métricas e usá-las com ou sem nenhuma das existentes em suas regras de dimensionamento automático. Por exemplo, você pode querer usar contadores alternativos, como o número de solicitações por segundo ou a disponibilidade média de memória. Ou você pode usar contadores personalizados para medir processos de negócios específicos.

  • Quando você dimensiona automaticamente o Service Fabric, os tipos de nó em seu cluster são feitos de conjuntos de dimensionamento de máquina virtual no back-end, portanto, você precisa configurar regras de dimensionamento automático para cada tipo de nó. Leve em consideração o número de nós que você deve ter antes de configurar o dimensionamento automático. Seu nível de confiabilidade determina o número mínimo de nós que você deve ter para o tipo de nó primário. Para obter mais informações, consulte Dimensionar um cluster do Service Fabric para dentro ou para fora usando regras de dimensionamento automático.

  • Você pode usar o portal para vincular recursos como instâncias do Banco de Dados SQL do Azure e filas a uma instância de serviço de nuvem. Esse método permite que você acesse mais facilmente as opções de configuração de dimensionamento manual e automático separadas para cada um dos recursos vinculados. Para obter mais informações, consulte Gerenciar os Serviços de Nuvem do Azure.

  • Quando você configura várias políticas e regras, elas podem entrar em conflito entre si. O dimensionamento automático utiliza as seguintes regras de resolução de conflitos para assegurar que haja sempre um número suficiente de instâncias em execução:

    • As operações de escala para fora sempre têm precedência sobre as operações de escala para dentro.

    • Quando as operações de expansão entram em conflito, a regra que inicia o maior aumento no número de instâncias tem precedência.

    • Quando as operações de dimensionamento entram em conflito, a regra que inicia a mais pequena diminuição no número de instâncias tem precedência.

  • Em um Ambiente de Serviço de Aplicações, qualquer pool de trabalho ou métricas de front-end podem ser usadas para definir regras de dimensionamento automático. Para obter mais informações, consulte Visão geral do Ambiente do Serviço de Aplicativo.

Considerações sobre o design do aplicativo

O dimensionamento automático não é uma solução instantânea. Simplesmente adicionar recursos a um sistema ou executar mais instâncias de um processo não garante que o desempenho do sistema melhore. Considere os seguintes pontos ao projetar uma estratégia de dimensionamento automático:

  • O sistema deve ser concebido de modo a ser escalável horizontalmente. Evite fazer suposições sobre afinidade de instância. Não projete soluções que exijam que o código esteja sempre em execução em uma instância específica de um processo. Ao dimensionar um serviço de nuvem ou site horizontalmente, não assuma que uma série de solicitações da mesma fonte são sempre roteadas para a mesma instância. Pelo mesmo motivo, os serviços devem ser concebidos sem estado para evitar exigir que uma série de solicitações de uma aplicação seja sempre direcionada para a mesma instância de um serviço. Ao projetar um serviço que lê mensagens de uma fila e as processa, não faça suposições sobre qual instância do serviço lida com uma mensagem específica. O dimensionamento automático pode iniciar mais instâncias de um serviço à medida que a extensão da fila aumenta. O padrão Consumidores concorrentes descreve como lidar com esse cenário.

  • Se a solução implementar uma tarefa de longa execução, projete essa tarefa para dar suporte tanto ao escalonamento para fora quanto ao escalonamento para dentro. Sem um design adequado, tal tarefa poderia impedir que uma instância de um processo fosse encerrada de forma limpa quando o sistema reduz a escala. Ou pode perder dados se o processo for encerrado à força. Idealmente, refatore uma tarefa de longa duração e divida o processamento que ela executa em partes menores e discretas. Para obter um exemplo, consulte Padrão de tubos e filtros.

  • Como alternativa, você pode implementar um mecanismo de ponto de verificação que registra informações de estado sobre a tarefa em intervalos regulares. Salve essas informações de estado em armazenamento durável que qualquer instância do processo que executa a tarefa pode acessar. Portanto, se o processo for encerrado, o trabalho que ele estava executando pode ser retomado a partir do último ponto de verificação usando outra instância. Existem bibliotecas que fornecem essa funcionalidade, como NServiceBus e MassTransit. Eles persistem o estado de forma transparente, com intervalos alinhados ao processamento de mensagens das filas no Barramento de Serviço do Azure.

  • Quando as tarefas em segundo plano são executadas em instâncias de computação separadas, como em funções de trabalho de um aplicativo hospedado em serviços de nuvem, talvez seja necessário dimensionar diferentes partes do aplicativo usando diferentes políticas de dimensionamento. Por exemplo, talvez seja necessário implantar mais instâncias de computação da interface do usuário sem aumentar o número de instâncias de computação em segundo plano, ou o contrário. Você pode oferecer diferentes níveis de serviço, como pacotes de serviços básicos e premium. Talvez seja necessário expandir os recursos de computação para pacotes de serviços premium de forma mais agressiva do que os recursos para pacotes de serviços básicos. Essa abordagem ajuda você a cumprir os SLAs.

Outros critérios de escala

  • Considere o comprimento da fila sobre a qual a interface do usuário e as instâncias de computação em segundo plano se comunicam. Use-o como critério para sua estratégia de dimensionamento automático. Esse critério pode indicar um desequilíbrio ou diferença entre a carga atual e a capacidade de processamento da tarefa em segundo plano. Há um atributo um pouco mais complexo, mas melhor, para basear as decisões de escala. Use o tempo entre quando uma mensagem foi enviada e quando seu processamento foi concluído, conhecido como tempo crítico. Se esse valor de tempo crítico estiver abaixo de um limite de negócios significativo, será desnecessário dimensionar, mesmo que o comprimento da fila seja longo.

    • Por exemplo, pode haver 50.000 mensagens em uma fila. Mas o tempo crítico da mensagem mais antiga é de 500 ms, e esse endpoint está lidando com a integração com um serviço Web parceiro para enviar e-mails. As partes interessadas das empresas podem não considerar este cenário como suficientemente urgente para justificar o custo da expansão.

    • Por outro lado, poderia haver 500 mensagens em uma fila, com o mesmo tempo crítico de 500 ms. Mas o endpoint faz parte do caminho crítico num jogo online de tempo real, onde os interessados comerciais definiram um tempo de resposta de 100 ms ou menos. Nesse caso, a expansão horizontal faz sentido.

    • Para aproveitar o tempo crítico nas decisões de dimensionamento automático, é útil que uma biblioteca adicione automaticamente as informações relevantes aos cabeçalhos das mensagens durante a transmissão e o processamento. Uma dessas bibliotecas que fornece essa funcionalidade é o NServiceBus.

  • Se você basear sua estratégia de dimensionamento automático em contadores que medem processos de negócios, certifique-se de entender completamente a relação entre os resultados desses tipos de contadores e os requisitos reais de capacidade de computação. Exemplos de contadores incluem o número de ordens colocadas a cada hora ou o tempo médio de execução de uma transação complexa. Pode ser necessário dimensionar mais de um componente ou unidade de computação em resposta a alterações nos contadores de processos de negócios.

  • Para evitar que um sistema tente expandir excessivamente, considere limitar o número máximo de instâncias que podem ser adicionadas automaticamente. Essa abordagem também evita os custos associados à execução de muitos milhares de instâncias. A maioria dos mecanismos de dimensionamento automático permite especificar o número mínimo e máximo de instâncias para uma regra. Além disso, considere degradar de forma suave a funcionalidade que o sistema fornece se proceder à implementação do número máximo de instâncias e o sistema ainda estiver sobrecarregado.

  • Lembre-se de que o dimensionamento automático pode não ser o mecanismo mais apropriado para lidar com uma explosão repentina na carga de trabalho. Leva tempo para configurar e iniciar novas instâncias de um serviço ou adicionar recursos a um sistema. E o pico de demanda pode passar quando esses recursos extras estiverem disponíveis. Nesse cenário, talvez seja melhor limitar o serviço. Para obter mais informações, consulte Padrão de limitação.

  • Por outro lado, se você precisar da capacidade de processar todas as solicitações quando o volume flutuar rapidamente, considere usar uma estratégia agressiva de dimensionamento automático que inicie instâncias extras mais rapidamente. Certifique-se de que o custo não é um fator contribuinte importante. Você também pode usar uma política agendada que inicia um número suficiente de instâncias para atender à carga máxima antes que essa carga seja esperada.

  • O mecanismo de dimensionamento automático deve monitorar o processo de dimensionamento automático e registrar os detalhes de cada evento de dimensionamento automático. Esses detalhes incluem o que desencadeou o evento, quais recursos foram adicionados ou removidos e quando ele ocorreu. Se você criar um mecanismo de dimensionamento automático personalizado, certifique-se de que ele incorpore esse recurso. Analise as informações para ajudar a medir a eficácia da estratégia de dimensionamento automático e ajuste-a, se necessário. Você pode ajustar tanto a curto prazo, à medida que os padrões de uso se tornam mais óbvios, quanto a longo prazo, à medida que os negócios se expandem ou os requisitos do aplicativo evoluem. Se um aplicativo atingir o limite superior definido para dimensionamento automático, o mecanismo também poderá alertar um operador que poderá iniciar manualmente recursos extras, se necessário. Nessas circunstâncias, o operador também pode ser responsável por remover manualmente esses recursos depois que a carga de trabalho diminuir.

Os seguintes padrões e orientações também podem ser relevantes para o seu cenário ao implementar o dimensionamento automático:

  • O padrão de Limitação descreve como um aplicativo pode continuar a funcionar e atender aos SLAs quando um aumento na demanda coloca uma carga extrema sobre os recursos. A limitação pode ser usada com o dimensionamento automático para evitar que um sistema fique sobrecarregado enquanto o sistema se expande.

  • O padrão Consumidores concorrentes descreve como implementar um pool de instâncias de serviço que podem processar mensagens de qualquer instância de aplicação. O dimensionamento automático pode ser usado para iniciar e parar instâncias de serviço para corresponder à carga de trabalho prevista. Essa abordagem permite que um sistema processe várias mensagens simultaneamente para otimizar a taxa de transferência, melhorar a escalabilidade e a disponibilidade e equilibrar a carga de trabalho.

  • O monitoramento e o diagnóstico, incluindo instrumentação e métricas, são vitais para reunir as informações que podem impulsionar o processo de dimensionamento automático.