15%

Poupe 15% em todos os serviços

Teste as suas habilidades e obtenha Desconto em qualquer plano

Utilizar o código:

Skills
Começar a trabalhar
23.10.2024

Balanceamento de Carga com Servidores Dedicados: Arquitetura, Algoritmos e Implementação no Mundo Real

O balanceamento de carga é o processo de distribuição do tráfego de rede recebido por vários servidores, de modo que nenhum nó único se torne um gargalo, garantindo desempenho consistente, tolerância a falhas e escalabilidade horizontal. Num ambiente de servidor dedicado, um balanceador de carga fica à frente do seu conjunto de servidores e toma decisões de roteamento em tempo real com base na integridade do servidor, conexões ativas, latência de resposta ou regras de política personalizadas.

Para qualquer infraestrutura que execute cargas de trabalho sensíveis à latência — plataformas de e-commerce, aplicações SaaS, APIs de alto tráfego ou streaming de mídia — o balanceamento de carga não é opcional. É a base arquitetural que separa uma configuração frágil com ponto único de falha de um sistema resiliente e adequado para produção.

Como o Balanceamento de Carga Realmente Funciona: O Fluxo Técnico

Compreender o balanceamento de carga requer entender o ciclo de vida completo de uma requisição, não apenas o conceito abstrato de "distribuição de tráfego."

O Pipeline de Roteamento de Requisições

  1. A resolução DNS aponta o cliente para o endereço IP do balanceador de carga (ou um IP virtual numa configuração anycast), não para nenhum servidor individual.
  2. O balanceador de carga recebe a conexão na Camada 4 (TCP/UDP) ou Camada 7 (HTTP/HTTPS) do modelo OSI.
  3. O balanceador avalia a sua tabela de roteamento, aplica o algoritmo configurado e verifica o estado de integridade atual de cada nó de backend.
  4. A requisição é encaminhada para o servidor de backend selecionado. Dependendo do modo (NAT, Direct Server Return ou tunelamento IP), o caminho de resposta pode ou não retornar pelo balanceador.
  5. Daemons de verificação de integridade são executados em paralelo, sondando continuamente cada backend via TCP ping, códigos de status HTTP ou scripts personalizados. Um nó com falha é removido do conjunto em segundos.

Balanceamento de Carga na Camada 4 vs. Camada 7

Esta distinção é uma das decisões arquiteturais mais importantes que você tomará.

FuncionalidadeCamada 4 (Transporte)Camada 7 (Aplicação)
Opera emPacotes TCP/UDPRequisições HTTP/HTTPS, cabeçalhos, cookies
Lógica de roteamentoEndereço IP + portaCaminho URL, hostname, valor de cookie, conteúdo de cabeçalho
Terminação SSLNão (pass-through)Sim (descarrega TLS dos backends)
Roteamento baseado em conteúdoNão é possívelSuporte completo (rotear /api/ de forma diferente de /static/)
Sobrecarga de desempenhoMuito baixaModerada (inspeção profunda de pacotes necessária)
Casos de uso típicosServiços TCP brutos, bases de dados, servidores de jogosAplicações web, REST APIs, microsserviços
Software de exemploHAProxy (modo TCP), LVS/IPVSNGINX, HAProxy (modo HTTP), Traefik, Envoy
Persistência de sessãoHash de IP de origemInjeção de cookie, afinidade baseada em cabeçalho

Para a maioria das aplicações web hospedadas em Servidores Dedicados, a Camada 7 é a escolha correta porque permite roteamento inteligente, descarregamento SSL e verificações de integridade granulares baseadas em códigos de resposta HTTP em vez de conectividade TCP bruta.

Algoritmos de Balanceamento de Carga: Escolhendo a Estratégia Certa

O algoritmo determina qual servidor de backend recebe cada requisição recebida. Escolher o errado para o seu perfil de carga de trabalho é uma fonte comum de utilização desigual de recursos.

Round Robin

As requisições são distribuídas sequencialmente por todos os nós saudáveis. Simples e eficaz quando todos os servidores têm especificações de hardware idênticas e os tempos de processamento de requisições são aproximadamente iguais.

Armadilha: Se uma requisição leva 10 segundos e a próxima leva 10 milissegundos, o round robin não considera essa disparidade. Um backend lento acumula uma fila enquanto os outros ficam ociosos.

