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). Quando a procura abranda e os recursos adicionais deixam de ser necessários, 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:

  • Dimensionamento vertical, também conhecido como aumentar e reduzir verticalmente, que significa alterar a capacidade de um recurso. Por exemplo, pode mover uma aplicação para uma VM com um tamanho maior. Muitas vezes, o dimensionamento vertical requer tornar o sistema indisponível temporariamente enquanto está a ser reimplementado. Por conseguinte, é menos comum automatizar o dimensionamento vertical.

  • Dimensionamento horizontal, também conhecido como aumentar ou reduzir horizontalmente, que 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 aprovisionamento estiver concluído, a solução é implementada nesses recursos adicionais. Se a procura cair, os recursos adicionais podem ser encerrados facilmente e desalocados.

Muitos sistemas baseados na cloud, incluindo o Microsoft Azure, suportam o dimensionamento horizontal automático. O resto deste artigo aborda o dimensionamento horizontal.

Nota

O dimensionamento automático aplica-se principalmente a recursos de computação. Embora seja possível dimensionar horizontalmente uma base de dados ou uma fila de mensagens, tal envolve, geralmente, a criação de partições de dados, que, regra geral, não é um processo automático.

Componentes de dimensionamento automático

Normalmente, as estratégias de dimensionamento automático envolvem as seguintes partes:

  • Sistemas de instrumentação e monitorização ao nível da aplicação, do serviço e da infraestrutura. Estes sistemas capturam métricas-chave, como, por exemplo, tempos de resposta, comprimentos das filas, utilização da CPU e utilização da memória.
  • Lógica de tomada de decisões, que avalia estas métricas relativamente a limiares predefinidos ou agendas e decide se vai ocorrer o dimensionamento.
  • Componentes que dimensionam o sistema.
  • Testes, monitorização e otimização da estratégia de dimensionamento automático, para garantir que funciona conforme esperado.

O Azure oferece mecanismos de dimensionamento automático incorporado que se aplicam a cenários comuns. Se um determinado serviço ou tecnologia não tiver a funcionalidade de dimensionamento automático incorporado ou se tiver requisitos de dimensionamento automático específicos para além das respetivas capacidades, pode considerar uma implementação personalizada. Uma implementação personalizada recolheria métricas operacionais e de sistema, analisá-las-ia e, em seguida, dimensionaria recursos em conformidade.

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

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

Todas estas opções de computação utilizam o dimensionamento automático do Azure Monitor para proporcionar um conjunto comum de funcionalidades de dimensionamento automático.

  • As Funções do Azure diferem das opções de computação anteriores, porque não é necessário configurar regras de dimensionamento automático. Em vez disso, as Funções do Azure alocam automaticamente capacidade de computação quando o seu código está em execução, aumentando horizontalmente conforme necessário para processar carga. Para obter mais informações, veja Choose the correct hosting plan for Azure Functions (Escolher o plano de alojamento certo para as Funções do Azure).

Por fim, em alguns casos, pode ser útil ter uma solução de dimensionamento automático personalizada. 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. Depois, pode definir regras personalizadas com base nessas métricas e utilizar APIs REST do Resource Manager para acionar o dimensionamento automático. No entanto, não é simples implementar uma solução personalizada e só deve ser considerada se nenhuma das abordagens anteriores satisfizer os seus requisitos.

Utilize as funcionalidades de dimensionamento automático incorporado da plataforma, se cumprirem os seus requisitos. Caso contrário, considere cuidadosamente se precisa realmente de funcionalidades de dimensionamento mais complexas. Exemplos de requisitos adicionais 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.

Utilizar o dimensionamento automático do Azure Monitor

O dimensionamento automático do Azure Monitor fornece um conjunto comum de funcionalidade de dimensionamento automático para conjuntos de dimensionamento de máquinas virtuais, Serviço de Aplicativo do Azure e Serviço de Nuvem do Azure. O dimensionamento pode ser feito de acordo com uma agenda ou baseado numa métrica de runtime, como a utilização da CPU ou da memória.

Exemplos:

  • Aumentar horizontalmente para dez instâncias nos dias úteis e reduzir horizontalmente para quatro instâncias ao sábado e ao domingo.
  • Aumentar horizontalmente em uma instância se a utilização média da CPU for superior a 70% e reduzir horizontalmente em uma instância se essa utilização for inferior a 50%.
  • Aumentar horizontalmente em uma instância se o número de mensagens numa fila exceder um determinado limiar.

