Tutorial – Balanceamento de carga em servidores com HAProxy
Hoje em dia é importante garantir alta disponibilidade dos serviços online. Para esse cenário, é fundamental ter mais do que uma máquina e no caso de existirem muitos pedidos esse serem distribuídos pela várias máquina.
Este balanceamento de cargas pode ser feito usado o software HAProxy. Hoje mostramos como tudo funciona.
O HAProxy é um serviço Linux que garante um balanceamento e alta disponibilidade numa farm de servidores, como também serviço de proxying, ao não expor directamente estes mesmos servidores da farm na Internet.
Neste tutorial pretende-se configurar o HAProxy, de modo a garantir as funções referidas acima, numa farm constituída por dois webservers.
Cenário de Demonstração
Serão configuradas três máquinas virtuais, numa VLAN isolada e com endereçamento:
- HAProxy – servidor balanceador – 192.168.0.1/24
- Node01 – webserver 1 – 192.168.0.10/24
- Node02 – webserver 2 – 192.168.0.11/24
O cliente para este caso específico terá de estar também no mesmo segmento de rede e VLAN dos três servidores acima.
O sistema operativo utilizado nas três máquinas virtuais é Ubuntu, e o hypervisor é VMware (neste caso foi utilizado VMware Workstation).
Para quem desconhece, a imagem abaixo mostra como configurar VLANs a nível do VMWare workstation:
Configuração do Node1 e 2 (webservers) e virtualhost test.dev
Instalar apache2 sudo apt-get install apache2
Criar directório test.dev
sudo mkdir /var/www/html/test.dev
Definir permissões
sudo chown -R $USER:$USER /var/www/html/test.dev sudo chmod -R 755 /var/www
Criar index.html (para testes)
sudo nano /var/www/html/test.dev/index.html
Criar um VirtualHost que aponte para test.dev bastr:
sudo cp /etc/apache2/sites-available/000-default.conf /etc/apache2/sites-available/test.dev.conf
sudo nano /etc/apache2/sites-available/test.dev.conf
Para activarem o VH usando o a2ensite, e reiniciar o apache basta que usem os seguintes comandos:
sudo a2ensite test.dev.conf sudo service apache2 restart
Para configurar no Node2, basta apenas fazer os mesmos passos, mas alterar as palavras a negrito para Node2. Esta configuração servirá para distinguir o acesso ao mesmo site, mas o seu carregamento dos diferentes nós da farm.
Configuração do balanceador (HAProxy)
Instalar HAProxy
sudo apt-get install haproxy
Adicionar ao ficheiro /etc/default/haproxy a linha:
ENABLED=1
Criar cópia de segurança do ficheiro de configuração:
cp /etc/haproxy/haproxy.cfg /etc/haproxy/haproxy.cfg_bck
Remover todo o texto do ficheiro /etc/haproxy/haproxy.cfg e adicionar o seguinte:
global log /dev/log local0 log 127.0.0.1 local1 notice maxconn 4096 user haproxy group haproxy daemon
defaults log global option httplog option dontlognull retries 3 option redispatch maxconn 2000 contimeout 5000 clitimeout 50000 srvtimeout 50000 mode http #define o modo de funcionamento do balanceador(1)
listen webfarm bind 192.168.0.1:80 #apenas escuta neste IP do balanceador, e no porto 80 stats enable #activa as estatisticas do serviço (2) stats auth admin:admin #autenticação nas estatísticas acl url_test_dev path_beg /test.dev #definição da acl use_backend testdev if url_test_dev #associar a acl a um grupo de servers
backend testdev #define a farm de servers backend para o site test.dev balance roundrobin #define o algoritmo de balanceamento server node1 192.168.0.10:80 check # define o servidor e porto e o parâmetro de Health check server node2 192.168.0.11:80 check # define o servidor e porto e o parâmetro de Health check
Restart ao serviço HAProxy
sudo service haproxy restart
(1) In layer 7 mode, HAProxy analyzes the protocol, and can interact with it by allowing, blocking, switching, adding, modifying, or removing arbitrary contents in requests or responses, based on arbitrary criteria. Com isto podemos inspeccionar o pedido e fazer o forward do mesmo correctamente.
(2) Aceder às estatísticas através do url: 192.168.0.1/haproxy?stats e inserir as credenciais admin/admin
Aceder ao cliente, e no browser do mesmo colocar: 192.168.0.1/test.dev
Ir fazendo refresh várias vezes e validar o carregamento do site a partir do Node1 e 2 (tal como mostra a figura seguinte).
Se necessitam de um "balanceador de cargas" então o HAProxy pode ser uma solução interessante tento em conta que é opensource. O serviço tem ainda um sistema de reports que pode ser conhecido através deste demo aqui.
Este artigo tem mais de um ano
Se tivermos a falar de webserver com mysql como é que é feita essa gestão?
Creio que seja exactamente o mesmo, a Unica coisa que o servidor que está a frente está a fazer é a gestao de onde irá enviar a ligacao naquele momento por isso irá funcionar com qualquer servico.
Podes criar um cluster com o Galera.
O OpenStack por exemplo utiliza o haproxy e o galera
Muito obrigado pplware:)
O mysql idealmente ficará noutro servidor por trás ou num cluster com x máquinas SQL, ambos os webservers acedem ao server SQL
Seria interessante falarem de outras opções de balanceamento (suponho que não suporta só roundrobin.. balanceamento por análise da carga ? white-lists ? outros.. ) e como se comporta com sessões..
E se o HAProxy decidir crashar, algum failsafe?
o haproxy fica instalado nas diversas máquinas, se ele crashar numa/maquina for abaixo, outra assume
Estamos a pensar já nesse tutorial – Cluster de HAProxy. 🙂
Obrigado pelo feedback
Cuidado que isto só serve para cenários pequenos, qualquer coisa acima de 1000 users ou menos dependendo da carga vai deixar o haproxy às aranhas, pelo menos para mail, sql, sharepoint e terminal services. Não recomendo, dentro das minhas portas para determinados sistemas só mesmo F5.
1000 users não deixa nem de perto nem de longe o haproxy às aranhas. O problema são os bottlenecks dos servidores para onde ele faz forward dos pedidos
OBG, Pedro Pinto. ( por voltares a fazer artigos com valor)
Muito bom!
Parabéns aos autores e ao PP 😉
Pedro Pinto é sempre top!
Não conhecia isto.
Alguém sabe se o HAProxy suporta forward para páginas com autenticação NTLM ou só numa versão paga?
Mas que grande tutorial!!! Deviam meter mais coisas assim…
Bom dia amigo
Isso é balanceamento de carga certo ?
Olá, alguém conseguiu subir o HaProxy, de forma transparente? Já tentei diversos tutorias, recompilando o kernel, mas sem sucesso
Boas
Não consegui subir os nodes devido a esta linha coloqueia assim e eles subiram o que é que faz estas linha?
Desde já obrigado
Bem supondo que eu tenha um servidor haproxy que direcione para dois servidores web. Em determinada situação preciso que uma URL (http://www.site.com/administrativo) seja encaminhada para um dos servidores.
Isso é possivel realizar com o Haproxy?
O haproxy ė bastante extenso nas opções e está preparado para layer 7 – a camada aplicacional.
No caso do Cleimor basta criar uma acl com path_beg para encaminhar /administrativo para um servidor no backend específico
Como administrador de sistemas na Claranet, ė habitual ter clientes que procuram optimizar recursos e obter poupança financeira.
Quase todos os grandes clientes utilizam até certo ponto o haproxy, alguns com múltiplos sites e com mais de 1000 utilizadores. O segredo ė configurar de forma organizada e o mais simples possível, em cluster como ė evidente e tendo atenção ao keepalive das sessões abertas com os servidores.
Em muitos casos o simples options httpclose ou option http-server-close.
Em grandes setups o normal será algo do gênero
Haproxy lb-node1 haproxy lb-node2
Haproxy-node1 haproxy-node2 haproxy-node3
Backend backend backend backend
Ou seja, pelo menos dois balanceadores, com pelo menos dois haproxy como proxies e que apenas estão autorizados a comunicar com os load balancers (lb) e o inverso.
Garante-se redundância, alta disponibilidade e o processamento de carga nos pedidos.
testparm test.dev.conf
Unknow parameter “<Directory var"
como no tutorial esta assim, recebi este erro…
Olá amigo,
Poderia fazer um post sobre o proxysql
olá, como faço para compartilhar as sessions entre os nós, se eu autenticar no primeiro, não estou conseguindo que isso se repita para o segundo entende. Obrigado.