Prácticamente ya no cabe pensar en servicios en la nube sin suponerles alta disponibilidad (HA). Como usuarios estamos mal acostumbrados, ¿por qué quien sigue utilizando un servicio que no se encuentre disponible, aunque sea de manera casual?

La alta disponibilidad ha pasado a ser una commodity. Y ya no hay empresa, con un modelo de negocio capaz de soportar periodos regulares de no disponibilidad de su servicio, ya que eso implica grandes pérdidas económicas. ¡Más que nunca el tiempo es oro!

Existen diferentes herramientas o servicios que nos facilitaran el despliegue de nuestras aplicaciones con garantías HA, como: Keepalived, Pacemaker, Heartbeat, HAProxy, etc. Siendo éstas de diferente naturaleza (unas funcionan a nivel de aplicación, otras a nivel de HTTP/TCP…) y pudiendo ser combinadas según nuestras necesidades. Por ejemplo, una combinación muy común es Heartbeat y Pacemaker.

Quisiera hacer especial mención a HAProxy un projecto matenido por Willy Tarreau. Es un proyecto ya consolidado, la primera versión es del 2001 y empezó siendo proxy con balanceador de carga muy sencillo. Ha ido evolucionando y a día de hoy se haya convertido una herramienta muy interesante. El projecto se mantiene activo y van saliendo nuevas versiones que van incorporando nuevas funcionalidades como servir de terminación de SSL, analizador de logs, protocolo RDP, soporte para autenticación HTTP, estadísticas y monitorización… incluso incluye una interfaz web donde consultar el estado actual del proxy.

Si el servicio de balanceo de tu proveedor de cloud no te convence, ya que quieres llegar más allá y como el objetivo es no introducir un nuevo punto único de fallo en nuestras aplicaciones, vamos a ver un ejemplo práctico de como configurar un par de instancias HAProxy en modo activo-pasivo mediante Keepalived. Básicamente lo que haremos será mover dirección IP del servidor activo al pasivo cuando el primero deje de estar disponible.

Direcciones IP utilizadas

  • 10.1.1.10 Servidor Syslog
  • 10.1.1.30 Backend Web #1
  • 10.1.1.31 Backend Web #2
  • 10.1.1.20 Servidor HAProxy #1 dirección de gestión
  • 10.1.1.21 Servidor HAProxy #2 dirección de gestión
  • 10.1.1.80 Esta es la dirección del proxy que los usuarios conocen, Keepalived hará que apunte a un servidor disponible.
  • 10.1.1.25 Servidor SMTP

Instalación y configuración de HAProxy

En Ubuntu basta con hacer sudo apt-get install haproxy, poner ENABLED=1 en el fichero /etc/default/haproxy para habilitar el script de inicio y aplicar la siguiente configuración en /etc/haproxy/haproxy.cfg:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
global
     log 10.1.1.10 local0
     user haproxy
     group haproxy
     daemon
     maxconn 20000
     defaults
     log global
     option dontlognull
     balance leastconn
     clitimeout 60000
     srvtimeout 60000
     contimeout 5000
     retries 3
     option redispatch
listen stats 10.1.1.20:80 # se podría poner 10.1.1.21:80
     mode http
     stats enable
     stats uri /stats
     stats realm HAProxy\ Statistics
     stats auth admin:PASSWORD
listen http 10.1.1.80:80
     mode tcp
     option tcplog
     balance source
     maxconn 10000
     server web01 10.1.1.30:80 maxconn 6000
     server web02 10.1.1.31:80 maxconn 6000
listen https 10.1.1.80:443
     mode tcp
     option tcplog
     balance roundrobin
     maxconn 10000
     server web01 10.1.1.30:443 maxconn 6000
     server web02 10.1.1.31:443 maxconn 6000

Finalmente iniciamos el servicio service haproxy start.

Instalación y configuración de Keepalived

En Ubuntu basta con hacer sudo apt-get install keepalived, y aplicar la siguiente configuración en /etc/keepalived/keepalived.conf:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
 
global_defs {
    notification_email {
        alerts@cloudadmins.org<script type="text/javascript">
/* <![CDATA[ */
(function(){try{var s,a,i,j,r,c,l,b=document.getElementsByTagName("script");l=b[b.length-1].previousSibling;a=l.getAttribute('data-cfemail');if(a){s='';r=parseInt(a.substr(0,2),16);for(j=2;a.length-j;j+=2){c=parseInt(a.substr(j,2),16)^r;s+=String.fromCharCode(c);}s=document.createTextNode(s);l.parentNode.replaceChild(s,l);}}catch(e){}})();
/* ]]> */
</script>
    }
    notification_email_from keepalived@haproxy01.cloudadmins.org<script type="text/javascript">
/* <![CDATA[ */
(function(){try{var s,a,i,j,r,c,l,b=document.getElementsByTagName("script");l=b[b.length-1].previousSibling;a=l.getAttribute('data-cfemail');if(a){s='';r=parseInt(a.substr(0,2),16);for(j=2;a.length-j;j+=2){c=parseInt(a.substr(j,2),16)^r;s+=String.fromCharCode(c);}s=document.createTextNode(s);l.parentNode.replaceChild(s,l);}}catch(e){}})();
/* ]]> */
</script>
    smtp_server 10.1.1.25
    smtp_connect_timeout 30
}
vrrp_script chk_haproxy {
    script "killall -0 haproxy"
    interval 2 # check cada 2 segundos
    weight 2 # añade 2 puntos de prioridad si OK
}
vrrp_instance VI_1 {
    interface eth0
    state MASTER # "BACKUP" en el servidor de respaldo
    priority 101 # 101 en el master, 100 en el respaldo
    virtual_router_id 51
    smtp_alert # Activar notificaciones SMTP
    authentication {
        auth_type AH
        auth_pass PASSWORD
    }
    virtual_ipaddress {
        10.1.1.80
    }
    track_script {
        chk_haproxy
    }
}

Finalmente iniciamos el servicio service keepalived start.

Y con estos sencillos pasos ya tenemos nuestro frontend web balanceado en alta disponibilidad.

Espero que los disfrutéis ;)

Referencia usada http://haproxy.1wt.eu/download/1.3/doc/architecture.txt

VN:F [1.9.22_1171]
Rating: 5.0/5 (2 votes cast)
HAProxy in detail, 5.0 out of 5 based on 2 ratings