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-14

Tutorial visitado 15.030 veces Descargar en PDF
Montar un cluster de MySQL

Montar un cluster de MySQL

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
  • 4 máquinas virtuales con Ubuntu Server 10.4 en VirtualBox
  • MySQL 5.1
  • MySQL Cluster

2. Introducción

A veces nos encontramos en proyectos donde los entornos de producción requieren de un sistema que garantice la alta disponibilidad. Una de las soluciones para conseguir esto es montar la base de datos en un clúster de tal forma que no haya ningún punto débil en el sistema y si se cae un nodo que el sistema no deje de dar servicio.

En este tutorial vamos a ver como conseguirlo con la solución MySQL Cluster. Para seguir el ejemplo antes tenemos que tener claros los siguientes conceptos:

  • Motor de almacenamiento NDB: A partir de la versión 5.1 MySQL incorpora este nuevo motor de almacenamiento específico para tablas que se encuentran en cluster.
  • Nodo de administración (MGM): Es el nodo que se va a encargar de manejar, controlar y coordinar al resto de nodos del cluster. Debido a esto tiene que ser el primero en iniciarse.
  • Nodo de datos (NDB): Este tipo de nodo almacena los datos del cluster de forma distribuida. De tal forma que si uno de ellos cae, el resto de nodos pueden seguir sirviendo la información.
  • Nodo SQL (MYSQLD): Este tipo de nodo nos permite acceder a los datos del cluster.

El ejemplo lo vamos a basar en la siguiente arquitectura:

  • 1 nodo de administración (MGM)
  • 2 nodos de datos (NDB) que a su vez van a ser nodos SQL (MYSQLD)
  • 1 nodo SQL (MYSQLD)

Gráficamente está sería la arquitectura:

3. Configuramos el MGM

Lo primero que tenemos que hacer es configurar el nodo de administración. Para ello arrancamos una de las máquinas virtuales e instalamos MySQL con el soporte de NDBCluster. En Ubuntu es tan sencillo como ejecutar:

	sudo apt-get install mysql-cluster-server

Esto hace que se instale MySQL Cluster y MySQL Server y Client como dependencias en la versión 5.1.

A continuación creamos el fichero /etc/mysql/ndb_mgmd.cnf donde se describe cual va a ser la arquitectura de clustering y que rol van a adoptar los distintos nodos.


[NDBD DEFAULT] 
NoOfReplicas=2 
DataMemory=256M 
IndexMemory=18M

[MYSQLD DEFAULT] 

[NDB_MGMD DEFAULT] 

[TCP DEFAULT]

[NDB_MGMD] 
HostName=192.168.1.10

[NDBD] 
HostName=192.168.1.11 
DataDir=/var/lib/mysql-cluster 

[NDBD] 
HostName=192.168.1.12 
DataDir=/var/lib/mysql-cluster

[MYSQLD] 
HostName=192.168.1.11

[MYSQLD] 
HostName=192.168.1.12

[MYSQLD] 
HostName=192.168.1.13

Para este caso estamos determinando que nuestro cluster se va a componer de dos replicas de datos que están descritas en las secciones [NDBD], donde indicamos cual es la IP de la máquina y donde se van a almacenar los datos del cluster en esa máquina. Luego en las secciones [MYSQLD] determinamos la dirección IP de las máquinas que van a poder acceder a los datos del cluster. En este caso las máquinas NDB también adoptaran el rol de nodo SQL y solo una de ellas tendrá exclusivamente este rol. Como se veía en la figura de la arquitectura propuesta.

Nota muy importante: El contenido de este fichero queda cacheado por lo que nos puede pasar que lo modifiquemos, reiniciemos el servicio y los cambios no se vean reflejados. Para evitar esto antes de reiniciar el servicio debemos eliminar el fichero cacheado con esta sentencia:

	sudo rm /usr/mysql-cluster/ndb_1_config.bin.1

4. Configuramos los nodos de datos NDB y el nodo SQL

Vamos a describir los pasos para uno de ellos, posteriormente habría que repetir estos pasos para el resto de nodos.

Lo primero sería instalar mysql-cluster-server como se describió en el anterior apartado.

Hecho esto, pasamos a editar el fichero de configuración /etc/mysql/my.cnf añadiendo en la sección existente [mysqld], las siguientes líneas:

	ndbcluster
	ndb-connectstring=192.168.1.10

Y creamos una sección [mysql_cluster] con esta información:

	ndb-connectstring=192.168.1.10

Esta configuración nos sirve por un lado para habilitar el soporte del motor de almacenamiento NDBCluster y por otro para saber como conectar con el MGM.

Ahora reiniciamos primero el nodo MGM con la sentencia:

	sudo service mysql-ndb-mgm restart

Y posteriormente el resto de nodos que intervienen en el cluster con las sentencias:

	sudo service mysql-ndb restart
	sudo service mysql restart

En cada caso tenemos que ver que la salida no muestra ningún tipo de error.

Con esto ya estaría configurado y arrancado nuestro cluster, ahora vamos a comprobar el estado a través del nodo MGM, ejecutando:

	ndb_mgm
	ndb_mgm > show;

Con lo que el sistema mostrará una pantalla informando de que nodos del cluster están conectados. Separándolos en los distintos roles: MGM, NDB y MYSQLD

Hasta que este informe no muestre que todos los nodos están conectados no podremos probar nuestro cluster.

Los principales motivos por lo que un nodo puede salir como no conectado una vez se ha reiniciado su servicio, son que la variable connectstring no está apuntando al nodo MGM o que los servicios no se han reiniciado apropiadamente.

