Dimensionamento automático
O dimensionamento automático é o processo de alocar recursos dinamicamente para atender aos requisitos de desempenho. À medida que o volume de trabalho aumenta, um aplicativo pode precisar de recursos adicionais para manter os níveis de desempenho desejados e atender aos contratos de nível de serviço (SLAs). Conforme a demanda diminui e os recursos adicionais deixam de ser necessários, é possível desalocá-los para minimizar os custos.
O dimensionamento automático aproveita a elasticidade de ambientes hospedados na nuvem e ainda alivia a sobrecarga no gerenciamento. Ele reduz a necessidade de um operador monitorar constantemente o desempenho de um sistema e toma decisões sobre a adição ou remoção de recursos.
Há duas maneiras principais de um aplicativo ser dimensionado:
Dimensionamento vertical, também chamado de aumento e redução vertical, significa que é possível alterar a capacidade de um recurso. Por exemplo, você pode mover um aplicativo para um tamanho maior de VM. Geralmente, o dimensionamento vertical requer que o sistema fique temporariamente indisponível enquanto é reimplantado. Portanto, não é comum automatizar o dimensionamento vertical.
Dimensionamento horizontal, também chamado de expansão e redução horizontal, significa que é possível adicionar ou remover instâncias de um recurso. O aplicativo continua em execução sem interrupções conforme os novos recursos são provisionados. Quando o processo de provisionamento é concluído, a solução é implantada com esses recursos adicionais. Se a demanda cair, os recursos adicionais poderão ser desligados e desalocados.
Muitos sistemas baseados em nuvem, incluindo o Microsoft Azure, oferecem suporte à automação dessa forma de dimensionamento. O restante deste artigo está voltado para o dimensionamento horizontal.
Observação
O dimensionamento automático se aplica principalmente a recursos de computação. Embora seja possível dimensionar horizontalmente de uma fila de banco de dados ou mensagem, isso normalmente envolve particionamento de dados, que geralmente não são automatizados.
Componentes do dimensionamento automático
Uma estratégia de dimensionamento automático geralmente envolve as seguintes partes:
- Sistemas de instrumentação e monitoramento nos níveis de aplicativos, serviços e infraestrutura. Esses sistemas capturam métricas essenciais, como tempos de resposta, comprimentos de fila, utilização da CPU e uso de memória.
- A lógica de tomada de decisões avalia essas métricas em relação a limites predefinidos ou agendas e decide se vai dimensionar.
- Componentes que dimensionam o sistema.
- Teste, monitoramento e ajuste da estratégia de dimensionamento automático para garantir que ela funcione conforme o esperado.
O Azure fornece mecanismos de dimensionamento automático internos que atendem cenários comuns. Se um determinado serviço ou tecnologia não tem a funcionalidade de dimensionamento automático interna, ou se você tiver requisitos de dimensionamento automático específicos além dos seus recursos, é possível considerar uma implementação personalizada. Uma implementação personalizada deve coletar e analisar métricas do sistema e operacionais e, em seguida, dimensionar 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.
Dimensionamento automático de máquinas virtuais do Azure por meio de conjuntos de dimensionamento de máquinas virtuais, que gerenciam um conjunto de máquinas virtuais do Azure como um grupo. Confira Como usar o dimensionamento automático e os conjuntos de dimensionamento de máquinas virtuais.
O Service Fabric também dá suporte ao dimensionamento automático por meio de conjuntos de dimensionamento de máquinas virtuais. Cada tipo de nó em um cluster do Service Fabric é configurado como um conjunto de dimensionamento de máquinas virtuais separado. Dessa forma, cada tipo de nó pode ser dimensionado independentemente. Confira Reduzir horizontalmente ou expandir um cluster do Service Fabric usando regras de dimensionamento automático.
O Serviço de Aplicativo do Azure tem o dimensionamento automático interno. As configurações de escala automática se aplicam a todos os aplicativos dentro de um Serviço de Aplicativo. Para mais informações, confira Escalar a contagem de instâncias manual ou automaticamente e Escalar verticalmente um aplicativo no Serviço de Aplicativo do Azure.
Todas essas opções de computação usam o Dimensionamento automático do Azure Monitor para fornecer um conjunto comum de funcionalidade de dimensionamento automático.
- As Azure Functions diferem das opções anteriores de computação porque não é necessário configurar regras de dimensionamento automático. Em vez disso, as Azure Functions alocam a capacidade de computação automaticamente quando seu código é executado, dimensionando conforme o necessário para lidar com a carga. Para obter mais informações, confira Como escolher o plano de hospedagem correto para as Azure Functions.
Por fim, uma solução de dimensionamento automático personalizado, às vezes, pode ser útil. Por exemplo, você pode usar o Diagnóstico do Azure e métricas baseadas no aplicativo, junto com o código personalizado, para monitorar e exportar as métricas de aplicativo. Em seguida, você poderia definir regras personalizadas com base nessas métricas e usar APIs REST do Gerenciador de Recursos para acionar o dimensionamento automático. No entanto, uma solução personalizada não é simples de implementar e deve-se considerar essa possibilidade apenas se nenhuma das abordagens anteriores atendem a seus requisitos.
Use os recursos de dimensionamento automático internos da plataforma, se atenderem aos seus requisitos. Caso contrário, avalie cuidadosamente se você realmente precisa de recursos de dimensionamento mais complexos. Alguns exemplos de requisitos adicionais podem incluir mais granularidade de controle, maneiras diferentes para detectar eventos de gatilho para dimensionamento, dimensionamento entre assinaturas e dimensionamento de outros tipos de recursos.
Como usar o dimensionamento automático do Azure Monitor
O dimensionamento automático do Azure Monitor fornece um conjunto comum de funcionalidades de dimensionamento automático para conjuntos de dimensionamento de máquinas virtuais, o Serviço de Aplicativo do Azure e o serviço de nuvem do Azure. O dimensionamento pode ser executado em um cronograma, ou com base em uma métrica de runtime, como o uso de CPU ou memória.
Exemplos:
- Escalar horizontalmente 10 instâncias em dias da semana e reduzir horizontalmente 4 instâncias no sábado e domingo.
- Escalar horizontalmente uma instância se o uso médio da CPU está acima de 70%, e reduzir horizontalmente uma instância se o uso de CPU cai abaixo de 50%.
- Escalar horizontalmente uma instância se o número de mensagens em uma fila exceder um determinado limite.
Escalar verticalmente o recurso quando a carga aumentar para garantir a disponibilidade. Da mesma forma, em períodos de baixo uso, reduzir verticalmente, de modo a otimizar os custos. Sempre use uma combinação de regras de expansão e redução horizontal. Caso contrário, o dimensionamento automático só ocorrerá em uma direção até atingir o limite (contagens de instâncias máximas ou mínimas) definido no perfil.
Selecione uma contagem de instâncias padrão que seja segura para sua carga de trabalho. Ela será escalada com base nesse valor se as contagens de instâncias máximas ou mínimas não estiverem definidas.
Para obter uma lista das métricas internas, confira Métricas comuns de dimensionamento automático do Azure Monitor. 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 mais controle, use a API REST do Azure Resource Manager. A Biblioteca de Gerenciamento dos Serviços de Monitoramento do Azure e a Biblioteca do Microsoft Insights (em visualização) são SDKs que permitem a coleta de métricas de recursos diferentes e realizam o dimensionamento automático usando a API REST. Para recursos em que o suporte do Azure Resource Manager não está disponível, ou se você estiver usando os Serviços de Nuvem do Azure, a API REST do Gerenciamento de Serviços pode ser usada para dimensionamento automático. Nos outros casos, use o Azure Resource Manager.
Considere os seguintes pontos ao usar 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 a picos previstos na demanda. Se isso não for possível, use dimensionamento automático reativo com base nas métricas de runtime para lidar com alterações imprevisíveis na demanda. Normalmente, você pode combinar essas abordagens. Por exemplo, crie uma estratégia que adiciona recursos de acordo com um agendamento dos horários em que você sabe que o aplicativo está mais ocupado. Isso ajuda a garantir que a capacidade esteja disponível quando necessário, sem a demora enfrentada ao iniciar novas instâncias. Além disso, para cada regra agendada, defina métricas que permitam o dimensionamento automático reativo durante esse período para garantir que o aplicativo possa dar suporte a picos de demanda prolongados, mas repentinos.
Muitas vezes é difícil entender a relação entre os requisitos de capacidade e métricas, especialmente quando um aplicativo é inicialmente implantado. Provisione um pouco de capacidade extra no início e monitore e ajuste as regras de dimensionamento automático para aproximar a capacidade da carga real.
Configure as regras de dimensionamento automático e monitore o desempenho do seu aplicativo ao longo do tempo. Use os resultados desse monitoramento para ajustar a maneira na qual o sistema pode ser 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 média de uso da CPU que excede (ou fica abaixo) de um limite especificado.
As regras de dimensionamento automático que usam um mecanismo de detecção com base em um atributo de gatilho de medida (por exemplo, o comprimento da fila ou a utilização de CPU) usam, para disparar uma ação de dimensionamento automático, um valor agregado ao longo do tempo em vez de valores instantâneos. Por padrão, a agregação é uma média dos valores. Isso impede que o sistema reaja rápido demais ou cause oscilação rápida. Ele também permite tempo para que novas instâncias iniciadas automaticamente se ajustem ao modo de execução, impedindo que ações adicionais de dimensionamento automático ocorram enquanto as novas instâncias estão sendo iniciadas. Para Serviços de Nuvem e Máquinas Virtuais do Azure, o período padrão para a agregação é 45 minutos, então esse é o período de tempo máximo que poderá levar para a métrica disparar 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 aplicativos Web, o período de cálculo da média é muito menor, permitindo que novas instâncias estejam disponíveis cerca de cinco minutos após uma alteração à medida de gatilho segundo a média.
Evite a oscilação em que as ações de redução horizontal e de expansão se intercalam continuamente. Suponha que existam duas instâncias, e o limite superior seja de 80% de CPU e o limite inferior seja de 60%. Quando a carga estiver em 85%, outra instância será adicionada. Após algum tempo, a carga diminuirá para 60%. Antes da redução horizontal, 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 ela precisará ser escalada horizontalmente de novo imediatamente. Portanto, ele ignora a redução horizontal, e você talvez nunca veja os resultados de escala esperados.
A situação de oscilação pode ser controlada pela escolha de uma margem adequada entre os limites de expansão e redução horizontal.
A escala manual é redefinida 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 que o valor máximo, o mecanismo de dimensionamento automático a escalará automaticamente para o mínimo (se for menor) ou o máximo (se for maior). Por exemplo, você pode definir o intervalo entre 3 e 6. Se você tiver uma instância em execução, o mecanismo de dimensionamento automático dimensionará para três instâncias na sua próxima execução. Da mesma forma, se você definir manualmente a escala para oito instâncias, na próxima execução, o dimensionamento automático será dimensionado de volta para seis instâncias na sua próxima execução. O dimensionamento manual é muito temporário, a menos que você também redefina as regras de dimensionamento automático.
O mecanismo de dimensionamento automático processa apenas um perfil por vez. Se uma condição não for atendida, ele verificará o próximo perfil. Mantenha as principais métricas fora do perfil padrão, pois o perfil é verificado por último. Em um perfil, você pode ter várias regras. Na expansão, o dimensionamento automático será executado se nenhuma regra for atendida. Em reduzir horizontalmente, o dimensionamento automático exige que todas as regras sejam atendidas.
Para obter detalhes sobre como o Azure Monitor realiza as escalas, confira Melhores práticas de dimensionamento automático.
Se configurar o dimensionamento automático usando o SDK em vez do portal, você poderá especificar uma agenda mais detalhada durante a qual as regras estão ativas. Você também pode criar suas próprias métricas e usá-las, com ou sem as métricas existentes, em suas regras de dimensionamento automático. Por exemplo, o ideal é usar contadores alternativos, como o número de solicitações por segundo ou a disponibilidade de memória média, ou usar contadores personalizados para medir processos de negócios específicos.
Quando é feito o dimensionamento automático do Service Fabric, os tipos de nó no cluster são compostos por conjuntos de dimensionamento de máquinas virtuais no back-end, ou seja, você precisa configurar regras de dimensionamento automático para cada tipo de nó. Leve em conta o número de nós que você precisa ter antes de configurar o dimensionamento automático. O número mínimo de nós necessários para o tipo de nó primário é controlado pelo nível de confiabilidade escolhido. Para obter mais informações, consulte Como escalar um cluster do Service Fabric usando regras de dimensionamento automático.
Você pode usar o portal para vincular recursos como instâncias do Banco de Dados SQL e filas a uma instância do Serviço de Nuvem. Isso 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, confira Como vincular um recurso a um serviço de nuvem.
Ao configurar várias políticas e regras, elas poderão entrar em conflito entre si. O Dimensionamento Automático usa as regras de resolução de conflitos a seguir para garantir que haja 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 redução horizontal.
- Quando há um conflito entre as operações de expansão, a regra que inicia o maior aumento no número de instâncias tem precedência.
- Quando há conflito entre operações de redução horizontal, a regra que inicia a menor redução no número de instâncias tem precedência.
Em um Ambiente do Serviço de Aplicativo, qualquer métrica de pool de trabalho ou de front-end pode ser usada para definir as regras de dimensionamento automático. Para obter mais informações, confira Dimensionamento automático e Ambiente do Serviço de Aplicativo.
Considerações sobre o design de aplicativo
O dimensionamento automático não é uma solução imediata. Apenas adicionar recursos a um sistema ou executar mais instâncias de um processo não garante que o desempenho do sistema vai melhorar. Considere os seguintes pontos ao criar uma estratégia de dimensionamento automático:
O sistema deve ser projetado para ser escalonável horizontalmente. Evite fazer suposições sobre afinidade de instância; não crie soluções que exijam que o código esteja sempre sendo executado em uma instância específica de um processo. Ao dimensionar um site ou serviço de nuvem horizontalmente, não presuma que uma série de solicitações da mesma fonte será sempre roteada para a mesma instância. Projete os serviços, por essa mesma razão, como sem monitoração de estado, evitando assim a exigência de que uma série de solicitações de um aplicativo sejam sempre roteadas para a mesma instância de um serviço. Ao criar um serviço que lê as mensagens de uma fila e as processa, não faça suposições sobre qual instância do serviço lidará com qual mensagem. O Dimensionamento Automático pode iniciar instâncias adicionais de um serviço conforme o comprimento da fila cresce. O Padrão de Consumidores Concorrentes descreve como administrar esse cenário.
Se a solução implementa uma tarefa de execução longa, projete-a para oferecer suporte tanto a escalar quanto a reduzir horizontalmente. Sem o devido cuidado, essa tarefa pode impedir que uma instância de um processo seja desligada corretamente quando o sistema é reduzido horizontalmente, ou ela poderá perder dados se o processo for encerrado. Idealmente, refatore uma tarefa de execução longa e divida o processamento que ela executa em blocos menores e distintos. O Padrão de Filtros e Tubos fornece um exemplo de como atingir esse resultado.
Como alternativa, você pode implementar um mecanismo de ponto de verificação que registre informações de estado da tarefa em intervalos regulares, e salve esse estado em armazenamento durável que possa ser acessado por qualquer instância do processo executando a tarefa. Dessa forma, se o processo for desligado, o trabalho que ele estava executando poderá ser retomado do último ponto de verificação por meio de outra instância. Há bibliotecas que fornecem essa funcionalidade, como NServiceBus e MassTransit. Elas persistem de forma transparente e 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 escalar diferentes partes do aplicativo usando diferentes políticas de escala. Por exemplo, talvez seja necessário implantar instâncias de computação de IU (interface do usuário) adicionais sem aumentar o número de instâncias de computação em segundo plano, ou fazer o oposto disso. Se você oferecer níveis diferentes de serviço (como pacotes de serviço básicos e premium), talvez seja necessário escalar horizontalmente os recursos de computação para pacotes de serviço premium de modo mais agressivo do que aqueles para pacotes de serviço básico, para assim atender aos SLAs.
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 um critério para sua estratégia de dimensionamento automático. Esse é um indicador possível de um desequilíbrio ou a 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 dimensionamento. 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 emails. É 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 dimensionar.
- Por outro lado, poderia haver 500 mensagens em uma fila, com o mesmo tempo crítico de 500 ms, mas o ponto de extremidade faz parte do caminho crítico em algum jogo online em tempo real, em que as partes interessadas do negócio definiram um tempo de resposta de 100 ms ou menos. Nesse caso, o dimensionamento 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 é a NServiceBus.
Se sua estratégia de dimensionamento automático em contadores que medem processos de negócios, como o número de pedidos feitos por hora ou o tempo médio de execução de uma transação complexa, certifique-se de entender completamente a relação entre os resultados desses tipos de contadores e os reais requisitos de capacidade de computação. Pode ser necessário dimensionar mais de um componente ou unidade de computação em resposta a alterações nos contadores de processo empresarial.
Para evitar que o sistema tente escalar horizontalmente de modo excessivo e para evitar os custos associados à execução de vários milhares de instâncias, considere a possibilidade de limitar o número máximo de instâncias que podem ser adicionadas automaticamente. A maioria dos mecanismos de dimensionamento automático permitem que você especifique os números mínimo e máximo de instâncias para uma regra. Além disso, considere degradar normalmente a funcionalidade que o sistema oferece se o número máximo de instâncias tiverem sido implantadas e, ainda assim, o sistema estiver sobrecarregado.
Mantenha em mente que dimensionamento automático pode não ser o mecanismo mais apropriado para lidar com um aumento repentino na carga de trabalho. Leva tempo para provisionar e iniciar novas instâncias de um serviço ou adicionar recursos a um sistema, e o pico da demanda pode já ter passado quando esses recursos adicionais forem disponibilizados. Nesse cenário, talvez seja melhor limitar o serviço. Para saber mais, confira Padrão de limitação.
Por outro lado, se você precisa da capacidade de processar todas as solicitações quando o volume flutua rapidamente e o custo não é um fator principal, considere usar uma estratégia de dimensionamento automático agressiva que inicia as instâncias adicionais mais rapidamente. Você também pode usar uma política programada que inicie um número suficiente de instâncias para atender à carga máxima antes que ela seja esperada.
O mecanismo de dimensionamento automático deve monitorar o processo de dimensionamento automático e registrar os detalhes de cada evento desse dimensionamento (o que o disparou, quais recursos foram adicionados ou removidos e quando isso ocorreu). Se você criar um mecanismo de dimensionamento automático personalizado, certifique-se de que ele incorpora essa funcionalidade. Analise as informações para ajudar a medir a eficiência da estratégia de dimensionamento automático e ajustá-la se necessário. Você pode ajustar tanto a curto prazo, conforme os padrões de uso tornam-se mais óbvios, quanto a longo prazo, conforme os negócios se expandem ou os requisitos do aplicativo evoluem. Se um aplicativo atinge o limite superior definido para o dimensionamento automático, o mecanismo também pode alertar um operador, que pode iniciar recursos adicionais manualmente se necessário. Observe que, nessas circunstâncias, o operador também pode ser responsável por remover manualmente esses recursos após a redução na carga de trabalho.
Recursos relacionados
Os padrões e diretrizes a seguir também podem ser relevantes a esse cenário ao implementar o dimensionamento automático:
Padrão de limitação. Esse padrão descreve como um aplicativo pode continuar a funcionar e cumprir os contratos de nível de serviço quando um aumento na demanda coloca uma carga extrema sobre os recursos. É possível usar limitação com o dimensionamento automático para evitar que, ao escalar horizontalmente o sistema, este seja sobrecarregado.
Padrão de consumidores concorrentes. Esse padrão descreve como implementar um conjunto de instâncias de serviço que pode lidar com mensagens de qualquer instância do aplicativo. O dimensionamento automático pode ser usado para iniciar e parar as instâncias de serviço de acordo com a carga de trabalho prevista. Essa abordagem permite que um sistema processe várias mensagens simultaneamente para otimizar o resultado, melhorar a escalabilidade e disponibilidade e equilibrar a carga de trabalho.
Monitoramento e diagnósticos. Instrumentação e telemetria são essenciais para reunir as informações que podem orientar o processo de dimensionamento automático.