O que e balanceamento de carga?
E o componente que distribui requisições entre múltiplos servidores.
Balanceamento de carga, ou load balancing, e a prática de distribuir o tráfego de rede entre múltiplos servidores para evitar que um único servidor fique sobrecarregado enquanto os demais ficam ociosos. O load balancer fica na frente dos servidores e decide para qual deles cada requisição sera encaminhada, com base em um algoritmo de distribuição. Além de distribuir carga, o load balancer também monitora a saude dos servidores (health checks) e remove automaticamente os que estão com falha do pool de destino. O resultado e um sistema mais escalável (adicionar servidores e simples), mais disponível (sem ponto único de falha) e mais resiliente (falhas individuais são transparentes para o usuário). Load balancing e um dos pilares da arquitetura de sistemas em escala.
Por que balanceamento e necessário
Um único servidor tem limite de capacidade que a demanda sempre supera.
Sem balanceamento de carga, escalar um sistema significa colocar um servidor cada vez mais poderoso (scaling vertical), o que tem limites fisicos e custos exponenciais. Com load balancing, você escala horizontalmente, adiciona mais servidores ao pool e o tráfego e distribuído automaticamente entre eles. Isso permite crescimento quase ilimitado e linear em custo. Além do scaling, o load balancer elimina o ponto único de falha: se um servidor cai, o load balancer para de encaminhar tráfego para ele e os usuários continuam sendo atendidos pelos demais sem perceber a falha. Em produção de alta disponibilidade, normalmente o próprio load balancer tem redundância ativa-passiva para não se tornar ele mesmo um ponto único de falha.
Algoritmos de balanceamento
Round Robin, Least Connections e IP Hash servem casos diferentes.
Round Robin e o algoritmo mais simples: distribui requisições sequencialmente entre os servidores (1, 2, 3, 1, 2, 3...). Funciona bem quando todos os servidores tem a mesma capacidade e as requisições tem durações similares. Weighted Round Robin permite atribuir pesos diferentes a servidores de capacidades distintas. Least Connections encaminha cada nova requisição para o servidor com o menor número de conexões ativas no momento. E mais inteligente que Round Robin para workloads onde as requisições tem durações muito variadas, pois evita sobrecarregar um servidor que esta processando requisições lentas. IP Hash garante que o mesmo IP de cliente seja sempre encaminhado para o mesmo servidor, o que e util para aplicações que precisam de sticky sessions sem cookies de sessão.
Layer 4 vs Layer 7
L4 trabalha com TCP/UDP. L7 entende HTTP e pode rotear por URL e header.
Load balancers operam em diferentes camadas do modelo OSI. Layer 4 (transporte) trabalha com conexões TCP/UDP sem inspecionar o conteúdo: roteia baseado em IP de origem, IP de destino e porta. E muito rápido e tem baixo overhead, mas não tem contexto do protocolo da aplicação. Layer 7 (aplicação) entende HTTP, HTTPS, WebSocket e outros protocolos de aplicação. Pode rotear baseado em URL (/api/* para o cluster de API, /static/* para o cluster de assets), headers HTTP, cookies de sessão, metodo HTTP e corpo da requisição. Permite features avançadas como terminação de SSL (o load balancer decifra HTTPS e encaminha HTTP para os backends, simplificando a gestão de certificados), reescrita de headers, e roteamento canary. A maioria dos load balancers modernos como NGINX e AWS ALB opera em Layer 7.
Health checks
Verificação periodica da saude dos servidores permite remoção automática de instâncias com falha.
Health checks são verificações periodicas que o load balancer faz em cada servidor para confirmar que esta saudável e pode receber tráfego. Um health check básico e um ping HTTP para um endpoint /health que retorna 200 se o servidor esta operacional. Health checks mais sofisticados verificam conexão com banco de dados, disponibilidade de cache, uso de memória e outros indicadores de saude da aplicação. Se um servidor falha no health check um número configurado de vezes (threshold), o load balancer o remove do pool e para de encaminhar tráfego para ele. Quando o servidor se recupera e passa nos health checks novamente, e automaticamente readicionado ao pool. Esse mecanismo e o que torna o sistema tolerante a falhas de instâncias individuais sem intervenção manual.
NGINX como load balancer
NGINX e uma das opções mais populares para load balancing de alto desempenho.
NGINX e amplamente usado como load balancer Layer 7 de alto desempenho. A configuração e simples e declarativa: define-se um upstream com os servidores do pool, o algoritmo de balanceamento e os parametros de health check, e o NGINX encaminha o tráfego automaticamente. NGINX suporta Round Robin (padrão), Least Connections, IP Hash e Weighted Round Robin nativamente. Suporta terminação SSL, reescrita de headers e passagem de IP real do cliente via X-Forwarded-For. Para produção de alta disponibilidade, NGINX pode ser configurado em ativo-passivo com Keepalived para um IP virtual que migra automaticamente para o segundo NGINX se o primeiro cair. O NGINX Plus, versão comercial, adiciona health checks ativos, dashboard de status em tempo real e configuração via API sem reload.
Sticky sessions e seus problemas
Sticky sessions comprometem a escalabilidade horizontal, evite quando possível.
Sticky sessions, ou session affinity, e a configuração que garante que um usuário sempre seja encaminhado para o mesmo servidor enquanto sua sessão estiver ativa. E usada quando a aplicação armazena estado de sessão localmente no servidor (carrinhos de compra em memória, arquivos de upload temporários). O problema e que compromete o balanceamento: se o servidor preferido de um usuário estiver sobrecarregado, as requisições dele continuarao indo para la mesmo com outros servidores ociosos. Além disso, se o servidor cai, as sessões armazenadas nele são perdidas. A solução correta não e sticky sessions mas sim sessões stateless: armazenar o estado da sessão em um serviço externo compartilhado como Redis, e qualquer servidor pode atender qualquer usuário. Isso e o que permite scaling horizontal real.
Global load balancing com DNS
DNS pode distribuir tráfego geograficamente para o servidor mais próximo do usuário.
Além de load balancing em um único datacenter, e possível usar DNS para balancear tráfego globalmente entre datacenters em diferentes regiões geograficas. GeoDNS retorna enderecos IP diferentes baseado na localização geografica do resolver DNS do cliente, direcionando usuários da America do Sul para o datacenter em São Paulo e usuários da Europa para o datacenter em Frankfurt. AWS Route 53 suporta roteamento geoproximidade, roteamento por latência (mede a latência real para cada regiao e roteia para a mais rápida) e failover DNS (se o endpoint primário falha no health check, roteia automaticamente para o secundário). Essa combinação de DNS inteligente com load balancers regionais e a base de como grandes plataformas globais mantêm latência baixa para usuários em qualquer parte do mundo.
Exemplo em e-commerce
Como uma plataforma de e-commerce usa load balancing em produção.
Em um e-commerce de medio porte, a arquitetura de load balancing típica tem múltiplas camadas. Na frente, um CDN (Cloudflare) absorve tráfego estatico e ataques DDoS. Atras do CDN, um load balancer Layer 7 (AWS ALB ou NGINX) distribui requisições entre os servidores de aplicação usando Least Connections. Cada servidor de aplicação e stateless, sessões e carrinhos ficam no Redis compartilhado. Health checks verificam a conexão do servidor com o Redis e o banco de dados. Durante a Black Friday, novas instâncias são adicionadas ao pool em minutos via auto scaling group e o load balancer começa a distribiur tráfego para elas imediatamente. Quando o tráfego cai, as instâncias extras são removidas e o pool volta ao tamanho normal, sem nenhuma intervenção manual.
Resumo final
Load balancing e a infraestrutura que torna sistemas escaláveis e resilientes.
Balanceamento de carga e um componente fundamental de qualquer sistema que precisa escalar além de um único servidor. Round Robin funciona para a maioria dos casos. Least Connections e melhor para workloads com duração variável. Layer 7 oferece roteamento inteligente por URL e headers. Health checks garantem que servidores com falha sejam removidos automaticamente. Sticky sessions devem ser evitadas em favor de sessões stateless com Redis. DNS inteligente com GeoDNS permite distribuição global de tráfego. Para começar, NGINX como load balancer e uma excelente escolha: gratuito, alto desempenho, amplamente documentado e usado em produção por empresas de todos os tamanhos. O investimento em load balancing correto e o que transforma um sistema fragil em uma plataforma confiável.
Tutoriais em Video
Latency Numbers Programmer Should Know, ByteByteGo
System Design 101, roadmap.sh
Scaling up to your first 10 million users, AWS re:Invent 2019
CS75 Scalability Harvard Web Development, David Malan
Intro to Architecture and Systems Design Interviews, Jackson Gabbard
System Design for Beginners Course, freeCodeCamp
Conceitos-chave
Load Balancer
Componente que distribui tráfego entre múltiplos servidores, evita sobrecarga de um único servidor
Round Robin
Algoritmo mais simples, distribui sequencialmente entre os servidores, não considera carga atual
Least Connections
Direciona para o servidor com menor número de conexões ativas, mais inteligente para workloads variáveis
Layer 4 vs Layer 7
L4 trabalha com TCP/UDP sem inspecionar conteúdo, L7 entende HTTP, pode rotear por URL, header, cookie
Health Check
Verificar periodicamente se o servidor esta saudável, remover instâncias com falha do pool automaticamente
Sticky Sessions
Manter usuário sempre no mesmo servidor, problema para escalabilidade horizontal, evitar com sessão stateless
No Instagram
@bytebytego
Reels
@bytebytego
No Facebook
No X (Twitter)
O que devs dizem
Migramos de um servidor monolitico gigante para tres servidores menores atras de um NGINX com Least Connections. O custo caiu 40% e a disponibilidade subiu para 99.98%. A primeira vez que um dos servidores reiniciou por atualização e os usuários não perceberam nada foi uma sensação incrível.
O erro que cometemos foi usar sticky sessions por preguica de configurar o Redis. Quando precisamos escalar durante um pico, metade dos usuários ficou presa no mesmo servidor sobrecarregado. Depois de migrar para sessões stateless no Redis, o load balancing passou a funcionar de verdade.
Implementamos GeoDNS com Route 53 para rotear usuários brasileiros para nossa infraestrutura em São Paulo e europeus para Frankfurt. A latência media dos europeus caiu de 280ms para 45ms. Para uma aplicação de tempo real isso foi transformador na retenção de usuários.