Este tema lo había preparado a las apuradas para la Fliso2010, en este ocasión y con mayor tiempo lo hice un poco más "explicativo".

lLoad Balancing con HAProxy y keepalived

En este caso voy a mostrar un mini-tutorial sobre load balancing (balanceo de cargas) en servidores Apache con las herramientas, HAProxy y keepalived.

La idea del balanceo de cargas es justamente, valga la redundancia, balancear para uno u otro servidor dependiendo de la carga que tenga cada uno.

Por ejemplo, suponiendo que tengamos dos servidores y uno de ellos está siendo atacado, la idea del load balancing es justamente que ante una petición, balancee hacia el servidor con menos carga.

Los "materiales" que voy a utilizar son:

Dos servidores Apache con la misma configuración
HAproxy instalado en otra pc
keepalived instalado en la misma pc que HAProxy

Para empezar; instalo debian en uno de los servidores, en este caso uso Virtualbox e instalo sólo la versión "consola", sin entorno gráfico porque no lo necesito.

Instalo Apache2:

apt-get install apache2


Edito el archivo apache2.conf:

nano /etc/apache2/apache2.conf


Busco esta línea:

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


Y reemplazo el

%h


por:

%h{X-Forwarded-For}i


Nos quedaría entonces:

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


Editamos el archivo default de sites-available

/etc/apache2/sites-available/default


Agregamos estas dos líneas para que luego cuando creemos el archivo check.txt no sea logueado por Apache:

SetEnvIf Request_URI "^/check.txt$" dontlog
CustomLog /var/log/apache2/access.log combined env=!dontlog


Reiniciamos Apache:

/etc/init.d/apache2 restart


y creamos el archivo check.txt

touch /var/www/check.txt


Listo, ya tenemos instalado y configurado nuestro primer Apache, ahora lo que vamos a hacer es clonar el disco así tenemos la misma configuración y no tenemos que instalar todo de cero..

Click acá para saber cómo clonar un disco de VirtualBox

Una vez que ya tenemos las dos máquinas con Apache configurado vamos a pasar a instalar haproxy:

apt-get install haproxy


Editamos nuestro haproxy.cfg

/etc/haproxy/haproxy.cfg


Esta es mi configuración, en este caso 192.168.1.4 y 192.168.1.5 son los dos servidores Apache.

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

defaults
log global
mode http
option httplog
option dontlognull
retries 3
option redispatch
maxconn 2000
contimeout 5000
clitimeout 50000
srvtimeout 50000

listen LoadBalancer 192.168.1.2:80
mode http
stats enable
stats auth dysloke:111222
balance roundrobin
cookie JSESSIONID prefix
option httpclose
option forwardfor
option httpchk HEAD /check.txt HTTP/1.0
server Servidor1 192.168.1.4:80 cookie A check
server Servidor2 192.168.1.5:80 cookie B check


Nótese que en la línea "listen LoadBalancer 192.168.1.2" ponemos nuestra ip donde está instalado haproxy.
Y en la línea "stats auth dysloke:111222" ponemos un usuario y contraseña para entrar al gestor de haproxy:

Ahora editamos el archivo haproxy y ponemos el valor ENABLED en 1 :

/etc/default/haproxy


# Set ENABLED to 1 if you want the init script to start haproxy.
ENABLED=1
# Add extra flags here.
#EXTRAOPTS=-de -m 16"


Listo, ya configuramos HAProxy ahora pasamos a instalar y configurar keepalived

Lo instalamos:

apt-get install keepalived


Editamos el archivo sysctl.conf

nano /etc/sysctl.conf


Agregamos esta línea al final:

net.ipv4.ip_nonlocal_bind=1


Corremos el comando:

sysctl -p


Ahora añadimos la configuración del keepalived:

nano /etc/keepalived/keepalived.conf


Agregamos esta configuración:

vrrp_script chk_haproxy { # Requires keepalived-1.1.13
script "killall -0 haproxy" # cheaper than pidof
interval 2 # check every 2 seconds
weight 2 # add 2 points of prio if OK
}

vrrp_instance VI_1 {
interface eth0
state MASTER
virtual_router_id 51
priority 101 # 101 on master, 100 on backup
virtual_ipaddress {
192.168.1.2
}
track_script {
chk_haproxy
}
}


Listo, ya tenemos todo configurado, hora de iniciar los servicios y verificar si funciona o no:

/etc/init.d/keepalived start


/etc/init.d/haproxy start


Ahora entramos a http://NUESTAIP/haproxy?stats
En mi caso: http://192.168.1.2/haproxy?stats

Nos va a pedir usuario y contraseña, ponemos los que configuramos en el haproxy.cfg

Dejo un par de imágenes para que vean más o menos cómo se ve el entorno gráfico del HAProxy (hacer click para verlas más grandes)


apache




Se ven los dos servidores funcionando bien, para probar si realmente hace el balanceo tendríamos que atacar alguno de los servidores, en este caso yo no voy a mostrar esa parte, a cada servidor apache le puse un html distinto, en uno dice "Servidor 1" y en el otro "Servidor 2" para diferenciar si realmente balancea.


Ahora entro a http://192.168.1.2 y noten que me va a enviar a cualquiera de los dos servidores.


Para ver cómo va enviandonos a uno u otro servidor, voy a ir haciendo refresh dentro del sitio 192.168.1.2




carga


debian




Ahora si hacemos muchas veces refresh "simulando visitas" van a ver cómo varían los números en nuestro haproxy:




Linux




Listo, espero que a alguien le sirva .. saludos !!