Aumente a escala do recurso quando a carga aumentar para garantir a disponibilidade. Da mesma forma, em momentos de baixo uso, diminua a escala, para que você possa otimizar o custo. Use sempre uma combinação de regras de expansão e expansã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. Ele é dimensionado com base nesse valor se as contagens máximas ou mínimas de instâncias não estiverem definidas.

Para obter uma lista das métricas incorporadas, veja Azure Monitor autoscaling common metrics (Métricas comuns do dimensionamento automático do Azure Monitor). Também pode implementar métricas personalizadas com o Application Insights.

Pode configurar o dimensionamento automático com o PowerShell, a CLI do Azure, um modelo do Azure Resource Manager ou o portal do Azure. Para obter um controlo mais detalhado, utilize a API REST do Azure Resource Manager. A Biblioteca de Gestão do Azure Monitoring Service e a Biblioteca do Microsoft Insights (em pré-visualização) são SDKs que permitem recolher métricas de recursos diferentes e utilizar as APIs REST para realizar o dimensionamento automático. Em recursos nos quais não haja suporte para o Azure Resource Manager ou se estiver a utilizar os Serviços Cloud do Azure, a API REST da Gestão de Serviço pode ser utilizada para o dimensionamento automático. Em todos os outros casos, utilize o Azure Resource Manager.

Tenha em conta os seguintes pontos quando utilizar o dimensionamento automático do Azure:

  • 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 isto não for possível, utilize o dimensionamento automático reativo baseado em métricas, de modo a lidar com as alterações imprevisíveis na procura. Normalmente, pode combinar estas 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. Isto ajuda a garantir que a capacidade está disponível sempre que necessário, sem atrasos provocados quando são iniciadas as instâncias novas. Para cada regra agendada, defina métricas que permitem o dimensionamento automático reativo durante esse período, para se certificar de que a aplicação consegue processar picos constantes, mas imprevisíveis, na procura.

  • Muitas vezes, é difícil compreender a relação entre métricas e requisitos de capacidade, especialmente durante a implementada inicial de uma aplicação. Aprovisione um pouco de capacidade extra no início e, depois, monitorize e otimize as regras de dimensionamento automático, para que a capacidade se aproxime da carga real.

  • Configure as regras de dimensionamento automático e, em seguida, monitorize o desempenho da sua aplicação ao longo do tempo. Utilize os resultados desta monitorização para ajustar a forma através da qual o sistema se dimensiona, se necessário. No entanto, tenha em atenção que o dimensionamento automático não é um processo instantâneo. Demora algum tempo a reagir a uma métrica, como a utilização média da CPU que excede (ou fica aquém) um limiar especificado.

  • As regras de dimensionamento automático que utilizam um mecanismo de deteção baseado num atributo de acionador medido (como a utilização da CPU ou o comprimento da fila) utilizam um valor agregado ao longo do tempo, em vez de valores instantâneos, para acionar uma ação de dimensionamento automático. Por predefinição, a agregação consiste numa média dos valores. Isto impede o sistema de reagir de forma demasiado rápida ou de provocar oscilações rápidas. Ele também dá tempo para que novas instâncias que são iniciadas automaticamente se instalem no modo de execução, impedindo que ações adicionais de dimensionamento automático ocorram enquanto as novas instâncias são iniciadas. Nos Serviços Cloud do Azure e nas Máquinas Virtuais do Azure, o período predefinido para a agregação são 45 minutos, pelo que a métrica pode demorar todo este tempo para acionar o dimensionamento automático em resposta a picos na procura. Você pode alterar o período de agregação usando o SDK, mas períodos inferiores a 25 minutos podem causar resultados imprevisíveis. Nas aplicações Web, o período médio é muito mais pequeno, o que permite que as instâncias novas estejam disponíveis em cerca de cinco minutos após ser feita uma alteração à medida de acionador média.

  • Evite bater onde as ações de scale-in e scale-out vão e voltam continuamente. Suponha que há duas instâncias, e o limite superior é 80% CPU, limite inferior é 60%. Quando a carga está em 85%, outra instância é adicionada. Após algum tempo, a carga diminui para 60%. Antes do dimensionamento, o serviço de dimensionamento automático calcula a distribuição da carga total (de três instâncias) quando uma instância é removida, levando-a a 90%. Isso significa que ele teria que se expandir novamente imediatamente. Assim, ele ignora o dimensionamento e você pode nunca ver os resultados de dimensionamento esperados.

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

  • O dimensionamento manual é redefinido pelo número máximo e mínimo de instâncias usadas para dimensionamento 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 3 e 6. 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 reduzirá 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, ela verificará 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 detalhes sobre como o Azure Monitor é dimensionado, consulte Práticas recomendadas para dimensionamento automático.

  • Se configurar o dimensionamento automático com o SDK em vez do portal, pode especificar uma agenda mais detalhada durante a qual as regras estão ativas. Também pode criar as suas próprias métricas e utilizá-las com ou sem qualquer uma das métricas existentes nas 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 usar contadores personalizados para medir processos de negócios específicos.

  • Ao dimensionar 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. 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. Para obter mais informações, consulte Dimensionar um cluster do Service Fabric para dentro ou para fora usando regras de dimensionamento automático.

  • Pode utilizar o portal para ligar recursos, como filas e instâncias da Base de Dados SQL, a uma instância dos Serviços Cloud. Desta forma, pode aceder mais facilmente às opções separadas da configuração de dimensionamento manual e automático de cada um dos recursos ligados. Para obter mais informações, veja How to: Link a resource to a cloud service (Como ligar um recurso a um serviço cloud).

  • A configuração de várias políticas e regras pode causar conflitos entre as mesmas. O dimensionamento automático utiliza as seguintes regras de resolução de conflitos para garantir que existe sempre um número suficiente de instâncias em execução:

    • As operações de expansão sempre têm precedência sobre as operações de expansão.
    • 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.
    • Se as operações de redução horizontal entrarem em conflito, terá precedência a regra que provoca a menor diminuição no número de instâncias.
  • Em um Ambiente do Serviço de Aplicativo, qualquer pool de trabalhadores ou métricas de front-end podem ser usados para definir regras de dimensionamento automático. Para obter mais informações, veja Autoscaling and App Service Environment (O Dimensionamento Automático e o Ambiente de Serviço de Aplicações).

