>_Alta disponibilidade – CentOS – HAproxy + Stunnel

Objetivo:

Montar um servidor de Balanceamento de Carga Web com o HAproxy e Stunnel.
Não vou abordar a configuração do Keepalived, apenas irei instalar o pacote no servidor Centos-1, pois sua configuração necessita de um quarto(4) servidor para podermos obter o máximo de disponibilidade no serviço.
Como o objetivo é apenas o balanceamento, então deixarei para um próximo tutorial a configuração do Keepalived.

Cenário:

No servidor que irá conter o HAPROXY instale os pacotes abaixo:

1 -   [root@centos-1 opt]# wget http://download.fedora.redhat.com/pub/epel/6/i386/haproxy-1.4.18-1.el6.i686.rpm
1.1 - [root@centos-1 opt]# rpm -Uvh haproxy-1.4.18-1.el6.i686.rpm
2 -   [root@centos-1 opt]# wget http://mirror.centos.org/centos/6/os/i386/Packages/stunnel-4.29-2.el6.i686.rpm
2.1 - [root@centos-1 opt]# rpm -Uvh stunnel-4.29-2.el6.i686.rpm
3 -   [root@centos-1 opt]# wget http://download.fedora.redhat.com/pub/epel/6/i386/keepalived-1.2.2-2.el6.i686.rpm
3.1 - [root@centos-1 opt]# yum install libnl.i686 libnl-devel.i686 -y
3.2 - [root@centos-1 opt]# rpm -Uvh keepalived-1.2.2-2.el6.i686.rpm

Agora vamos entender um pouco do arquivo de configuração haproxy.cfg

Prioridade de Servidores

Vamos supor que o Centos-2 e o Centos-3 são dois velhos servidores
P3-1.2 GHz, enquanto centos-4 e centos-5 são dois brilhantes novos servidores de 2,6 GHz.
Neste caso, podemos informar para o haproxy usando a tag “weigth” palavra-chave, com valores entre 1 e 256, ele irá então distribuir a carga mais suavemente possível respeitando a prioridade:

server centos-2 192.168.1.2:80 cookie 2 weight 12 check
server centos-3 192.168.1.3:80 cookie 3 weight 12 check
server centos-4 192.168.1.4:80 cookie 4 weight 26 check
server centos-5 192.168.1.5:80 cookie 5 weight 26 check

opção option dontlognull
A opção “dontlognull” é usado para prevenir o proxy e registrar a saúde verificando a partir da Alteon.
Se uma sessão de trocas não há dados, então não será registrados.

Balanceamento de carga de algoritmos

HAProxy pode lidar com algoritmos de balanceamento de carga de vários tipos, são eles:

round-robin: os pedidos partem da idéia de um rodízio entre os servidores no backend – note que os servidores declarados na seção backend também aceita um parâmetro de peso, que especifica o seu peso relativo na medida em que backend; o algoritmo round-robin vai respeitar essa relação de peso.

leastconn: o pedido é enviado para o servidor com o menor número de conexões; round-robin é usado se os servidores são igualmente carregados.

source: um hash do IP de origem é dividido pelo peso total dos servidores executando para determinar qual servidor irá receber o pedido, o que garante que os clientes a partir do mesmo endereço IP sempre ira acessar o mesmo servidor.

uri: a parte da URL até um ponto de interrogação é hash e usado para escolher um servidor que irá lidar com o pedido. Este é usado com caches de proxy para maximizar a taxa de acertos cache.

url_param: pode ser usado para verificar certas partes da URL, por exemplo, os valores pedidos enviados via POST, por exemplo um pedido que especifica um parâmetro user_id com um determinado valor pode chegar direcionado para o mesmo servidor usando o método url_param (veja mais na documentação).

Persistência de sessão com cookies

Se você está OK com o fato de que nem todos os navegadores do cliente aceitar cookies, e você ainda quiser usar cookies, como um mecanismo de persistência de sessão, então HAProxy oferece uma maneira fácil de fazê-lo. Se você adicionar essa linha para a seção backend:

cookie SERVERID insert nocache indirect

Com essa opção, estamos dizendo ao HAProxy para inserir um cookie chamado ID_servidor na resposta HTTP, o cookie será enviado para o navegador do cliente através de um cabeçalho Set-Cookie na resposta, e que é enviada de volta pelo cliente em um cabeçalho de cookie em todas as solicitações subseqüentes. Note que esse cookie é apenas um cookie de sessão, e não será gravado em disco pelo browser do cliente. Por esta razão, e por questões relacionadas com a cache, a documentação recomenda especificando ‘nocache’ as outras 2 opções e “indirect”. Em particular, “indirect” significa que o cookie será removido da solicitação HTTP, uma vez que é processado por HAProxy.
Depois de definir o cookie, você precisa associá-lo com os servidores no backend, como este:

server server1 10.1.1.1:80 cookie server01 check
server server2 10.1.1.2:80 cookie server02 check

Estatísticas de utilização

HAProxy oferece algumas estatísticas de sua utilização através de tabelas, mostrando os status de todos os servidores.
Para habilitar stats, basta adicionar as linhas abaixo:

stats permitir
stats uri / lb? stats
stats reino HAProxy Estatísticas
stats myusername admin: senhaaqui

Para acessar digite no Bowser

http://IP-HAPROXY-SERVER/haproxy?stats

Soft-stop
Este truque é bastante comum e muito simples: Em cada servidor dentro do diretório /var/www/html, devemos criar o arquivo check.txt, arquivo qual será verificado pelo haproxy.
Agora vamos supor que precisamos parar um dos servidores, neste caso, basta remover o arquivo que o haproxy vai entender como uma falha no servidor, e não mais enviará qualquer nova sessão, apenas as antigas. Se a tag “persist” for usada, o haproxy espera por alguns segundos (2) e em seguida encerrar o serviço com o servidor.

CONFIGURAÇÃO DO CONF HAproxy.cfs

[root@centos-1 opt]# cd /etc/haproxy/
[root@centos-1 haproxy]# ls
haproxy.cfg
[root@centos-1 haproxy]# cp haproxy.cfg haproxy.cfg.old
[root@centos-1 haproxy]# ls
haproxy.cfg  haproxy.cfg.old
[root@centos-1 haproxy]#
[root@centos-1 haproxy]# vim haproxy.cfg
# Global settings
global
    log         127.0.0.1 local2

    chroot      /var/lib/haproxy
    pidfile     /var/run/haproxy.pid
    maxconn     4000
    user        haproxy
    group       haproxy
    daemon
    # turn on stats unix socket
    stats socket /var/lib/haproxy/stats
#---------------------------------------------------------------------
defaults
    mode                        http
    log                         global
    option                      httplog
    option                      dontlognull
    option http-server-close
    option forwardfor           except 127.0.0.0/8
    option                      redispatch
    retries                     3
    timeout http-request        10s
    timeout queue               1m
    timeout connect             10s
    timeout client              1m
    timeout server              1m
    timeout http-keep-alive     10s
    timeout check               10s

    maxconn                     2000
    contimeout                  5000
    clitimeout                  50000
    srvtimeout                  50000

# round robin balancing between the various backends
listen HTTP-80 192.168.1.55:80
        mode http
        stats enable
        stats auth admin:senhaaqui
        balance roundrobin
        cookie SERVERID insert nocache indirect
        cookie JSESSIONID prefix
        option httpclose
        option forwardfor
        option dontlognull
        option httpchk HEAD /check.txt HTTP/1.0
        server centos-2.gnulinuxbr.com 10.0.30.2:80 cookie A check
        server centos-3.gnulinuxbr.com 10.0.30.3:80 cookie B check
        option persist
        option redispatch

Configurando o sysctl.conf

[root@centos-1 haproxy]# vim /etc/sysctl.conf
net.ipv4.ip_nonlocal_bind = 1

[root@centos-1 haproxy]# sysctl -p ou reboot

Colocando na inicialização do S.O. o HAproxy

[root@centos-1 haproxy]# chkconfig --level 123456 haproxy on

Configuração dos nós centos-2 e centos-3.
Faça exatamente igual em ambos servidores

1 - # yum install httpd -y
2 - # vim /etc/httpd/conf/httpd.conf

Importante:
O formato do log deve ser alterado para o formato abaixo:

#LogFormat "%h %l %u %t "%r" %>s %b "%{Referer}i" "%{User-Agent}i"" combined

LogFormat "%{X-Forwarded-For}i %h %l %u %t "%r" %>s %b "%{Referer}i" "%{User-Agent}i"" combined

CustomLog logs/access_log combined env=!dontlog
SetEnvIf Request_URI "^/check.txt$" dontlog

LogFormat "%h %l %u %t "%r" %>s %b" common
LogFormat "%{Referer}i -> %U" referer
LogFormat "%{User-agent}i" agent

3 – No diretório /var/www/html/ crie o arquivo chamado check.txt, que fará a comunicação com o HAproxy.

# touch /var/www/html/check.txt
# chown apache.apache /var/www/html/check.txt

Siga os passos abaixo para configuração da página de teste.

Centos-2

# cd /var/www/html/
# vim index.html

Centos-3

# cd /var/www/html/
# vim index.html

VirtualHost

Exemplo de um Virtual Host.

