Com esse post irei configurar um Load Balance com dois nós utilizando uma configuração ativa/passiva utilizando HAProxy e keepalived. O load balancer fica entre os usuários e 2 servidores web apache, que mantenham o mesmo conteúdo. O load balancer distribui os pedidos para os 2 servidores apache e também verifica o estado dos mesmos, caso um dos servidores esteja fora, os pedidos serão automaticamente redirecionados para o outro servidor. O HAProxy trabalha com sessões, que significa que você pode usá-lo com qualquer aplicação web que faça uso de sessões (fóruns, sites de compras – carrinho, etc).
Precisamos de 4 hosts para o exemplo:
Balanceadores: HA-proxy1: 10.1.1.200/24 HA-proxy2: 10.1.1.201/24 Servidores WEB: apache1: 10.1.1.202/24 apache2: 10.1.1.203/24 Virtual: 10.1.1.99/24 (Este IP será usado pelo clientes web) Obs.: Caso queira utilizar servidores alugados tenha o cuidado de reservar endereços na mesma sub-rede, incluindo um para o IP virtual. Para o exemplo estou utilizando 4 hosts Debian squeeze (6.0).
Vamos instalar os servidores apache primeiro e configura-los:
apache1/apache2:
# apt-get install apache2
O ha-proxy será configurado como proxy transparente e os IPs dos clientes serão repassados ao campo X-Forwarded-for, e devemos alterar a opção LogFormat do apache para não registrar o endereço do nosso Load Balancer. Vamos alterar o arquivo /etc/apache2/apache2.conf, substituir %h por %{X-Forwarded-for}i :
# vi /etc/apache2/apache2.conf
[...]
#LogFormat "%v:%p %h %l %u %t "%r" %>s %O "%{Referer}i" "%{User-Agent}i"" vhost_combined
LogFormat "%{X-Forwarded-For}i %l %u %t "%r" %>s %b "%{Referer}i" "%{User-Agent}i"" combined
[...]
Além dessa configuração temos que fazer o haproxy verificar se os servidores apache estão funcionando e para isso iremos criar o arquivo /var/www/check.txt que o haproxy irá procurar, e para evitar que os logs com esses acesso ao arquivo sejam registrados precisamos modificar o nosso VirtualHost default.
# vi /etc/apache2/sites-available/default
[...] SetEnvIf Request_URI "^/check.txt$" dontlog CustomLog /var/log/apache2/access.log combined env=!dontlog [...]
Comente qualquer outra linha CustomLog
Vamos criar o arquivo check.txt em /var/www
# touch /var/www/check.txt
reiniciar os servidores apache:
# invoke-rc.d apache2 restart
Com os servidores apache configurados vamos partir os 2 Load Balancer
Instalação haproxy (HA-proxy1, HA-proxy2)
# apt-get install haproxy
O arquivo de configuração é /etc/haproxy/haproxy.cfg mas vamos criar outro e fazer o backup do original
# cd /etc/haproxy
# mv haproxy.cfg haproxy.cfg.original
# vi haproxy.cfg
global
log 127.0.0.1 local0
log 127.0.0.1 local1 notice
#log loghost local0 info
maxconn 4096
#debug
#quiet
user haproxy
group haproxy
daemon
defaults
log global
mode http
option httplog
option dontlognull
retries 3
option redispatch
maxconn 2000
contimeout 5000
clitimeout 50000
srvtimeout 50000
listen clusterweb 10.1.1.99:80
mode http
stats enable
stats auth user1:senha
balance roundrobin
cookie JSESSIONID prefix
option httpclose
option forwardfor
option httpchk HEAD /check.txt HTTP/1.0
server apache1 10.1.1.202:80 cookie A check
server apache2 10.1.1.203:80 cookie B check
Configurar o daemon do haproxy para ser carregado na inicialização:
# vi /etc/default/haproxy
# Set ENABLED to 1 if you want the init script start haproxy. ENABLED=1 # Add extra flags here. #EXTRAOPTS="-de -m 16"
Ajustar o parâmetro do kernel para permitir que o haproxy vincule o IP virtual (10.1.1.99)
# vi /etc/sysctl.conf
net.ipv4.ip_nonlocal_bind = 1
# sysctl -p
Instalar o keepalived:
# apt-get install keepalived
em HA-proxy1:
# vi /etc/keepalived/keepalived.conf
vrrp_script chk_haproxy {
script "killall -0 haproxy"
interval 2
weight 2
}
vrrp_instance VI_1 {
interface eth0
state MASTER
virtual_router_id 51
priority 101 # 101 no master, 100 no backup
virtual_ipaddress {
10.1.1.99
}
track_script {
chk_haproxy
}
}
Iniciar o keepalived
# invoke-rc.d keepalived start
Verifique se o IP virtual foi criado (não aparece com ifconfig)
# ip addr show eth0
Agora em HA-proxy2
# vi /etc/keepalived/keepalived.conf
vrrp_script chk_haproxy {
script "killall -0 haproxy"
interval 2
weight 2
}
vrrp_instance VI_1 {
interface eth0
state MASTER
virtual_router_id 51
priority 100 # 101 no master, 100 no backup
virtual_ipaddress {
10.1.1.99
}
track_script {
chk_haproxy
}
}
Iniciar o keepalived
# invoke-rc.d keepalived start
Verifique se o IP virtual foi criado (não aparece com ifconfig)
# ip addr show eth0
Vamos iniciar o haproxy em ambas as máquinas:
# invoke-rc.d haproxy start
Pronto, para testar basta conectar no endereço virtual http://10.1.1.99 e verificar se está funcionando. Seria interessante também parar um dos servidores apache e verificar se ainda está funcionando.
As estatísticas do haproxy podem ser acessadas em: http://10.1.1.99/haproxy?stats
O nome do usuário e senha está cadastrado em “stats auth user1:senha” no arquivo /etc/haproxy/haproxy.cfg
Agora vamos gerar algum movimento nos servidores, utilizando ab (ApacheBench)
Vamos gerar 15000 requisições com 100 conexões concorrentes
# ab -n 15000 -c 100 http://10.1.1.99/
This is ApacheBench, Version 2.3 <$Revision: 655654 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/
Benchmarking 10.1.1.99 (be patient)
Completed 1500 requests
Completed 3000 requests
Completed 4500 requests
Completed 6000 requests
Completed 7500 requests
Completed 9000 requests
Completed 10500 requests
Completed 12000 requests
Completed 13500 requests
Completed 15000 requests
Finished 15000 requests
Server Software: Apache/2.2.16
Server Hostname: 10.1.1.99
Server Port: 80
Document Path: /
Document Length: 177 bytes
Concurrency Level: 100
Time taken for tests: 12.048 seconds
Complete requests: 15000
Failed requests: 0
Write errors: 0
Total transferred: 6795000 bytes
HTML transferred: 2655000 bytes
Requests per second: 1245.07 [#/sec] (mean)
Time per request: 80.317 [ms] (mean)
Time per request: 0.803 [ms] (mean, across all concurrent requests)
Transfer rate: 550.80 [Kbytes/sec] received
Connection Times (ms)
min mean[+/-sd] median max
Connect: 0 14 6.9 13 56
Processing: 17 66 15.2 65 166
Waiting: 4 56 14.0 55 165
Total: 28 80 15.5 79 177
Percentage of the requests served within a certain time (ms)
50% 79
66% 85
75% 89
80% 92
90% 99
95% 107
98% 118
99% 123
100% 177 (longest request)
As estatísticas do haproxy podem ser acessadas em: http://10.1.1.99/haproxy?stats
O nome do usuário e senha está cadastrado em “stats auth user1:senha” no arquivo /etc/haproxy/haproxy.cfg
Links:
HaProxy: http://www.haproxy.1wt.eu
Keepalived: http://www.keepalived.org
Fonte:
Howtoforge: http://www.howtoforge.com
Espero que tenham gostado do post e não se esqueçam assinar o nosso portal.





Bom dia.
Sempre quis aprender algo desse tipo.
Obrigado pelo post.
Renato,
Ok, espero que esse post seja útil para você.
Abraços,
Show de bola!!! Keepalive is the best HA!!! Agora faz um sobre LoadBalance!!!
Muito bom!!!
Mario,
Realmente o KeepAlived é o melhor. O haproxy faz o LoadBalance do apache2.
Abraços,
bem legal cara.. eu tenho uma grande duvida.. na hora de atualizar o coteudo desses servidores como fica? imagina um mantedor atualizando esse site.. como atualizar os nós de uma vez só?
abs
Michel
Michel,
Pode ser utilizado uma solução como o NFS ou então uma storage para o diretório onde os arquivos do site estão armazenados.
Abraços
Ótimo post Ricardo, me ajudou bastante.
Abraços !