Usar as escalas vertical e horizontal em sua arquitetura

Concluído

É raro conseguirmos prever exatamente a carga em nossos sistemas. Um aplicativo voltado para o público pode crescer rapidamente em popularidade e uso ou um aplicativo interno pode precisar atender a uma base de usuários maior de acordo com o crescimento da empresa. Mesmo quando conseguimos prever a carga, raramente ela é uniforme. Os varejistas têm uma demanda maior durante feriados e sites de esportes têm picos em períodos de decisões de campeonatos.

Nesta unidade, vamos:

  • Definir os conceitos de escalar horizontal e verticalmente e de reduzir horizontal e verticalmente.
  • Abordar algumas maneiras como o Azure pode aprimorar seus recursos de colocação em escala.
  • Ver como tecnologias sem servidor e de contêiner podem aprimorar a capacidade de escala de sua arquitetura.

O que é a colocação em escala?

Ao examinar maneiras de aumentar ou diminuir a capacidade de computação e os custos relativos de um aplicativo, é importante definir dois conceitos principais: colocação em escala e recursos.

  • Colocação em escala é o processo de gerenciar seus recursos para ajudar o aplicativo a atender a um conjunto de requisitos de desempenho. Quando você tem muitos recursos atendendo seus usuários, você não está usando esses recursos com eficiência e está desperdiçando dinheiro. Quando recursos insuficientes estão disponíveis, o desempenho do aplicativo pode ser afetado negativamente. A meta é atender aos requisitos de desempenho definidos enquanto os custos permanecem otimizados.
  • Recursos podem ser qualquer coisa de que você precisa para gerenciar para executar seus aplicativos. Memória e CPUs para máquinas virtuais são os recursos mais óbvios, mas alguns serviços do Azure podem exigir que você considere a largura de banda ou abstrações, como as RUs (Unidades de Solicitação) do Azure Cosmos DB.

Em um mundo hipotético em que a demanda dos aplicativos é constante, é fácil prever a quantidade certa de recursos necessários. Mas, no mundo real, as demandas dos aplicativos mudam ao longo do tempo, de modo que a quantidade certa de recursos que você precisa pode ser mais difícil de prever. Se você tiver sorte, essa mudança é previsível ou sazonal, mas isso não é típico de todos os cenários. O ideal é que você provisione a quantidade certa de recursos para atender à demanda e, depois, ajuste essa quantidade conforme a demanda mudar.

Em um cenário local em que você compra e gerencia seus próprios servidores, a colocação em escala é difícil. A adição de recursos pode ser dispendiosa e geralmente leva muito tempo para colocar os recursos online. Às vezes, pode levar mais tempo do que o período em que esse aumento de capacidade é necessário. Também pode ser difícil reduzir recursos em períodos de baixa demanda no sistema, fazendo com que você continue arcando com custos elevados.

A facilidade da colocação em escala é um dos principais benefícios do Azure. A maioria dos recursos do Azure permite adicionar ou remover recursos facilmente conforme a demanda muda. Muitos serviços têm opções automatizadas que monitoram a demanda e se ajustam para você. Essa funcionalidade de colocação em escala automática normalmente é chamada de dimensionamento automático. O dimensionamento automático permite definir limites para os níveis mínimo e máximo de instâncias que devem ficar disponíveis. Ele também adiciona ou remove instâncias com base em uma métrica de desempenho. Um exemplo é a utilização da CPU.

O que é escalar ou reduzir verticalmente?

Quando usa apenas uma instância de um serviço, como uma máquina virtual, talvez você precise escalar o número de recursos disponíveis para essa instância.

  • Escalar verticalmente é o processo de aumentar a capacidade de uma determinada instância. Por exemplo, para ampliar a capacidade de processamento, você pode aumentar uma máquina virtual de 1 vCPU e 3,5 GB de RAM para 2 vCPUs e 7 GB de RAM.
  • Reduzir verticalmente é o processo de diminuir a capacidade de uma determinada instância. Por exemplo, você pode diminuir a capacidade de uma máquina virtual de 2 vCPUs e 7 GB de RAM para 1 vCPU e 3,5 GB de RAM. Dessa forma, você reduz a capacidade e o custo.

