Apache com Alta Disponibilidade e Load Balancer
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:
1 2 3 4 5 6 7 8 | 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
1 2 3 4 | [...] #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
1 2 3 4 | [...] 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
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 | 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
1 2 3 4 | # 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
1 | net.ipv4.ip_nonlocal_bind = 1 |
# sysctl -p
Instalar o keepalived:
# apt-get install keepalived
em HA-proxy1:
# vi /etc/keepalived/keepalived.conf
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | 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
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | 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/
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 | 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 !