Tutorial – Balanceamento de carga em servidores com HAProxy

25 Comentários

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.

servers-768x512

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

haproxy_00

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:

haproxy_01

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

apache
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


ServerAdmin webmaster@localhost
ServerName test.dev
ServerAlias www.test.dev
DocumentRoot /var/www/html/test.dev

Options Indexes FollowSymLinks MultiViews
AllowOverride all
Order allow, deny
allow from all

ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined

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).

haproxy_03

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.

Partilhar:
Tags:

Comentários

25

Deixe um comentário

O seu endereço de email não será publicado. Campos obrigatórios marcados com *

  1. Avatar de Rui
    Rui

    Se tivermos a falar de webserver com mysql como é que é feita essa gestão?

    1. Avatar de APereira
      APereira

      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.

      1. Avatar de plenop
        plenop

        Podes criar um cluster com o Galera.
        O OpenStack por exemplo utiliza o haproxy e o galera

  2. Avatar de David Ramos
    David Ramos

    Muito obrigado pplware:)

  3. Avatar de Alex
    Alex

    O mysql idealmente ficará noutro servidor por trás ou num cluster com x máquinas SQL, ambos os webservers acedem ao server SQL

  4. Avatar de Rui LUX
    Rui LUX

    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..

  5. Avatar de Não Interessa
    Não Interessa

    E se o HAProxy decidir crashar, algum failsafe?

    1. Avatar de plenop
      plenop

      o haproxy fica instalado nas diversas máquinas, se ele crashar numa/maquina for abaixo, outra assume

    2. Avatar de Luís Ribeiro
      Luís Ribeiro

      Estamos a pensar já nesse tutorial – Cluster de HAProxy. 🙂
      Obrigado pelo feedback

  6. Avatar de José Rodrigues
    José Rodrigues

    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.

    1. Avatar de Mauro
      Mauro

      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

  7. Avatar de Lynx
    Lynx

    OBG, Pedro Pinto. ( por voltares a fazer artigos com valor)

  8. Avatar de Amilcar Alho
    Amilcar Alho

    Muito bom!
    Parabéns aos autores e ao PP 😉

    1. Avatar de int3
      int3

      Pedro Pinto é sempre top!
      Não conhecia isto.

  9. Avatar de Ana
    Ana

    Alguém sabe se o HAProxy suporta forward para páginas com autenticação NTLM ou só numa versão paga?

  10. Avatar de Diogo
    Diogo

    Mas que grande tutorial!!! Deviam meter mais coisas assim…

  11. Avatar de Joel Fernandes
    Joel Fernandes

    Bom dia amigo
    Isso é balanceamento de carga certo ?

  12. Avatar de Bruno Ribeiro
    Bruno Ribeiro

    Olá, alguém conseguiu subir o HaProxy, de forma transparente? Já tentei diversos tutorias, recompilando o kernel, mas sem sucesso

  13. Avatar de Luis Lopes
    Luis Lopes

    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

  14. Avatar de Cleimor
    Cleimor

    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?

  15. Avatar de Luis Melo
    Luis Melo

    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

  16. Avatar de Luis Melo
    Luis Melo

    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.

  17. Avatar de Ercio L D Berna
    Ercio L D Berna

    testparm test.dev.conf
    Unknow parameter “<Directory var"

    como no tutorial esta assim, recebi este erro…

  18. Avatar de ANTONIO ROZENDO DA SILVA JUNIOR
    ANTONIO ROZENDO DA SILVA JUNIOR

    Olá amigo,
    Poderia fazer um post sobre o proxysql

  19. Avatar de jocelim
    jocelim

    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.