A ilustração a seguir mostra um exemplo de mudança no tamanho de uma máquina virtual.

An illustration showing scaling up and scaling down of a virtual machine to change the performance capabilities.

Vamos ver o que significa escalar ou reduzir verticalmente no contexto dos recursos do Azure:

  • Nas máquinas virtuais do Azure, a escala é baseada no tamanho de uma máquina virtual. Uma determinada quantidade de vCPUs, RAM e armazenamento local é associada a cada tamanho de VM. Por exemplo, é possível escalar verticalmente de uma máquina virtual Standard_DS1_v2 (1 vCPU e 3,5 GB de RAM) para uma máquina virtual Standard_DS2_v2 (2 vCPUs e 7 GB de RAM).
  • O Banco de Dados SQL do Azure é uma implementação de PaaS (plataforma como serviço) do Microsoft SQL Server. Você pode escalar verticalmente um banco de dados com base no número de DTUs (unidades de transação do banco de dados) ou de vCPUs. DTUs são uma abstração dos recursos subjacentes e uma combinação de CPU, E/S e memória. Por exemplo, você pode dar ao banco de dados no Banco de Dados SQL do Azure mais taxa de transferência e capacidade, escalando-o de um tamanho P2 com 250 DTUs até um P4 com 500 DTUs.
  • O Serviço de Aplicativo do Azure é um serviço de hospedagem de sites de PaaS no Azure. Os sites são executados em um farm de servidores virtuais, também conhecido como um Plano do Serviço de Aplicativo. É possível escalar ou reduzir verticalmente o Plano do Serviço de Aplicativo entre as camadas de serviço. Também há opções de capacidade dentro dessas camadas de serviço. Por exemplo, um Plano do Serviço de Aplicativo S1 tem 1 vCPU e 1,75 GB de RAM por instância. É possível escalar verticalmente para um Plano do Serviço de Aplicativo S2, com 2 vCPUs e 3 GB de RAM por instância.

Para escalar esses tipos de recursos em um ambiente local, normalmente é preciso esperar a compra e a instalação do hardware necessário para usar o novo nível de escala. No Azure, os recursos físicos já estão implantados e disponíveis para você. Basta selecionar o nível alternativo de escala que você deseja usar.

Considere o impacto de escalar sua solução verticalmente. A decisão depende dos serviços de nuvem que você escolheu.

Por exemplo, se você optar por escalar verticalmente no Banco de Dados SQL do Azure, o serviço cuidará da escala vertical dos nós individuais e continuará a operação do serviço. Alterar a camada de serviço ou o nível de desempenho de um banco de dados cria uma réplica do banco de dados original com o novo nível de desempenho. Depois, as conexões são transferidas para a réplica. Não são perdidos dados durante esse processo. Há apenas uma breve interrupção quando o serviço é transferido para a réplica. Normalmente, a interrupção é de menos de quatro segundos.

Como alternativa, se você optar por escalar uma máquina virtual vertical ou horizontalmente, faça isso selecionando um tamanho de instância diferente. Na maioria das situações, se a VM já estiver em execução, será necessário reiniciá-la. Com isso em mente, você deve esperar que uma reinicialização seja necessária quando você colocar em escala as suas VMs e considerar essa eventualidade em seu planejamento.

Por fim, sempre procure locais nos quais a redução vertical é uma opção. Se o aplicativo pode fornecer um desempenho adequado em uma faixa de preço mais baixa, sua fatura do Azure pode ser reduzida.

O que é escalar ou reduzir horizontalmente?

Você já sabe que escalar e reduzir verticalmente ajusta a quantidade de recursos disponíveis para uma instância. Escalar e reduzir horizontalmente ajusta o número total de instâncias.

  • Escalar horizontalmente é o processo de adicionar mais instâncias para dar suporte à carga da solução. Por exemplo, se o front-end do site estiver hospedado em máquinas virtuais, você poderá aumentar o número de máquinas virtuais se o nível de carga crescer.
  • Reduzir horizontalmente é o processo de remover instâncias que não são mais necessárias para processar a carga da solução. Se os front-ends do site tiverem pouco uso, você poderá reduzir o número de instâncias para economizar custos.

A ilustração a seguir mostra um exemplo de como alterar o número de instâncias de máquina virtual.