Weighted Round Robin

Cada servidor recebe um peso numérico. Um servidor com peso 3 recebe três vezes mais requisições do que um com peso 1. Use isto quando o seu conjunto contém hardware heterogéneo — por exemplo, misturando um nó de 32 núcleos com um nó de 16 núcleos.

Least Connections

O balanceador rastreia o número de conexões ativas para cada backend e encaminha novas requisições para o servidor com menos conexões abertas. Este é o algoritmo padrão mais adequado para cargas de trabalho com durações de requisição variáveis, como aplicações web com base de dados.

Least Response Time

Uma extensão do least connections que também considera a latência medida do backend. O servidor com a menor combinação de conexões ativas e tempo médio de resposta vence. Isto requer que o balanceador mantenha métricas de latência, o que adiciona uma sobrecarga mínima, mas melhora significativamente a qualidade da distribuição sob carga mista.

IP Hash (Afinidade de Origem)

O endereço IP de origem do cliente é processado por hash para selecionar deterministicamente um backend. O mesmo cliente sempre alcança o mesmo servidor, desde que a composição do conjunto não mude. Isto fornece uma forma primitiva de persistência de sessão sem exigir armazenamento de sessão partilhado.

Caso extremo crítico: Se uma grande parte do seu tráfego se originar por trás de um NAT corporativo ou de um gateway de operadora móvel, milhares de utilizadores podem partilhar um único IP de origem, causando um desequilíbrio grave. Audite sempre a distribuição do seu tráfego antes de confiar no IP hash em produção.

Random with Two Choices (Power of Two)

O balanceador seleciona aleatoriamente dois servidores candidatos e encaminha para aquele com menos conexões ativas. Esta abordagem probabilística escala extremamente bem em grandes conjuntos (50+ nós) porque evita a sobrecarga de coordenação de uma varredura global de least-connections, ao mesmo tempo que evita o pior caso de desequilíbrio da seleção puramente aleatória.

Persistência de Sessão: Quando Stateless Não É uma Opção

Muitas aplicações legadas armazenam o estado da sessão localmente no servidor (por exemplo, $_SESSION PHP gravados em disco). Nestes casos, encaminhar um utilizador que retorna para um backend diferente causa uma perda de sessão, que se manifesta como logouts inesperados ou perda de dados do carrinho de compras.

Os balanceadores de carga resolvem isto com sticky sessions, implementadas via:

  • Injeção de cookie: O balanceador injeta um cookie (por exemplo, SERVERID=node2) na resposta HTTP. Requisições subsequentes desse cliente carregam o cookie, e o balanceador lê-o para encaminhar de volta ao mesmo nó.
  • Afinidade de IP de origem: Conforme descrito acima, menos confiável, mas não requer suporte a cookies da aplicação.

A correção correta a longo prazo é externalizar o armazenamento de sessão para um backend partilhado — Redis ou Memcached — para que qualquer nó de backend possa servir qualquer utilizador. Isto elimina completamente a dependência de sticky sessions e torna o seu conjunto totalmente stateless, o que simplifica dramaticamente o escalonamento e o failover. Se estiver a construir uma nova aplicação, projete para backends stateless desde o primeiro dia.

Verificações de Integridade: O Mecanismo por Trás do Failover Automático

Um balanceador de carga é tão confiável quanto a sua configuração de verificação de integridade. Verificações de integridade mal configuradas são responsáveis por uma proporção significativa de incidentes reais com balanceadores de carga.

Tipos de Verificação de Integridade

  • Verificação TCP: Abre uma conexão TCP para a porta do backend. Confirma que o processo está a escutar, mas não verifica a correção ao nível da aplicação.
  • Verificação HTTP/HTTPS: Envia uma requisição HTTP para um endpoint definido (por exemplo, /health) e espera um código de status específico (tipicamente 200 OK). Este é o padrão mínimo aceitável para aplicações web.
  • Verificação por script personalizado: Executa um script arbitrário que pode consultar uma base de dados, verificar espaço em disco ou validar o estado da aplicação. Retorna 0 para saudável, diferente de zero para não saudável.

Parâmetros de Configuração Críticos

  • interval: Com que frequência a verificação é executada (por exemplo, a cada 5 segundos).
  • timeout: Quanto tempo aguardar por uma resposta antes de marcar a verificação como falhada.
  • rise: Número de verificações bem-sucedidas consecutivas necessárias para marcar um nó como saudável (evita oscilações).
  • fall: Número de verificações falhadas consecutivas necessárias para remover um nó do conjunto.

Uma configuração de produção comum para HAProxy tem este aspeto:

backend web_servers
    balance leastconn
    option httpchk GET /health HTTP/1.1rnHost: example.com
    http-check expect status 200
    default-server inter 5s fall 3 rise 2 slowstart 60s
    server node1 192.168.1.10:80 check weight 10
    server node2 192.168.1.11:80 check weight 10
    server node3 192.168.1.12:80 check weight 5

A diretiva slowstart 60s é particularmente valiosa: aumenta gradualmente o tráfego para um nó recentemente recuperado ao longo de 60 segundos, em vez de enviar imediatamente a carga total, evitando um problema de thundering herd quando um backend volta a ficar online após manutenção.

Terminação SSL e Descarregamento TLS

Lidar com encriptação e desencriptação TLS é computacionalmente dispendioso. Numa configuração ingénua, cada servidor de backend realiza este trabalho de forma independente. A terminação SSL no balanceador de carga significa que o balanceador desencripta o tráfego HTTPS recebido e encaminha HTTP simples para os backends através de uma rede interna confiável.

Benefícios:

  • Reduz a carga de CPU nos servidores de backend, libertando ciclos para a lógica da aplicação.
  • Centraliza a gestão de certificados — renove um certificado no balanceador em vez de em cada nó.
  • Permite a inspeção de Camada 7 do conteúdo das requisições (impossível com pass-through encriptado).

Consideração de segurança: O tráfego entre o balanceador de carga e os backends viaja sem encriptação. Isto é aceitável quando todos os nós estão numa VLAN privada isolada ou numa rede de gestão dedicada. Se os seus requisitos de conformidade (PCI-DSS, HIPAA) exigirem encriptação de ponta a ponta, use re-encriptação SSL: o balanceador termina a sessão TLS voltada para o cliente e estabelece uma nova sessão TLS para cada backend. Isto mantém a encriptação completa enquanto ainda permite o roteamento de Camada 7.

Combinar a terminação SSL com Certificados SSL devidamente emitidos garante que a sua infraestrutura com balanceamento de carga cumpre tanto os requisitos de desempenho como de conformidade.

Alta Disponibilidade para o Próprio Balanceador de Carga

Um balanceador de carga que é em si mesmo um ponto único de falha derrota o propósito de toda a arquitetura. As implementações em produção requerem um par de balanceadores de carga de alta disponibilidade.

Ativo-Passivo com VRRP/Keepalived

Dois nós de balanceador de carga partilham um IP Virtual (VIP). O nó ativo detém o VIP e processa todo o tráfego. O nó passivo monitoriza o nó ativo via heartbeat. Se o nó ativo falhar, keepalived aciona um failover VRRP e o nó passivo reivindica o VIP em 1 a 3 segundos.

# Install keepalived on both load balancer nodes (Debian/Ubuntu)
apt-get install keepalived

# /etc/keepalived/keepalived.conf on the MASTER node
vrrp_instance VI_1 {
    state MASTER
    interface eth0
    virtual_router_id 51
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass securepassword
    }
    virtual_ipaddress {
        203.0.113.10/24
    }
}

No nó de backup, defina state BACKUP e priority 90. O nó com a prioridade mais alta vence a eleição do VIP.

Ativo-Ativo com DNS Round Robin ou Anycast

Ambos os nós do balanceador de carga processam tráfego ativamente em simultâneo. O DNS retorna múltiplos registos A, distribuindo clientes por ambos os balanceadores. Isto duplica a capacidade de throughput, mas requer uma sincronização cuidadosa do estado se usar sticky sessions.

Para implementações de grande escala em Servidores Dedicados, uma configuração ativo-ativo com roteamento BGP anycast fornece o maior throughput e redundância geográfica.

Mitigação de DDoS na Camada do Balanceador de Carga

Um balanceador de carga posicionado na borda da rede é um local natural para implementar filtragem de tráfego e limitação de taxa antes que requisições maliciosas alcancem os seus servidores de aplicação.

Limitação de Taxa de Conexão (HAProxy)

frontend http_in
    bind *:80
    bind *:443 ssl crt /etc/haproxy/certs/
    stick-table type ip size 100k expire 30s store conn_rate(3s),http_req_rate(10s)
    tcp-request connection track-sc0 src
    tcp-request connection reject if { sc_conn_rate(0) gt 100 }
    http-request deny if { sc_http_req_rate(0) gt 300 }

Esta configuração rastreia taxas de conexão por IP de origem numa stick table e rejeita clientes que excedam 100 novas conexões TCP por 3 segundos ou 300 requisições HTTP por 10 segundos — limites que bloqueiam a maioria dos ataques de flood HTTP volumétrico enquanto permitem tráfego de burst legítimo.

Proteção contra SYN Flood

Ative SYN cookies ao nível do kernel nos seus nós de balanceador de carga para lidar com ataques SYN flood sem esgotar a tabela de conexões:

sysctl -w net.ipv4.tcp_syncookies=1
sysctl -w net.ipv4.tcp_max_syn_backlog=4096
sysctl -w net.ipv4.tcp_synack_retries=2

Torne estas configurações persistentes adicionando-as a /etc/sysctl.conf.

NGINX como Balanceador de Carga de Camada 7: Configuração de Produção

NGINX é uma opção amplamente utilizada para balanceamento de carga HTTP, particularmente quando necessita de integração estreita com funcionalidades ao nível da aplicação.

upstream backend_pool {
    least_conn;
    keepalive 32;

    server 192.168.1.10:8080 weight=3 max_fails=3 fail_timeout=30s;
    server 192.168.1.11:8080 weight=3 max_fails=3 fail_timeout=30s;
    server 192.168.1.12:8080 weight=1 max_fails=3 fail_timeout=30s;
    server 192.168.1.13:8080 backup;
}

server {
    listen 443 ssl http2;
    server_name example.com;

    ssl_certificate     /etc/nginx/ssl/example.com.crt;
    ssl_certificate_key /etc/nginx/ssl/example.com.key;
    ssl_protocols       TLSv1.2 TLSv1.3;
    ssl_ciphers         HIGH:!aNULL:!MD5;

    location / {
        proxy_pass         http://backend_pool;
        proxy_http_version 1.1;
        proxy_set_header   Connection "";
        proxy_set_header   Host $host;
        proxy_set_header   X-Real-IP $remote_addr;
        proxy_set_header   X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header   X-Forwarded-Proto $scheme;
        proxy_connect_timeout 5s;
        proxy_read_timeout    60s;
        proxy_next_upstream   error timeout http_502 http_503;
    }
}

Detalhes importantes nesta configuração:

  • keepalive 32 mantém conexões persistentes para os backends, eliminando a sobrecarga do handshake TCP para requisições de alta frequência.
  • proxy_next_upstream tenta automaticamente novamente requisições falhadas no próximo backend saudável.
  • A diretiva backup designa node4 como um standby que só recebe tráfego quando todos os nós primários estão indisponíveis.
  • X-Forwarded-For garante que as aplicações de backend vejam o IP real do cliente em vez do IP do balanceador.

Comparação de Opções de Software de Balanceador de Carga

SoftwareCamadaDesempenhoTerminação SSLVerificações de Integridade AtivasFacilidade de ConfiguraçãoMelhor Para
HAProxyL4 + L7Extremamente altoSimSim (avançado)ModeradaTCP/HTTP de alto tráfego, ACLs detalhadas
NGINXL7 (L4 no módulo stream)Muito altoSimBásico (NGINX Plus para avançado)FácilProxy web/API, servidor web integrado
TraefikL7AltoSim (Let’s Encrypt automático)SimMuito fácilAmbientes em contentores, Kubernetes
EnvoyL7Muito altoSimSim (verificações de integridade gRPC)ComplexaService mesh, microsserviços
LVS/IPVSL4Nível de kernel, máximoNãoVia KeepalivedComplexaThroughput bruto, cenários de kernel-bypass
AWS ALB/NLBL7/L4GeridoSimSimFácil (gerido)Cloud-native, sem autogestão