El que alguno de los nodos SQL no salga conectado es de los problemas más comunes que se pueden dar. Si nos aseguramos de que la configuración está bien y por mas que reiniciamos el servicio mysql no conseguimos que se conecte al MGM, la mejor solución es reiniciar completamente la máquina que este dando el problema. Esto lo resuelve en el 99% de los casos.

5. Probamos el cluster

Una vez que tenemos el cluster perfectamente configurado y arrancados todos los nodos, vamos a crear una base de datos. Para ello seleccionamos cualquiera de los nodos que tengan un rol de MYSQLD. Nos logamos como root:

	mysql -u root -p

Y proporcionamos la contraseña que hayamos definido para el root. Ahora en la consola de MySQL creamos nuestro esquema "cluster_test" con la sentencia:

	CREATE SCHEMA cluster_test;

Y ahora creamos nuestra primera tabla sin olvidar utilizar el motor de almacenamiento NDBCluster. Vamos a crear una sencillita para este ejemplo:

	CREATE TABLE table_test (id int) ENGINE=NDB;

E insertamos una serie de registros:

	INSERT INTO table_test () VALUES (1);
	INSERT INTO table_test () VALUES (2);
	INSERT INTO table_test () VALUES (3);
	INSERT INTO table_test () VALUES (4);
	INSERT INTO table_test () VALUES (5);

Ahora nos logamos en la consola MySQL de cualquier otro nodo con rol MYSQLD en el cluster y realizamos:

	USE table_test;

Vemos que sin hacer nada el schema table_test ya existe y ahora si ejecutamos la sentencia:

	SELECT id FROM table_test;

Veremos que el sistema nos devuelve los datos anteriormente introducidos. Esto es porque los datos del cluster se almacenan en los nodos con rol NDB, y los nodos con rol MYSQLD nos permiten acceder y trabajar sobre ellos.

6. Conclusiones

Hemos visto lo sencillo que puede ser montar un sistema de alta disponibilidad para los entornos de producción con MySQL. Si por lo que sea no consigues configurarlo correctamente, no dudes en preguntar.

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: 2014-04-24-20:03:20

Autor: miguel120688

puedo hacer este ejemplo con 2 servidores rehat pero utilizando ip virtuales?
saludos

Fecha publicación: 2013-03-26-21:15:30

Autor: miguel2e

Hola Rubén
Gracias por la ayuda prestada con el tutorial.
Tengo un par de dudas a ver si encuentras un momento para contestarme.
Según tu escenario, entiendo que el servidor apache en mi caso, debería ir contra el equipo sql (1.13) ?
Que ocurre si ese equipo se daña, el 1.13? se para el servicio no?, debo de instalar (o tener preparado) uno equipo nuevo y configurarlo como estaba el 1.13?.
Última pregunta, puedo tener un grupo de solo 3 equipos, el MGM y dos con los servicios NDB + SQL. En este caso, si falla el equipo al que apunta el apache, deberé de reconfigurar apache contra el que quede encendido?
Saludos.
PD al final eran mas de un par jaja

Fecha publicación: 2013-03-10-06:02:52

Autor: lachva

Excelente aporte, amigo tengo que realizar un cluster pero en dos nodos y en enterprise linux, usted cree que sea parecido a lo que explicas en este tutorial o será muy diferente?
agradezco la información que me puedas brindar, saludos.

Fecha publicación: 2012-07-25-18:43:15

Autor: CruzJ

Muy buena explicación, funcionando correctamente.
Podría ayudarme con lo siguiente:
Como poder conectar una aplicación en PHP que tenga acceso a tabla "x" de la base creada??
De antemano muchas gracias.

Fecha publicación: 2012-07-17-18:17:34

Autor: EsteBusta

Excelente tutorial, muy fácil de entender, me sirvio mucho.
Muchas gracias.

Fecha publicación: 2012-05-10-21:23:15

Autor: jauzcanga

Hola a todos.

Ruben actualmente trabajo con una aplicación que por razones ajenas a mi voluntad solo trabaja (se conecta) con Mysql 4.1.x. Me gustaría saber si puedo hacer un cluster con esta dependencia y si es así como puedo conseguir una versión de cluster tan vieja?

Gracias de antemano.

Fecha publicación: 2012-04-27-09:23:46

Autor: rubenagui

Hola painapol,

Lo que puedes intentar es ampliar el tamaño de esa tabla. Para ello tendrás que hacer un ALTER TABLE modificando las propiedades MAX_ROWS y AVG_ROW_LENGTH.

Espero que te sirva de ayuda.

Saludos.

Fecha publicación: 2012-04-26-23:51:39

Autor: painapol

Hola que tal, soy nuevo en esto de MySQL cluster, y tengo uno instalado, pero ya no me deja agregar datos en las tablas, tengo una tabla que es bastante extensa y cuando intento insertar me dice "The table 'nombre_de_tabla' is full, y en el ndb_mgm me dice Node 3: Data usage is 99%(2544 32K pages of total 2560), supongo que es algo de configuración lo que no estoy haciendo bien, esta la configuracion por default:

[ndbd default]
NoOfReplicas=2

[ndb_mgmd]
hostname=10.2.166.34
datadir=/var/lib/mysql-cluster
id=1
[ndbd]
hostname=10.2.166.32
datadir=/opt/mysql/mysql/data
id=3
[ndbd]
hostname=10.2.166.33
datadir=/opt/mysql/mysql/data
id=4
[mysqld]
hostname=10.2.166.32
[mysqld]
hostname=10.2.166.33


No se si me puedas orientar masomenos que ando haciendo mal, saludos y de antemano muchas gracias!