An illustration showing scaling out the resources to handle demand and scaling in the resources to reduce costs.

Estes são alguns exemplos do que a escala e a redução horizontais significam no contexto dos recursos do Azure:

  • Para a camada de infraestrutura, provavelmente, você usará Conjuntos de Dimensionamento de Máquinas Virtuais para automatizar a adição e a remoção de instâncias extras.
    • Os Conjuntos de Dimensionamento de Máquinas Virtuais permitem criar e gerenciar um grupo de VMs idênticas e com balanceamento de carga.
    • O número de instâncias de VM pode aumentar ou diminuir automaticamente em resposta à demanda ou a uma agenda definida.
  • Em uma implementação do Banco de Dados SQL do Azure, você pode compartilhar a carga entre instâncias de banco de dados pela fragmentação. A fragmentação é uma técnica para distribuir grandes quantidades de dados estruturados de forma idêntica em vários bancos de dados independentes.
  • No Serviço de Aplicativo do Azure, o Plano do Serviço de Aplicativo é o farm de servidores Web virtuais que hospeda o aplicativo. Escalar horizontalmente dessa maneira significa aumentar o número de máquinas virtuais no farm. Assim como acontece com Conjuntos de Dimensionamento de Máquinas Virtuais, o número de instâncias pode ser aumentado ou diminuído automaticamente em resposta a determinadas métricas ou de acordo com uma agenda.

Normalmente, a escala horizontal é feita com facilidade no portal do Azure, nas ferramentas de linha de comando ou nos modelos do Azure Resource Manager. Na maioria dos casos, ela é imperceptível para o usuário final.

Dimensionamento automático

É possível configurar alguns desses serviços para que eles usem um recurso chamado dimensionamento automático. Com o dimensionamento automático, você não precisa mais se preocupar com a escala manual dos serviços. Em vez disso, você pode definir um limite mínimo e máximo de instâncias. Você pode escalar com base em métricas específicas, como o tamanho da fila ou a utilização da CPU. Você também pode escalar com base em agendamentos. Por exemplo, nos dias da semana entre as 17h e as 19h. A ilustração a seguir mostra como o recurso de dimensionamento automático gerencia instâncias para processar a carga.

An illustration showing how autoscale monitors the CPU levels of a pool of virtual machines and adds instances when the CPU utilization is above the threshold.

Considerações ao escalar e reduzir horizontalmente

Durante a escala horizontal, o tempo de inicialização do aplicativo pode afetar a agilidade com a qual ele pode ser dimensionado. Se o seu aplicativo Web levar dois minutos para ser iniciado e ficar disponível para os usuários, isso significa que cada uma de suas instâncias leva dois minutos para ficar disponível. Leve esse tempo de inicialização em consideração ao determinar a velocidade com que deseja escalar.

Também é necessário considerar como o aplicativo manipula o estado. Quando o aplicativo é colocado em escala, qualquer estado armazenado na instância removida do seu ambiente é perdido. Se um usuário se conectar a uma instância que perdeu seu estado, seu aplicativo poderá forçar o usuário a entrar ou selecionar seus dados novamente. Isso resultará em uma experiência de usuário ruim. Um padrão comum é exteriorizar o estado para outro serviço, como o Banco de Dados SQL ou o Cache do Azure para Redis, fazendo com que os servidores Web fiquem sem estado. Com os front-ends da Web estão sem estado, você não precisa se preocupar com quais instâncias individuais estão disponíveis. Todas elas estão fazendo o mesmo trabalho e são implantadas da mesma maneira.

Limitação

Estabelecemos que a carga em um aplicativo varia com o tempo. Essa variação pode ser decorrente do número de usuários ativos ou simultâneos e das atividades sendo executadas. Você pode usar o dimensionamento automático para adicionar capacidade, mas também pode usar um mecanismo de limitação para limitar o número de solicitações de uma origem. Você pode proteger os limites de desempenho colocando limites conhecidos em vigor no nível do aplicativo. Fazer isso impede a interrupção do aplicativo. A limitação é usada com mais frequência em aplicativos que expõem pontos de extremidade de API.

