Instalación del sistema base

El entorno para este artículo es:

  • 192.168.0.121 – Backend1 – LAMP
  • 192.168.0.122 – Backend2 – LAMP
  • 192.168.0.123 – Balanceador – HAProxy

En los tres casos se trata de máquinas Ubuntu 10.10. Los firewalls están desactivados para hacer las cosas menos engorrosas. Voy a asumir que ya está instalado este entorno.

Topología de la red de pruebas

Ahora que hemos definido el escenario de testing, pasemos a la instalación del balanceador.

Configuración del balanceador y backends

Podemos instalar HAProxy con un manejador de paquetes. Por ejemplo, en Ubuntu podemos buscarlo:

<pre>$ apt-cache search haproxy
haproxy - fast and reliable load balancing reverse proxy</pre>

Y luego instalarlo:

<pre>$ sudo apt-get install haproxy</pre>
Si no, dado que HAProxy es OpenSource, podemos bajar el código de la web y compilarlo.

El mismo instalador deja un archivo con una configuración por default en:

<pre>/etc/haproxy/haproxy.cfg</pre>

Las opciones de configuración son muchas y no pretendemos verlas todas aquí, por lo que voy a detallar el problema a solucionar y ver cuál sería la configuración para eso.

El problema

  1. Se requiere balancear entre dos servidores web donde backend2 soporta más carga que backend1. Es decir, el balance no puede ser RoundRobin ni por origen, sino por peso.
  2. La aplicación hosteada en los dos servidores usa sesiones. Por lo tanto, la solución debe soportar sesiones.
  3. Además, el balanceador deberá reconocer cuando un backend está caído y dejar de enviarle peticiones.
  4. Por último, todas las imágenes están cargadas en backend1.

Quizás no sea un entorno realista, pero sirve para ilustrar varios puntos en la configuración de HAProxy.

Configuración de HAProxy

En este artículo asumimos que la configuración de los servidores web de backend ya está hecha. De todas formas, no es necesario cambiar nada en los backend para implementar este escenario de balance de carga.

Primero abrimos el archivo de configuración de HAProxy:

<pre>vi /etc/haproxy/haproxy.cfg</pre>
Y escribimos la siguiente configuración:
<pre># PARTE 1. Comienza configuracion estandar
global
  log 127.0.0.1    local0
  log 127.0.0.1    local1 notice
  maxconn 4096
  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

#
# PARTE 2. Comienza configuracion propia
#

  stats enable
  stats auth matias:3ik</pre>
<pre>frontend webfarm
  bind 192.168.0.123:80
  default_backend servidores</pre>
<pre>  # Esta ACL matchea con los archivos de imagenes
  acl url_static  path_end         .gif .png .jpg</pre>
<pre>  # Mando las peticiones al backend imagenes, donde estan todas las imagenes.
  use_backend imagenes if url_static</pre>
<pre>backend servidores
  cookie PHPSESSID prefix
  balance roundrobin
  option httpclose
  option forwardfor
  option httpchk HEAD /check.txt HTTP/1.0
  server backend1    192.168.0.121:80   weight 1  cookie A  check source 192.168.0.123 inter 1000
  server backend2    192.168.0.122:80   weight 2  cookie B  check source 192.168.0.123 inter 1000</pre>
<pre>backend imagenes
  balance roundrobin
  option httpclose
  option forwardfor
  option httpchk HEAD /check.txt HTTP/1.0
  server imagenes1 192.168.0.121:80 weight 5 check source 192.168.0.123 inter 1000</pre>
Habilitamos el servicio (tratandose de un servidor Debian/Ubuntu) poniendo ENABLED=1 en /etc/default/haproxy.

Reiniciamos el servicio:

<pre>/etc/init.d/haproxy restart</pre>

¡Y está listo! Sin embargo, antes de seguir, quisiera explicar un poco la configuración de arriba.

Estadísticas de carga para HAProxy

Para el siguiente artículo veremos más acerca de la instalación y configuración del balanceador en HaProxy.