icono_twiter icono LinkedIn
Rubén Aguilera Díaz-Heredero

Consultor tecnológico de desarrollo de proyectos informáticos.

Ingeniero en Informática, especialidad en Ingeniería del Software

Puedes encontrarme en Autentia: Ofrecemos servicios de soporte a desarrollo, factoría y formación

Somos expertos en Java/J2EE

Ver todos los tutoriales del autor

Fecha de publicación del tutorial: 2012-04-19

Tutorial visitado 5.999 veces Descargar en PDF
Balanceando la carga de MySQL con HAProxy

Balanceando la carga de MySQL con HAProxy

0. Índice de contenidos.

1. Entorno

Este tutorial está escrito usando el siguiente entorno:

  • Hardware: Portátil Mac Book Pro 17" (2,6 Ghz Intel Core i7, 8 GB DDR3)
  • Sistema Operativo: Mac OS X Snow Leopard 10.6.4
  • 5 máquinas virtuales con Ubuntu Server 10.4 en VirtualBox
  • MySQL 5.1
  • MySQL Cluster
  • HAProxy 1.3.22

2. Introducción

En un tutorial anterior ya vimos como conseguir alta disponibilidad con MySQL montando un cluster: Montar un cluster de MySQL. El objetivo del presente tutorial es añadir un balance de carga a nuestra solución de alta disponibilidad.

Las soluciones de balance de carga pueden ser tanto hardware como software. En este caso, nosotros vamos a optar por una solución software llamada HAProxy que instalaremos en otra máquina virtual independiente y que funcionará de proxy con el resto de nodos SQL de la arquitectura, a fin de repartir las peticiones.

3. Vamos al lío

Lo primero que tenemos que hacer es instalar una nueva máquina virtual. Esta máquina solo va a actuar de proxy balanceador por lo que lo único que tenemos que instalar es el paquete HAProxy.

	sudo apt-get install haproxy

Una vez instalado vamos a configurarlo para que balance la carga de MySQL. Para ello abrimos con un editor el fichero /etc/haproxy/haproxy.cfg que se ha creado con contenido por defecto en la instalación del paquete.

Esta es una posible configuración para nuestro caso:

global
	maxconn 4096
	user haproxy
	group haproxy
	daemon

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

listen	mysql-cluster 0.0.0.0:3307
	mode tcp
	balance roundrobin

	server nodo1 192.168.1.15:3306 check
	server nodo2 192.168.1.16:3306 check
	server nodo3 192.168.1.14:3306 check

La parte importante de la configuración se encuentra en la sección [listen] donde estamos indicando que el proxy escuche por el puerto 3307, y que las peticiones que le lleguen por ese puerto las reparta en base a un algoritmo round robin entre los servidores que se especifican. En caso de tener unos servidores más potentes que otros, podríamos definir un peso para cada uno de forma que los más potentes tengan más posibilidades de recibir más peticiones. Para hacer esto añadimos a la definición de los servers el peso que le damos de esta forma:

	listen	mysql-cluster 0.0.0.0:3307
	mode tcp
	balance roundrobin

	server nodo1 192.168.1.15:3306 check weight 10
	server nodo2 192.168.1.16:3306 check weight 50
	server nodo3 192.168.1.14:3306 check weight 40

Reiniciamos el proxy indicándole donde está el fichero de configuración:

	sudo haproxy -f /etc/haproxy/haproxy.cfg

Y ya tenemos el proxy listo para empezar a recibir peticiones.

4. Probamos el resultado

Lo primero que tenemos que hacer para probar el resultado es crear y dar permisos de conexión remota al mismo usuario en los distintos nodos SQL que están referenciados en la configuración del proxy.

Estos pasos los repetimos por cada uno de los nodos SQL. Primero nos logamos como root:

	mysql -u root -ppassword

Creamos el usuario y le damos los permisos para conectar remotamente:

	GRANT ALL PRIVILEGES ON *.* TO 'prueba'@'%' IDENTIFIED BY 'prueba' WITH GRANT OPTION;
	FLUSH PRIVILEGES;

Abrimos el archivo de configuración /etc/mysql/my.cnf y ponemos a 0.0.0.0 el valor de la variable bind-address y el valor de la variable max-connections a 1000

Reiniciamos todos los nodos y comprobamos que el cluster sigue funcionando.

Para probar el balanceo de la carga basta con situarnos en un nodo SQL y tratar de ejecutar una conexión remota a la dirección y puerto del proxy con la siguiente sentencia:

	mysql -u prueba -pprueba -h ip_del_proxy --port=3307

Tenemos que ver que el servidor conecta y permite la ejecución de consultas. Recordad que en la máquina del proxy no está instalado MySQL, así que nuestro proxy está funcionando. Otra forma de asegurarnos es comprobando en cada nodo SQL con el comando "SHOW PROCESSLIST" si el usuario "prueba" está conectado a él.

5. Conclusiones

Hemos visto una solución de balanceado por software bastante sencilla de configurar y sobre todo intuitiva. MySQL oferece su propia solución software llamada MySQL Proxy pero yo la he encontrado mucho menos intuitiva.

Cualquier duda o sugerencia en la zona de comentarios.

Saludos.

A continuación puedes evaluarlo:

Regístrate para evaluarlo

Por favor, vota +1 o compártelo si te pareció interesante

Share |
Anímate y coméntanos lo que pienses sobre este TUTORIAL:

Fecha publicación: 2013-04-26-10:19:30

Autor: MsTransAct

Hola Rubén,

Gracias por los 2 tutoriales relacionado con MySQL Cluster, tengo el siguiente problema, al crear mi HAProxy me sale el siguiente problema:

Imagino que tengo que configurar una ruta para los Logs?
http://img834.imageshack.us/img834/8830/mysqlproxy2013042610112.png

Mi configuración es esta:

http://img689.imageshack.us/img689/5152/mysqlproxy2013042610070.png

Saludos!