Balanceador de carga MySQL con HAProxy

27 Abril 2013 at 19:22 by Adrián Pérez

balanceadorHace unas semanas, vimos cómo configurar un balanceador de carga con la aplicación de balanceo en entornos Red Hat por antonomasia: LVS, (y Piranha). LVS es la aplicación nativa de balanceo, muy bien documentada en la documentación oficial de Red Hat, e incluso vendida como balanceador en forma de addons.

Este tipo de configuraciones, funcionan muy bien, pero tienen una serie de requisitos, pues se ha de reconfigurar la red de los servidores implicados para compartir una IP Virtual, o para cambiar el default gateway (en el caso de LVS-NAT). Ésto no siempre nos es posible hacerlo, puesto que quizá estemos trabajando con un proveedor de servidores dedicados, como en mi caso Hetzner, que no permite hacer cambios en las interfaces de red que vienen configuradas en el equipo, y que además parece que no lleva bien lo de las IPs compartidas.

En cualquier caso, hay otras soluciones de balanceo, como HA Proxy, que en el siguiente ejemplo usaré para balancear las peticiones MySQL entre dos servidores con IPs públicas situados bajo el mismo switch, en Hetzner. Todos los servidores son CentOS 6.3 x64.

1- BALANCEADOR- Instalación

En primer lugar, instalaremos el paquete "Development Tools" en el balanceador:

yum -y groupinstall 'Development Tools'

A continuación, nos descargaremos de la página oficial de HAProxy, la última versión (tar.gz) y la descomprimiremos.

tar -zvxf haproxy-1.4.22.tar.gz
Una vez descomprimido, miraremos qué versión de Kernel tenemos, en el caso de no saberlo:

# uname -r
2.6.32-279.22.1.el6.x86_64

Ahora que en nuestro ejemplo hemos visto que tenemos el Kernel 2.6, instalaremos HAProxy indicando como target "linux26". Si no se está seguro de qué target poner, se puede ejecutar "make" sin target, para ver las opciones disponibles.
cd haproxy-1.4.22
make TARGET=linux26
cp haproxy /usr/sbin/haproxy

2- BALANCEADOR- Configuración

A continuación, podremos copiar el fichero de ejemplo de configuración a /etc, o si lo preferimos, crear uno vacío:

cp /tmp/haproxy-1.4.22/examples/haproxy.cfg /etc/

En mi caso, he usado el siguiente fichero de configuración [Fuente]:

global
maxconn 4096
uid 99
gid 99
daemon

defaults
mode    http
option  tcplog
option  dontlognull
retries 3
option redispatch
maxconn 2000
contimeout      5000
clitimeout      50000
srvtimeout      50000

listen  mysql-cluster 0.0.0.0:3306
mode tcp
balance roundrobin
server nodo1 80.81.82.81:3306 check
server nodo2 80.81.82.82:3306 check

3- BALANCEADOR- Iniciar HA Proxy

Podemos iniciar HA Proxy indicándole la ubicación del fichero de configuración que acabamos de realizar:

sudo haproxy -f /etc/haproxy.cfg

 

NOTAS

A partir de ese momento, ya tendremos HA Proxy balanceando peticiones MySQL entre nuestros nodos. Hay que recordar que:

  • Los nodos tienen que aceptar peticiones MySQL remotas (iptables abierto para el puerto 3306 y origen que toque).
  • Los nodos han de tener un usuario MySQL creado para permitir conectar remotamente.
  • Si se quiere iniciar haproxy al inicio, se puede añadir la siguiente instrucción al /etc/rc.local:

/usr/sbin/haproxy -f /etc/haproxy.cfg

  • Finalmente, decir que para comprobar el correcto funcionamiento de la solución, se puede usar la sentencia  "select @@hostname" para verificar a cual de los nodos estamos conectados. Si el algoritmo de balanceo es Round Robin, para cada nueva conexión, deberíamos conectar con un nodo diferente. De esta manera, podemos verificar si el sistema de balanceo está funcionando.

mysql> select @@hostname;
+------------------+
| @@hostname       |
+------------------+
| mysql-server-01 |
+------------------+
1 row in set (0.07 sec)

  • En el siguiente enlace se encuentra la documentación de HAProxy, por si se quiere comprender mejor qué opciones de configuraciones tenemos. [enlace]

Fuentes:

http://www.adictosaltrabajo.com/tutoriales/tutoriales.php?pagina=HAProxyBalanceandoCarga

http://docs.neo4j.org/chunked/stable/ha-haproxy.html

http://wiki.joyent.com/wiki/display/jpc2/Load+Balancing+with+HAproxy

 

Flickr!Foto por Daquella manera