Para Servidores Dedicados autogeridos, HAProxy e NGINX cobrem a grande maioria dos casos de uso em produção. Traefik é a escolha pragmática para cargas de trabalho Docker Swarm ou Kubernetes devido à sua descoberta automática de serviços.

Arquitetura do Mundo Real: Plataforma de E-Commerce sob Carga de Pico

Considere um cenário concreto: uma plataforma de e-commerce que espera 50.000 utilizadores simultâneos durante um evento promocional.

Layout da infraestrutura:

  • 2x nós HAProxy em configuração ativo-passivo partilhando um VIP (via Keepalived)
  • 6x servidores de aplicação a executar a camada web
  • 2x servidores de base de dados dedicados (não no conjunto do balanceador de carga — usam a sua própria replicação)
  • 1x cluster Redis para armazenamento de sessão partilhado (eliminando a dependência de sticky session)
  • NFS partilhado ou armazenamento de objetos para ativos carregados pelos utilizadores

Fluxo de tráfego:

  1. O DNS do cliente resolve para o VIP detido pelo nó HAProxy ativo.
  2. O HAProxy aplica o algoritmo leastconn, distribuindo requisições pelos 6 servidores de aplicação.
  3. Cada servidor de aplicação lê/escreve dados de sessão do Redis — não é necessária afinidade de sessão.
  4. Os ativos estáticos são servidos diretamente do armazenamento de objetos via CDN, contornando completamente o balanceador de carga e reduzindo a sua carga em 60–70%.
  5. Se a verificação de integridade de um servidor de aplicação falhar três vezes consecutivas, o HAProxy remove-o do conjunto em 15 segundos. Os 5 servidores restantes absorvem o seu tráfego.
  6. Se o nó HAProxy ativo falhar, o Keepalived transfere o VIP para o nó passivo em 2 segundos — transparente para todos os clientes.

Esta arquitetura lida com o pico promocional sem que nenhum componente único se torne um gargalo, e escala horizontalmente adicionando mais servidores de aplicação ao conjunto HAProxy sem tempo de inatividade.

Se estiver a executar cargas de trabalho de inferência aceleradas por GPU por trás de um balanceador de carga — por exemplo, distribuindo requisições de serviço de modelos ML — os mesmos princípios se aplicam, mas as verificações de integridade do backend devem validar a disponibilidade da GPU e a margem de VRAM, não apenas a acessibilidade HTTP. A infraestrutura de GPU Hosting beneficia significativamente do balanceamento de least-response-time devido à alta variância na latência de inferência entre diferentes tipos de requisição.

Monitorização de uma Infraestrutura com Balanceamento de Carga

Implementar um balanceador de carga sem observabilidade é operar às cegas. Estas são as métricas que importam:

  • Conexões ativas por backend: Revela desequilíbrio no algoritmo de distribuição ou concentração de sticky session.
  • Taxa de requisições (RPS) por backend: Deve ser proporcional aos pesos do servidor.
  • Tempo de resposta do backend (p50, p95, p99): Picos de latência p99 num nó indicam um problema antes que as verificações de integridade sejam acionadas.
  • Taxa de falha de verificação de integridade: Um backend que oscila entre saudável e não saudável (flapping) indica uma instabilidade subjacente que precisa de investigação.
  • Profundidade da fila de conexões: Se a fila do balanceador crescer, o seu conjunto de backends está subdimensionado para o tráfego atual.
  • Taxa de handshake SSL: Taxas elevadas indicam um potencial ataque de esgotamento TLS ou um cliente mal configurado a tentar novamente de forma agressiva.

O HAProxy expõe uma página de estatísticas (ative com stats enable no frontend) e um socket Unix para consultas programáticas. Alimente estas métricas no Prometheus via haproxy_exporter e visualize no Grafana para uma pilha de observabilidade completa.

Lista de Verificação de Decisão Prática

Use esta matriz antes de implementar ou modificar uma arquitetura com balanceamento de carga:

  • Aplicação stateful? Migre o armazenamento de sessão para Redis ou Memcached antes de ativar o balanceamento de carga. Não confie em sticky sessions como solução permanente.
  • TLS necessário? Termine o SSL no balanceador de carga. Certifique-se de que a rede de backend está isolada. Obtenha e gira certificados centralmente via Certificados SSL.
  • Duração de requisição variável? Use leastconn, não round robin.
  • Hardware heterogéneo? Aplique valores weight proporcionais à capacidade do servidor.
  • HA do balanceador de carga? Implemente dois nós de balanceador com Keepalived/VRRP. Nunca execute um único balanceador de carga em produção.
  • Exposição a DDoS? Implemente limitação de taxa de conexão e proteção de SYN cookie nas camadas do kernel e do balanceador.
  • Profundidade da verificação de integridade? Use verificações HTTP contra um endpoint /health dedicado que valide a conectividade da base de dados, não apenas a disponibilidade da porta TCP.
  • Plano de escalonamento? Adicionar um novo nó de backend a um conjunto HAProxy ou NGINX requer um recarregamento de configuração (haproxy -sf $(cat /var/run/haproxy.pid) para recarregamento sem tempo de inatividade) — planeie o seu processo de gestão de mudanças em conformidade.
  • Monitorização? Instrumente HAProxy ou NGINX com exportadores Prometheus antes do go-live, não após um incidente.
  • Preferência de painel de controlo? Se preferir gestão de servidor baseada em GUI juntamente com configuração manual do balanceador de carga, avalie Painéis de Controlo VPS para tarefas administrativas em nós individuais.

FAQ

Qual é a diferença entre um balanceador de carga e um proxy reverso?

Um proxy reverso encaminha requisições de clientes para um ou mais servidores de backend e retorna a resposta ao cliente — trata do roteamento, cache e terminação SSL. Um balanceador de carga é um tipo específico de proxy reverso cuja função principal é distribuir requisições por múltiplos backends usando um algoritmo definido. Todos os balanceadores de carga são proxies reversos, mas nem todos os proxies reversos realizam balanceamento de carga.

O balanceamento de carga pode funcionar com um único servidor dedicado?

Tecnicamente sim — pode executar um balanceador de carga à frente de um único servidor para terminação SSL, cache e limitação de taxa. No entanto, os benefícios de tolerância a falhas e escalonamento horizontal só se materializam com dois ou mais nós de backend. Uma configuração de servidor único por trás de um balanceador de carga é uma arquitetura de transição válida que torna o escalonamento futuro operacionalmente trivial.

Como é que um balanceador de carga lida com conexões WebSocket?

Os WebSockets requerem conexões TCP persistentes e de longa duração. Os balanceadores de carga de Camada 7 devem ser explicitamente configurados para lidar com o handshake HTTP Upgrade e depois manter a afinidade de conexão durante a sessão WebSocket. No NGINX, defina proxy_http_version 1.1 e proxy_set_header Upgrade $http_upgrade com proxy_set_header Connection "upgrade". No HAProxy, use option http-server-close e configure valores de timeout apropriados (timeout tunnel 1h para conexões de longa duração).

O que acontece às requisições em curso quando um servidor de backend falha?

Com proxy_next_upstream no NGINX ou retries no HAProxy, o balanceador deteta um erro de conexão ou timeout na primeira tentativa e imediatamente tenta novamente a requisição no próximo backend saudável. Esta nova tentativa é transparente para o cliente. Requisições idempotentes (GET, HEAD) são seguras para tentar novamente automaticamente. Requisições não idempotentes (POST, PUT) devem ser tentadas novamente com cautela — configure proxy_next_upstream para excluir http_500 para rotas POST para evitar o processamento duplo de um pagamento ou envio de formulário.

Quantos servidores de backend são necessários antes que o balanceamento de carga forneça um benefício significativo?

Dois servidores fornecem capacidade imediata de failover e aproximadamente o dobro da capacidade. Três ou mais servidores fornecem distribuição estatística significativa e permitem manutenção contínua (colocar um nó offline para atualizações enquanto os outros absorvem o tráfego). Para cargas de trabalho em produção, três nós é o mínimo prático para um conjunto resiliente — dois nós significa que uma única falha reduz a sua capacidade em 50%, o que pode violar o seu SLA de desempenho sob carga de pico.

15%

Poupe 15% em todos os serviços

Teste as suas habilidades e obtenha Desconto em qualquer plano

Utilizar o código:

Skills
Começar a trabalhar