Introdução
O HAProxy, que significa High Availability Proxy, é um popular software de balanceamento de carga TCP/HTTP de código aberto e solução de proxy que pode ser executado no Linux, macOS e FreeBSD. Seu uso mais comum é melhorar o desempenho e a confiabilidade de um ambiente de servidor distribuindo a carga de trabalho entre vários servidores (por exemplo, web, aplicativo, banco de dados). É utilizado em muitos ambientes de alto perfil, incluindo: GitHub, Imgur, Instagram e Twitter.
Neste guia, você obterá uma visão geral do que é o HAProxy, revisará a terminologia de balanceamento de carga e exemplos de como ele pode ser usado para melhorar o desempenho e a confiabilidade do seu próprio ambiente de servidor.
Terminologia do HAProxy
Há muitos termos e conceitos importantes ao discutir balanceamento de carga e proxy. Você revisará os termos comumente usados nas seguintes subseções.
Antes de entrar nos tipos básicos de balanceamento de carga, você deve começar com uma revisão de ACLs, backends e frontends.
Lista de Controle de Acesso (ACL)
Em relação ao balanceamento de carga, ACLs são usadas para testar alguma condição e realizar uma ação (por exemplo, selecionar um servidor, ou bloquear uma solicitação) baseada no resultado do teste. O uso de ACLs permite o encaminhamento flexível do tráfego de rede com base em uma variedade de fatores como correspondência de padrões e o número de conexões para um servidor de backend, por exemplo.
Exemplo de uma ACL:
acl url_blog path_beg /blog
Esta ACL é correspondida se o caminho de uma solicitação do usuário começa com /blog
. Isso corresponderia a uma solicitação de http://seudominio.com/blog/entrada-de-blog-1
, por exemplo.
Para um guia detalhado sobre o uso de ACLs, confira o Manual de Configuração do HAProxy.
Backend
A backend is a set of servers that receives forwarded requests. Backends are defined in the backend section of the HAProxy configuration. In its most basic form, a backend can be defined by:
- qual algoritmo de balanceamento de carga usar
- a list of servers and ports
A backend can contain one or many servers in it. Generally speaking, adding more servers to your backend will increase your potential load capacity by spreading the load over multiple servers. Increased reliability is also achieved through this manner, in case some of your backend servers become unavailable.
Aqui está um exemplo de uma configuração de dois backends, web-backend
e blog-backend
com dois servidores web em cada, ouvindo na porta 80:
backend web-backend
balance roundrobin
server web1 web1.yourdomain.com:80 check
server web2 web2.yourdomain.com:80 check
backend blog-backend
balance roundrobin
mode http
server blog1 blog1.yourdomain.com:80 check
server blog1 blog1.yourdomain.com:80 check
A linha balance roundrobin
especifica o algoritmo de balanceamento de carga, que é detalhado na seção Algoritmos de Balanceamento de Carga.
mode http
especifica que será utilizado o balanceamento de carga na camada 7, o que é explicado na seção Tipos de Balanceamento de Carga.
A opção check
no final das diretivas server
especifica que verificações de saúde devem ser realizadas nesses servidores de backend.
Frontend
A frontend defines how requests should be forwarded to backends. Frontends are defined in the frontend
section of the HAProxy configuration. Their definitions are composed of the following components:
- a set of IP addresses and a port (e.g. 10.1.1.7:80, *:443, etc.)
- ACLs
- Regras
use_backend
, que definem quais backends usar dependendo das condições de ACL correspondidas, e/ou uma regradefault_backend
que trata todos os outros casos
A frontend can be configured to various types of network traffic, as explained in the next section.
Tipos de Balanceamento de Carga
Agora que você entende os componentes básicos utilizados no balanceamento de carga, pode passar para os tipos básicos de balanceamento de carga.
Sem Balanceamento de Carga
A simple web application environment with no load balancing might look like the following:

Neste exemplo, o usuário se conecta diretamente ao seu servidor web, em yourdomain.com
e não há balanceamento de carga. Se o seu único servidor web cair, o usuário não poderá mais acessar seu servidor web. Além disso, se muitos usuários estiverem tentando acessar seu servidor simultaneamente e ele não conseguir lidar com a carga, eles podem ter uma experiência lenta ou podem não conseguir se conectar de forma alguma.
Balanceamento de Carga na Camada 4
A maneira mais simples de balancear o tráfego de rede para vários servidores é usar o balanceamento de carga na camada 4 (camada de transporte). O balanceamento de carga dessa maneira encaminhará o tráfego do usuário com base no intervalo de IP e na porta (ou seja, se uma solicitação chegar para http://yourdomain.com/anything
, o tráfego será encaminhado para o backend que lida com todas as solicitações para yourdomain.com
na porta 80
). Para mais detalhes sobre a camada 4, confira a subseção TCP do nosso Introdução a Redes.
Aqui está um diagrama de um exemplo simples de balanceamento de carga na camada 4:

O usuário acessa o balanceador de carga, que encaminha a solicitação do usuário para o grupo de servidores de backend web-backend. Qualquer servidor de backend selecionado responderá diretamente à solicitação do usuário. Geralmente, todos os servidores no web-backend devem estar servindo conteúdo idêntico – caso contrário, o usuário pode receber conteúdo inconsistente. Observe que ambos os servidores web se conectam ao mesmo servidor de banco de dados.
Balanceamento de Carga na Camada 7
Outra maneira mais complexa de balancear o tráfego de rede é usar o balanceamento de carga na camada 7 (camada de aplicação). Usar a camada 7 permite que o balanceador de carga encaminhe solicitações para diferentes servidores de backend com base no conteúdo da solicitação do usuário. Este modo de balanceamento de carga permite que você execute vários servidores de aplicativos da web sob o mesmo domínio e porta. Para mais detalhes sobre a camada 7, confira a subseção HTTP de nossa Introdução às Redes.
Aqui está um diagrama de um exemplo simples de balanceamento de carga na camada 7:

Neste exemplo, se um usuário solicitar seudominio.com/blog
, eles são encaminhados para o backend blog, que é um conjunto de servidores que executam um aplicativo de blog. Outras solicitações são encaminhadas para web-backend, que pode estar executando outro aplicativo. Ambos os backends usam o mesmo servidor de banco de dados, neste exemplo.
A snippet of the example frontend configuration would look like this:
frontend http
bind *:80
mode http
acl url_blog path_beg /blog
use_backend blog-backend if url_blog
default_backend web-backend
Isso configura um frontend chamado http
, que lida com todo o tráfego de entrada na porta 80.
acl url_blog path_beg /blog
corresponde a uma solicitação se o caminho da solicitação do usuário começa com /blog
.
use_backend blog-backend if url_blog
usa o ACL para encaminhar o tráfego para blog-backend
.
default_backend web-backend
especifica que todo o tráfego restante será encaminhado para web-backend
.
Algoritmos de Balanceamento de Carga
O algoritmo de balanceamento de carga utilizado determina qual servidor, em um backend, será selecionado durante o balanceamento de carga. O HAProxy oferece várias opções de algoritmos. Além do algoritmo de balanceamento de carga, os servidores podem ser atribuídos a um parâmetro de peso para manipular com que frequência o servidor é selecionado, em comparação com outros servidores.
A few of the commonly used algorithms are as follows:
roundrobin
O Round Robin seleciona os servidores por turnos. Este é o algoritmo padrão.
leastconn
Seleciona o servidor com o menor número de conexões. Isso é recomendado para sessões mais longas. Servidores no mesmo backend também são girados em um ciclo de rotação.
fonte
Isso seleciona qual servidor usar com base em um hash do endereço IP de origem que os usuários estão fazendo solicitações. Este método garante que os mesmos usuários se conectem aos mesmos servidores.
Sessões Fixas
Algumas aplicações exigem que um usuário continue se conectando ao mesmo servidor de backend. Isso pode ser alcançado através de sessões fixas, usando o parâmetro appsession
no backend que requer isso.
Verificação de Saúde
O HAProxy usa verificações de saúde para determinar se um servidor de backend está disponível para processar solicitações. Isso evita ter que remover manualmente um servidor do backend se ele se tornar indisponível. A verificação de saúde padrão é tentar estabelecer uma conexão TCP com o servidor.
Se um servidor falha em uma verificação de saúde e, portanto, não consegue atender às solicitações, ele é automaticamente desativado no backend, e o tráfego não será encaminhado para ele até que se torne saudável novamente. Se todos os servidores em um backend falharem, o serviço ficará indisponível até que pelo menos um desses servidores do backend se torne saudável novamente.
Para certos tipos de backends, como servidores de banco de dados, a verificação de saúde padrão não é necessariamente para determinar se um servidor ainda está saudável.
O servidor web Nginx também pode ser usado como um servidor proxy autônomo ou balanceador de carga, e é frequentemente usado em conjunto com o HAProxy por suas capacidades de cache e compressão.
Alta Disponibilidade
As configurações de balanceamento de carga de camada 4 e 7 descritas neste tutorial usam um balanceador de carga para direcionar o tráfego para um dos muitos servidores de backend. No entanto, o seu balanceador de carga é um ponto único de falha nessas configurações; se ele cair ou ficar sobrecarregado com solicitações, pode causar alta latência ou tempo de inatividade para o seu serviço.
A high availability (HA) setup is broadly defined as infrastructure without a single point of failure. It prevents a single server failure from being a downtime event by adding redundancy to every layer of your architecture. A load balancer facilitates redundancy for the backend layer (web/app servers), but for a true high availability setup, you need to have redundant load balancers as well.
Aqui está um diagrama de uma configuração de alta disponibilidade:
Neste exemplo, você tem vários balanceadores de carga (um ativo e um ou mais passivos) atrás de um endereço IP estático que pode ser remapeado de um servidor para outro. Quando um usuário acessa seu site, a solicitação passa pelo endereço IP externo para o balanceador de carga ativo. Se esse balanceador de carga falhar, seu mecanismo de failover detectará e reatribuirá automaticamente o endereço IP para um dos servidores passivos. Existem várias maneiras diferentes de implementar uma configuração HA ativa/passiva. Para saber mais, leia Como Usar IPs Reservados.
Conclusão
Agora que você tem uma compreensão do balanceamento de carga e sabe como usar o HAProxy, você tem uma base sólida para começar a melhorar o desempenho e a confiabilidade do seu próprio ambiente de servidor.
Se você estiver interessado em armazenar a saída do HAProxy para visualização posterior, confira Como Configurar o Registro do HAProxy com Rsyslog no CentOS 8 [Inicialização Rápida]
Se você está procurando resolver um problema, confira Erros Comuns do HAProxy. Se for necessário um diagnóstico mais aprofundado, dê uma olhada em Como Diagnosticar Erros Comuns do HAProxy.