Considerações de design de aplicações

O dimensionamento automático não é uma solução instantânea. A simples adição de recursos a um sistema ou a execução de mais instâncias de um processo não garante a melhoria do desempenho desse sistema. Ao desenhar uma estratégia de dimensionamento automático, considere os seguintes pontos:

  • O sistema tem de ser desenhado para ser dimensionável horizontalmente. Evite faze suposições quanto à afinidade das instâncias; não desenhe soluções que requeiram que o código seja sempre executado numa instância específica de um processo. Quando dimensionar um serviço cloud ou um Web site horizontalmente, não parta do princípio de que uma série de pedidos da mesma origem será sempre encaminhada para a mesma instância. Pelo mesmo motivo, desenhe os serviços de modo a que não tenham estado, para evitar que seja necessário encaminhar sempre uma série de pedidos de uma aplicação para a mesma instância de um serviço. Ao desenhar um serviço que lê mensagens de uma fila e as processa, não faça suposições relativamente a que instância do serviço processa uma mensagem específica. O dimensionamento automático pode iniciar instâncias adicionais de um serviço à medida que o comprimento da fila cresce. O padrão Consumidores concorrentes descreve como lidar com esse cenário.

  • Se a solução implementar uma tarefa de execução longa, desenhe essa tarefa para suportar o aumento e a redução horizontal. Sem o devido cuidado, semelhante tarefa pode impedir o encerramento correto de uma instância de um processo quando o sistema é reduzido horizontalmente ou pode originar perda de dados, se o processo for terminado à força. Idealmente, reformule uma tarefa de execução longa e divida o processamento que a mesma realiza em segmentos mais pequenos e discretos. O padrão Tubos e Filtros fornece um exemplo de como você pode conseguir isso.

  • Em alternativa, pode implementar um mecanismo de ponto de verificação que regista informações de estado da tarefa em intervalos regulares e guardar esse estado num armazenamento duradouro ao qual qualquer instância do processo que está a executar a tarefa pode aceder. Dessa forma, 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 de forma transparente, onde os intervalos são alinhados com o processamento de mensagens de 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, poderá ter de implementar instâncias de computação de interface de utilizador (IU) adicionais sem aumentar o número de instâncias de computação em segundo plano ou vice-versa. Se oferecer diferentes níveis de serviço (por exemplo, pacotes de serviço premium e básico), de modo a cumprir os SLAs, poderá ter de aumentar horizontalmente os recursos de computação para os pacotes de serviço premium de forma mais agressiva do que os dos pacotes de serviço básico.

  • 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. Este é um indicador possível de 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 ponto de extremidade está lidando com a integração com um serviço Web de terceiros para enviar e-mails. É provável que as partes interessadas do negócio considerem que esse é um período de tempo que não justificaria gastar dinheiro extra para escalar.
    • 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 em algum jogo online em tempo real, onde as partes interessadas do negócio definiram um tempo de resposta de 100 ms ou menos. Nesse caso, a expansão faria 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, enquanto elas são enviadas e processadas. Uma dessas bibliotecas que fornece essa funcionalidade é o NServiceBus.
  • Se basear a estratégia de dimensionamento automático em contadores que medem os processos empresariais, como o número de encomendas feitas por hora ou o tempo médio de execução de uma transação complexa, certifique-se de que compreende perfeitamente a relação entre os resultados desses tipos de contadores e os requisitos de capacidade de computação reais. Poderá ser necessário dimensionar mais de um componente ou unidade de computação como resposta a alterações nos contadores de processos empresariais.

  • Para impedir que um sistema tente aumentar horizontalmente em excesso e para evitar os custos associados à execução de muitos milhares de instâncias, considere limitar o número máximo de instâncias que podem ser adicionadas de forma automática. A maioria dos mecanismos de dimensionamento automático permitem-lhe especificar o número mínimo e máximo de instâncias para uma regra. Além disso, considere diminuir de forma adequada a funcionalidade que o sistema proporciona se tiver sido implementado o número máximo de instâncias e que o sistema continua sobrecarregado.

  • Tenha em atenção que o dimensionamento automático pode não ser o mecanismo mais adequado para processar uma rajada repentina da carga de trabalho. O aprovisionamento e o início de instâncias novas de um serviço ou adicionar recursos a um sistema demora algum tempo e poderá dar-se o caso de o pico na procura já ter passado quando esses recursos adicionais estiverem disponíveis. Neste cenário, poderá ser melhor limitar o serviço. Para obter mais informações, consulte o padrão de limitação.

  • Por outro lado, se precisar de capacidade para processar todos os pedidos quando o volume flutua rapidamente e o custo não é um obstáculo principal, considere utilizar uma estratégia de dimensionamento automático agressiva que inicie instâncias adicionais mais depressa. Também pode utilizar uma política agendada que inicia um número suficiente de instâncias para satisfazer a carga máxima antes de essa carga ser esperada.

  • O mecanismo de dimensionamento automático deverá monitorizar o processo de dimensionamento automático e registar os detalhes de cada evento de dimensionamento automático (o que o acionou, os recursos que foram adicionados ou removidos e quando). Se criar um mecanismo de dimensionamento automático personalizado, confirme que o mesmo incorpora esta capacidade. Analise as informações para ajudar a medir a eficácia da estratégia de dimensionamento automático e otimize-a, se necessário. Pode otimizar a curto prazo, à medida que os padrões de utilização se tornam mais evidentes, e a longo prazo, enquanto a empresa se expande ou os requisitos da aplicação evoluem. Se uma aplicação atingir o limite superior definido para o dimensionamento automático, o mecanismo poderá também alertar um operador, o qual poderá iniciar manualmente recursos adicionais, se necessário. Observe que, 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:

  • Padrão de Limitação. Este padrão descreve de que forma é que uma aplicação pode continuar a funcionar e a cumprir os SLAs quando o aumento da procura provoca uma carga extrema nos recursos. A limitação pode ser utilizada com o dimensionamento automático para impedir que um sistema fique assoberbado durante a operação de aumento horizontal.

  • Padrão de Consumidores Concorrentes. Este padrão descreve como implementar um conjunto de instâncias de serviços que podem processar mensagens a partir de qualquer instância da aplicação. O dimensionamento automático pode ser utilizado para iniciar e parar instâncias de serviços, de modo a satisfazer a carga de trabalho antecipada. Esta abordagem permite que um sistema processe várias mensagens em simultâneo para otimizar o débito, melhorar a escalabilidade e a disponibilidade e balancear a carga de trabalho.

  • Monitorização e diagnóstico. A instrumentação e a telemetria são essenciais para a recolha das informações que podem orientar o processo de dimensionamento automático.