Você pode definir que a limitação comece quando seu aplicativo atingir um limite de desempenho específico. Esse mecanismo garante que o SLA geral do sistema não seja violado. Por exemplo, se você expuser uma API aos clientes para obter dados, poderá limitar o número de solicitações a 100 por minuto. Se um cliente exceder esse limite, você poderá responder com um código de status HTTP 429, incluindo o tempo de espera antes que outra solicitação possa ser enviada com êxito.

Sem servidor

A computação sem servidor fornece um ambiente de execução hospedado na nuvem que executa os aplicativos, mas que abstrai por completo o ambiente subjacente. Você cria uma instância do serviço e adiciona seu código. Nenhum gerenciamento ou manutenção da infraestrutura é necessário, nem mesmo permitido.

Você configura os aplicativos sem servidor para responder a eventos. Um evento pode ser um ponto de extremidade REST, um temporizador ou uma mensagem recebida de outro serviço do Azure. O aplicativo sem servidor é executado somente quando um evento o dispara.

Quando você trabalha com aplicativos sem servidor, a infraestrutura não é sua responsabilidade. A colocação em escala e o desempenho são manipulados automaticamente. Você é cobrado apenas pelos recursos que usa. Não é necessário ter capacidade reserva. O Azure Functions, as Instâncias de Contêiner do Azure e os Aplicativos Lógicos do Azure são exemplos de computação sem servidor disponíveis no Azure.

Contêineres

Um contêiner é um método de execução de aplicativos em um ambiente virtualizado. Uma máquina virtual é virtualizada no nível do hardware, no qual um hipervisor possibilita a execução de vários sistemas operacionais virtualizados em um único servidor físico. Os contêineres elevam a virtualização para outro nível. A virtualização é feita no nível do sistema operacional, possibilitando a execução de várias instâncias do aplicativo no mesmo SO.

Os contêineres são leves e adequados para escalar cenários horizontalmente. Por design, eles podem ser criados, escalados horizontalmente e interrompidos dinamicamente à medida que o ambiente e as demandas mudam. Outro benefício do uso de contêineres é a capacidade de executar vários aplicativos isolados em cada máquina virtual. Como os contêineres são protegidos e isolados em um nível de kernel, você não precisa necessariamente separar VMs para cargas de trabalho diferentes.

Embora seja possível executar contêineres em máquinas virtuais, alguns serviços do Azure facilitam o gerenciamento e o dimensionamento de contêineres:

  • AKS (Serviço do Kubernetes do Azure)

    Com o Serviço de Kubernetes do Azure, você pode configurar máquinas virtuais para que atuem como nós. O Azure hospeda o plano de gerenciamento do Kubernetes. Você paga apenas pelos nós de trabalho em execução que hospedam os contêineres.

    Para aumentar o número de nós de trabalho no Azure, use a CLI do Azure e aumente-o manualmente. No momento da redação deste artigo, você pode usar o Dimensionador Automático de Cluster no AKS para dimensionar automaticamente os nós de trabalho. No cluster do Kubernetes, use o Autodimensionador de Pod Horizontal para escalar horizontalmente o número de instâncias do contêiner a ser implantado.

    O AKS também pode escalar com o Kubelet Virtual, que é descrito na próxima seção.

  • Instâncias de Contêiner do Azure

    As Instâncias de Contêiner do Azure são uma abordagem sem servidor que permite criar e executar contêineres sob demanda. Você é cobrado apenas pelo tempo de execução por segundo.

Você pode usar o complemento de nós virtuais no AKS para conectar Instâncias de Contêiner do Azure ao seu ambiente do Kubernetes. O complemento é baseado no kubelet virtual do projeto de software livre. Com nós virtuais, quando o cluster do Kubernetes exige mais instâncias de contêiner, essas demandas podem ser atendidas nas Instâncias de Contêiner. Como as Instâncias de Contêiner são sem servidor, não é necessário ter capacidade reservada. Você pode aproveitar o controle e a flexibilidade da escala do Kubernetes com a cobrança por segundo da computação sem servidor.

Verificar seus conhecimentos

1.

Qual é a descrição mais precisa do termo "escalar horizontalmente"?

2.

Qual é a descrição mais precisa do termo reduzir verticalmente?

3.

Qual das considerações a seguir não é importante quando você cria uma estratégia de colocação em escala em seu aplicativo?