DevOps & CI/CD • Nathan Geeksman

Como configurar balanceamento de carga com HAProxy

Introdução

O balanceamento de carga é um mecanismo fundamental para garantir a escalabilidade e a confiabilidade dos aplicativos distribuídos em ambientes de produção. Com a crescente demanda por serviços online e a necessidade de atender a múltiplas solicitações simultâneas, os sistemas precisam ser capazes de lidar com cargas de trabalho variáveis sem comprometer a performance ou a disponibilidade.

O HAProxy é uma solução popular para balanceamento de carga que oferece recursos avançados e flexibilidade para atender às necessidades específicas dos ambientes de produção. No entanto, configurá-lo adequadamente pode ser um desafio, pois requer conhecimento profundo sobre as características do aplicativo e as estratégias de balanceamento de carga mais eficazes.

Este artigo visa fornecer uma visão completa da configuração do HAProxy para balanceamento de carga, abordando aspectos como a arquitetura geral, os principais conceitos, as melhores práticas e exemplos práticos de configuração. Ao final desta leitura, você estará apto a configurar o HAProxy de forma eficaz e aplicá-lo em seus próprios ambientes de desenvolvimento para melhorar a performance e a escalabilidade dos seus sistemas.

O que é e por que importa

O balanceamento de carga (Load Balancing) é um método que distribui as solicitações de acesso a um serviço ou aplicativo entre vários servidores ou instâncias, visando aumentar a capacidade de processamento e melhorar a escalabilidade do sistema. Isso é especialmente importante em ambientes de produção, onde a demanda por serviços pode ser intensa e variável.

Ao usar o HAProxy para balanceamento de carga, você está procurando resolver problemas como:

  • Sobrecarga: quando um servidor ou instância não consegue lidar com a demanda de solicitações, resultando em tempo de resposta lento ou indisponibilidade.
  • Disponibilidade: garantir que o sistema esteja disponível e acessível aos usuários, mesmo em caso de falha de um servidor ou instância.
  • Escalabilidade: permitir que o sistema se adapte a mudanças na demanda de solicitações, sem comprometer a performance ou a experiência do usuário.

O HAProxy é especialmente útil porque oferece recursos avançados como:

  • Distribuição de carga: distribui as solicitações entre vários servidores ou instâncias para evitar sobrecarga.
  • Equilíbrio de carga: equilibra a carga entre os servidores ou instâncias, garantindo que nenhum deles seja sobrecarregado.
  • Roteamento de solicitação: roteia as solicitações para o servidor ou instância mais adequado, baseado em critérios como desempenho, capacidade ou estado.

Com essas características e recursos, o HAProxy pode ajudar a garantir que os sistemas sejam escaláveis, confiáveis e eficientes, mesmo em ambientes de produção intensamente utilizados.

Como funciona na prática

O HAProxy trabalha de acordo com os seguintes passos para realizar o balanceamento de carga:

1. Escaneamento de Servidores

  • O HAProxy escaneia a lista de servidores ou instâncias configuradas para atender às solicitações.
  • Ele verifica o estado atual dos servidores, incluindo informações como disponibilidade e capacidade.

2. Seleção do Servidor mais Adequado

  • Com base nos critérios definidos (como desempenho, capacidade ou estado), o HAProxy seleciona o servidor ou instância mais adequada para atender à solicitação.
  • Se nenhum critério estiver disponível, pode ser escolhido aleatoriamente entre os servidores online.

3. Distribuição da Solicitação

  • O HAProxy distribui a solicitação para o servidor ou instância selecionado.
  • Caso o servidor não esteja disponível, o HAProxy tentará redistribuir a solicitação para outro servidor.

4. Roteamento de Retorno

  • Após o processamento da solicitação pelo servidor, o HAProxy roteia o retorno da resposta para o cliente.
  • Isso pode ser feito com base na origem da requisição ou utilizando um algoritmo específico.

O HAProxy continua a monitorar os servidores e ajusta seu comportamento conforme necessário para garantir a escalabilidade, disponibilidade e desempenho do sistema.

Exemplo real

Vamos configurar um exemplo de HAProxy para balanceamento de carga entre três servidores: servidor01, servidor02 e servidor03.

frontend http
    bind *:80
    mode http
    default_backend servidores

backend servidores
    mode http
    balance roundrobin
    server servidor01 10.0.0.1:80 check inter 2000 rise 2 fall 3
    server servidor02 10.0.0.2:80 check inter 2000 rise 2 fall 3
    server servidor03 10.0.0.3:80 check inter 2000 rise 2 fall 3

map $int_to_str(int(rand(1,10000000) / 10000000)) cookie srv_name
option httpchk GET /healthcheck HTTP/1.1
http-check expect string "OK"

Nesse exemplo, o HAProxy está configurado para escutar na porta 80 e realizar um balanceamento de carga entre os três servidores usando o algoritmo de rodízio (roundrobin). A cada requisição, é escolhido aleatoriamente um dos servidores disponíveis. Além disso, foi definida uma saúde check para verificar se o servidor está funcionando corretamente antes de ser selecionado.

Essa é apenas uma demonstração simples do que pode ser feito com HAProxy para balanceamento de carga. É possível configurar outros algoritmos de seleção e critérios de verificação, dependendo das necessidades específicas da aplicação em produção.

Boas práticas

Monitoramento ativo

  • Verifique regularmente a saúde dos servidores e ajuste as configurações do HAProxy conforme necessário para garantir a disponibilidade e desempenho.
  • Utilize ferramentas de monitoramento, como o Prometheus e Grafana, para visualizar métricas e detectar problemas em tempo real.

Escalabilidade dinâmica

  • Configure o HAProxy para adicionar ou remover servidores do pool com base na demanda atual.
  • Utilize algoritmos de escalonamento automatizado, como o Horizontal Pod Autoscaling (HPA) no Kubernetes, para ajustar automaticamente a quantidade de servidores em funcionamento.

Segurança

  • Atualize regularmente as configurações do HAProxy e os certificados SSL para garantir que todas as conexões sejam criptografadas.
  • Configure o HAProxy para bloquear requisições provenientes de IPs conhecidos como fontes de ataques maliciosos.

Armadilhas comuns

Falta de monitoramento contínuo

  • Os problemas podem ocorrer sem aviso prévio, caso não sejam monitoreados em tempo real.
  • Isso pode resultar em falha do sistema ou perda de dados, o que pode ter consequências graves.

Sobrecarga de rede

  • Se os servidores estiverem sobrecarregados com requisições, isso pode causar lentidão e possivelmente a queda do sistema.
  • Isso pode ser evitado configurando um algoritmo de escalonamento dinâmico para adicionar mais servidores ao pool conforme necessário.

Conclusão

O balanceamento de carga com HAProxy pode ser uma solução robusta para garantir a disponibilidade e desempenho das aplicações em produção. Ao configurar monitoramento ativo, escalabilidade dinâmica e segurança, é possível evitar problemas como falta de monitoramento contínuo e sobrecarga de rede.

Para aprofundar o conhecimento sobre balanceamento de carga com HAProxy, recomenda-se explorar as seguintes áreas:

  • Integração do HAProxy com ferramentas de gerenciamento de contêineres como Docker Swarm ou Kubernetes.
  • Uso de técnicas avançadas de balanceamento de carga, como o Round-Robin com peso dos servidores e o Session Persistence.
  • Configuração de segurança adicional, como autenticação de usuários e controle de acesso a recursos da aplicação.

Referências

<!-- FIM -->