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:

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

Rolar para cima