O seu portal de estudos

Apache com Alta Disponibilidade e Load Balancer

Posted by Ricardo Pinheiro em 14 de junho de 2011

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.

Anúncios

6 Respostas to “Apache com Alta Disponibilidade e Load Balancer”

  1. Renato said

    Bom dia.
    Sempre quis aprender algo desse tipo.

    Obrigado pelo post.

  2. mariorpn said

    Show de bola!!! Keepalive is the best HA!!! Agora faz um sobre LoadBalance!!!

    Muito bom!!!

  3. michel said

    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

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s

 
%d blogueiros gostam disto: