Balanceamento de Cargas

Você já se perguntou qual é número máximo de conexões TCP/IP que um servidor Linux suporta? A resposta é 65536. De onde vem esse número? Por que ele é importante? Eu posso aumentar esse número? Pode sim, mas como eu faço isso?? Essas são perguntas que tem respostas bem interessantes, é justamente sobre elas que vamos falar neste post.

O que acontece ao iniciar uma conexão TCP/IP ?

Ao acessar uma página na Internet, mandar um email, ver um vídeo no Youtube, mandar um “zap”, seja do seu celular, tablet, laptop ou de qualquer outro dispositivo conectado à rede você está utilizando o protocolo TPC/IP. Na Internet o protocolo TCP/IP é uma das “línguas” faladas entre os computadores, para iniciar uma conversa entre computadores seria uma diálogo semelhante a isso:

  • Computador 1: - Olá, tudo bem?
  • Computador 2: - Oi, tudo bem!
  • Computador 1: - Podemos conversar?
  • Computador 2: - Sim, o que deseja?
  • Computador 1: - Legal!! Me passa aquela página ali!

É claro que a conversa não é tão educada assim, mas ela segue um protocolo de boas maneiras bem semelhante, a Figura 01 ilustra o que é chamado de aperto de mãos de três vias (3 Way Handshake), esse mecanismo é uma troca de mensagens entre duas máquinas por meio de um protocolo em que ambas estão estabelecendo uma conversa entre si.

Figura 01 - 3 Way Handshake, imagem original em https://www.sciencedirect.com/topics/computer-science/three-way-handshake

Quanto custa uma conversa desse tipo?

Uma conversa desse tipo custa alguma coisa? Claro que custa meu jovem … custa banda de Internet, custa ciclo de CPU do roteador, ciclo de CPU do(s) switch(es), ciclo de CPU do servidor, custa memória, custa leitura e escrita em disco, e custa o compartilhamento com outros usuários. Custo pode-se entender como dinheiro mesmo, Real (R$), Dólar (USD$) e também pode ser entendido como consumo de recurso computacional para realizar um determinado trabalho. Para simplificar bem a conversa vamos contabilizar somente os custos computacionais da conversa acontecendo no servidor destino.

Para uma conversa acontecer os computadores precisam aceitar conversarem sob uma regra de conversação que é o protocolo TCP/IP, e uma vez aceito iniciar a conversa, inicia-se a o envio e recebimento dos “assuntos da conversa” dados.

Na Figura 02 ilustra como esses dados são recebidos dentro de um servidor e quais caminhos são percorridos internamente. Dependendo da sua aplicação um servidor não dá conta de fazer tudo, é nesse momento que entra o Balanceador de cargas.

Figura 02 - Linux processamento de pacotes, imagem original em https://www.researchgate.net/figure/Network-processing-routines-in-Linux-consist-of-dynamic-memory-access-DMA-and-CPU_fig2_327949869

Você pode conhecer um pouco dos caminhos de um pacote de rede por esse vídeo aqui

Balanceamento de cargas

O que eu estou chamando de Balanceador de Cargas, é muito comum ser chamado por outros nomes,
por exemplo: Load balancing, LB - Load Balancing, SLB - Server Load balancing, VIP - Virtual IP, distribuidor de cargas, eu já vi e ouvi de tudo 😄 mas esses são os nomes mais comuns, mas o que isso exatamente? O Balanceador de Cargas é um equipamento de rede preparado para atender centenas de milhares de conexões ao mesmo tempo. A função dele é receber as conexões, tratá-las e repassá-las para um grupo de máquinas. Esse repasse para o grupo as máquinas é baseado em uma certa lógica de distribuição chamada de algoritmo de distribuição de cargas.

A FIGURA 03 traz um desenho de uma arquitetura de redes bastante simplificada, mostrando como se utiliza um Balanceador de Cargas. Percebam o fluxo de uma conexão que vem do usuário, passa pela Internet, chega em um roteador, é recebido pelo Balanceador de Cargas e repassados a um conjunto de recursos, comumente chamado de máquinas ou servidores.

Figura 03 - Balanceador decargas

Algoritmos de distribuição de cargas

Ao receber a requisição o Balanceador de Cargas repassa essa conexão para uma das máquinas disponíveis no conjunto de recursos. Você disse repassa? Como assim?! É eu disse sim, repassa, mas não é um repassa tipo “toma aêê e se vira que é sua essa requisição”. Funciona assim, antes do Balanceador de Cargas repassar o request ele verifica qual é o algoritmo de distribuição a ser utilizado, baseado em alguns critérios informado na configuração o algoritmo informa, “ o request deve ser encaminhado para o servidor X ou Y.

Esses são alguns exemplo de modelos de algoritmos de distribuição mais utilizados:

  • Round Robin Method

Este método verifica a lista de servidores do conjunto de recursos e envia cada nova solicitação para o próximo servidor, ao final da lista, ele recomeça a distribuição do início. É utilizá-lo quando os servidores são idênticos em termos de hardware.

  • Weighted Round Robin

Este método é bastante semelhante ao Round Robin, ele foi desenvolvido para lidar melhor com servidores que possuem diferentes capacidades de processamento. Cada servidor recebe um peso (um valor multiplicador), isso significa que com pesos maiores recebem proporcionalmente mais novas conexões.

  • Least Connection

Este método direciona o tráfego para o servidor com o menor número de conexões ativas. Essa abordagem é bastante útil quando há um grande número de conexões de cliente persistentes.

  • Source IP Hash

Neste método, um hash do endereço IP do cliente é calculado para redirecionar a solicitação a um servidor, esse cálculo geralmente faz clientes com mesmo IP cair num mesmo servidor, portanto [ATENÇÃO!!].

Conclusão

É importante não esquecer, ao construir uma infraestrutura estamos lidando com recursos finitos. O tamanho do finito depende de empresa para empresa, seja ela uma Startup com orçamento reduzido ou uma big tech do Vale do Silício, as leis da física e as limitações dos recursos computacionais são variáveis que acompanham qualquer time de engenharia de sistemas.

Utilizar o balanceador de cargas tem muitas vantagens poderia listar algumas delas:

  • Segurança, criando um caminho único de comunicação entre o mundo externo e sua aplicação
  • Possibilidade de realizar aumento de capacidade da sua aplicação horizontalmente
  • Fazer manutenção em um hosts específico sem tirar aplicação do ar toda aplicação
  • Filtros de request

O que foi mostrado nesse post é uma forma de fazer distribuição de carga lidando com algo bem específico que são os requests de protocolo HTTP. Existem muitas outras formas e mecanismos de fazer balanceamento de cargas, utilizando a origem geográfica, por grupo de usuário, por tipo de dispositivo (PC, tablet, celular), por tipo de navegador, por atividade de interação com o seu sistema se tipo leitura ou escrita entre muitas outras.

As possibilidades são inúmeras, o segredo é achar o equilíbrio entre a criatividade e a necessidade e recursos disponíveis para construir sua aplicação.

Abraços!

Vida longa e próspera a todos!!

Referências


Eu adoraria ouvir suas outras histórias e situações semelhantes ao que acabei de escrever neste post, você pode me encontrar em @infraascode_br ou linkedin.com/in/leonardoml/ .

Te convido a ver os outros posts do blog Infra-as-Code garanto que tem coisas legais lá!!


--- --- IMPORTANTE --- ---
As opiniões aqui expressas são pessoais e de responsabilidade única e exclusiva do autor, elas não refletem necessariamente a posição das empresas que eu trabalho(ei) e/ou presto(ei) serviço.