Uma Introdução ao HAProxy e Conceitos de Balanceamento de Carga

Introdução

O HAProxy, que significa High Availability Proxy, é uma solução popular de balanceador de carga TCP/HTTP e de proxy de código aberto que pode ser executada 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, aplicação, banco de dados). É utilizado em muitos ambientes de alto perfil, incluindo: GitHub, Imgur, Instagram e Twitter.

Neste guia, você terá uma visão geral do que é o HAProxy, revisará a terminologia de balanceamento de carga e verá 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ê vai revisar os termos comumente utilizados nas seguintes subseções.

Antes de abordar os 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, as ACLs são usadas para testar alguma condição e realizar uma ação (por exemplo, selecionar um servidor ou bloquear uma solicitação) com base 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 com um backend, por exemplo.

Exemplo de uma ACL:

acl url_blog path_beg /blog

Esta ACL é correspondida se o caminho da solicitação do usuário começar com /blog. Isso corresponderia a uma solicitação como 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 configuração de dois backends, web-backend e blog-backend, com dois servidores web em cada um, 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 de Algoritmos de Balanceamento de Carga.

modo http especifica que será utilizado o balanceamento de proxy de 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 da ACL correspondidas, e/ou uma regra default_backend que lida com 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ê tem uma compreensão dos componentes básicos usados 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:

No Load Balancing

Neste exemplo, o usuário se conecta diretamente ao seu servidor web, em seudominio.com e não há balanceamento de carga. Se o seu único servidor web cair, o usuário não poderá mais acessar o 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 desta forma encaminhará o tráfego do usuário com base no intervalo de IP e na porta (ou seja, se uma solicitação entrar para http://seudominio.com/qualquercoisa, o tráfego será encaminhado para o backend que lida com todas as solicitações para seudominio.com na porta 80). Para mais detalhes sobre a camada 4, confira a subseção TCP da nossa Introdução à Rede.

Aqui está um diagrama de um exemplo simples de balanceamento de carga na camada 4:

Layer 4 Load Balancing

O usuário acessa o balanceador de carga, que encaminha a solicitação do usuário para o grupo de servidores web-backend dos servidores back-end. Qualquer servidor back-end selecionado responderá diretamente à solicitação do usuário. Geralmente, todos os servidores no grupo web-backend devem estar servindo conteúdo idêntico – caso contrário, o usuário pode receber conteúdo inconsistente. Note 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 aplicativo). Usar a camada 7 permite que o balanceador de carga encaminhe solicitações para diferentes servidores back-end com base no conteúdo da solicitação do usuário. Este modo de balanceamento de carga permite executar 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 da nossa Introdução à Rede.

Aqui está um diagrama de um exemplo simples de balanceamento de carga na camada 7:

Layer 7 Load Balancing

Neste exemplo, se um usuário solicitar seudominio.com/blog, ele será encaminhado para o backend blog, que é um conjunto de servidores que executam uma aplicação de blog. Outras solicitações são encaminhadas para web-backend, que pode estar executando outra aplicação. Ambos os back-ends 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çar com /blog.

use_backend blog-backend if url_blog usa a ACL para encaminhar o tráfego para blog-backend.

default_backend web-backend especifica que todo o outro tráfego será encaminhado para web-backend.

Algoritmos de Balanceamento de Carga

O algoritmo de balanceamento de carga que é usado determina qual servidor, em um backend, será selecionado ao balancear a carga. O HAProxy oferece várias opções de algoritmos. Além do algoritmo de balanceamento de carga, os servidores podem ser atribuídos 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 servidores alternadamente. Este é o algoritmo padrão.

leastconn

Seleciona o servidor com o menor número de conexões. Isso é recomendado para sessões mais longas. Os servidores no mesmo backend também são rotacionados de forma round-robin.

fonte

Isto seleciona qual servidor usar com base em um hash do endereço IP de origem das requisições feitas pelos usuários. Este método garante que os mesmos usuários se conectarão aos mesmos servidores.

Sessões Sticky

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 sticky, 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 requisiçõ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 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 se tornará 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 utilizado em conjunto com o HAProxy por suas capacidades de cacheamento e compressão.

Alta Disponibilidade

As configurações de balanceamento de carga de camada 4 e 7 descritas neste tutorial usam ambos um balanceador de carga para direcionar o tráfego para um dos vários servidores do backend. No entanto, seu balanceador de carga é um único ponto de falha nessas configurações; se ele falhar ou for 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, o mecanismo de failover detectará e atribuirá automaticamente o endereço IP a um dos servidores passivos. Existem várias maneiras diferentes de implementar uma configuração de alta disponibilidade 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 Log do HAProxy com o Rsyslog no CentOS 8 [Início Rápido]

Se você está procurando resolver um problema, confira Erros Comuns do HAProxy. Se for necessário ainda mais solução de problemas, dê uma olhada em Como Solucionar Erros Comuns do HAProxy.

Source:
https://www.digitalocean.com/community/tutorials/an-introduction-to-haproxy-and-load-balancing-concepts