ServerAdmin sysadmin@dominio.com.br
ServerName ha.dominio.com.br
DocumentRoot /var/www/html
ErrorLog logs/beatles_error_log
CustomLog logs/beatles-access_log common
SetEnvIf Request_URI "^/check.txt$" dontlog
CustomLog logs/access_log combined env=!dontlog

Agora vamos acessar o nosso servidor HAproxy:

http://IP-DO-SERVIDOR-HAPROXY

Centos-2

Centos-3

Segunda parte da configuração

Nesta segunda parte vamos configurar o stunnel.

Stunnel é um carinha multi-plataforma de computadores usado para fornecer serviço de tunelamento TLS (segurança da camada de transporte) /SSL (protocolo de camada de sockets segura).

Continuando…

Nos servidores Centos-2 e Centos-3 devemos instalar o pacote abaixo:

# yum install mod_ssl

Pronto.

Agora vamos configurar o servidor Centos-1 onde está instalado o HAproxy.

Passo 1
Copiando os arquivos ca.key e ca.crt para o diretório /etc/stunnel/

[root@centos-1 /]# cd /etc/stunnel/
[root@centos-1 stunnel]# cp /etc/pki/tls/private/ca.key ca.key
[root@centos-1 stunnel]# cp /etc/pki/tls/certs/ca.crt stunnel.pem

Passo 2
Configurando o stunnel.conf

10 - [root@centos-1 stunnel]# vim stunnel.conf
#!/bin/bash
# GLOBAL

 cert=/etc/stunnel/stunnel.pem
 key=/etc/stunnel/ca.key
 setuid=root
 setgid=root
 pid = /var/run/stunnel.pid
 output = /var/log/stunnel.log

    socket=l:TCP_NODELAY=1
    socket=r:TCP_NODELAY=1

# HTTPS
    [https]
    accept=192.168.1.55:443
    connect=192.168.1.55:80
    TIMEOUTclose = 0

Veja as figuras abaixo:

Script para iniciar e parar o Stunell.

#!/bin/bash

# VARIAVEIS
GREP="/bin/grep"
EGREP="/bin/egrep"
PROG="stunnel"
KILLALL="/usr/bin/killall"

# TESTANDO SE EXISTE O ARQUIVO
test -x /usr/bin/stunnel || exit 0
RETVAL=0

########## START ##########
start() {
        if [ ! -f /var/lock/subsys/stunnel ]; then
        /usr/bin/stunnel
                RETVAL=$?
                if [ $RETVAL = 0 ]; then
                        touch /var/lock/subsys/stunnel
                        echo  $"Starting $PROG: OK"
                else
                        exit 1
                fi
        fi
                return $RETVAL
}
stop() {
        if [ -e /var/lock/subsys/stunnel ]; then
        $KILLALL /usr/bin/stunnel
                RETVAL=$?
                if [ $RETVAL = 0 ]; then
                        rm -rf /var/lock/subsys/stunnel
                        echo  $"Stop $PROG: OK"
                else
                        exit 1
                fi
        fi
                return $RETVAL
}
restart(){
         if [ -e /var/lock/subsys/stunnel ]; then
        $KILLALL /usr/bin/stunnel
                RETVAL=$?
                if [ $RETVAL = 0 ]; then
                        rm -rf /var/lock/subsys/stunnel
                        echo  $"Stop $PROG: OK"
                else
                        exit 1
                fi
        fi

        if [ ! -f /var/lock/subsys/stunnel ]; then
        /usr/bin/stunnel
                RETVAL=$?
                if [ $RETVAL = 0 ]; then
                        touch /var/lock/subsys/stunnel
                        echo  $"Starting $PROG: OK"
                else
                        exit 1
                fi
        fi

                return $RETVAL
}
case "$1" in
  start)
        start
        ;;
  stop)
        stop
        ;;
  restart)
        restart
        ;;
  *)
        echo $"ESCOLHA UM ITEM AO LADO: $0 {start|stop|restart}"
        exit 2
esac

exit $?

Logo em seguida iremos criar a chamada para inicialização no stunnel no boot do S.O.

[root@centos-1 ~]# ln -s /etc/init.d/stunnel /etc/rc3.d/S99stunnel

Pronto, agora já temos um servidor de Balanceamento de Carga com o HAproxy e Stunnel. Lembrando que esse tutorial está muito básico.
Verifique os manuais do HAproxy e do Stunnel, para um bom entendimento.

Abaixo temos um cenário simples e “barato” para uma Cluster de Alta Disponibilidade e com Balanceamento de Carga.

fontes desse tutorial:

http://haproxy.1wt.eu/download/1.2/doc/architecture.txt
http://agiletesting.blogspot.com/2009/02/load-balancing-in-amazon-ec2-with.html

>_Alta disponibilidade – CentOS – HAproxy + Stunnel
Tagged on:

Deixe uma resposta

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *

%d blogueiros gostam disto: