Montar un cluster de MySQL con MySQL Cluster

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:
  1. 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.
  1. [NDBD DEFAULT]   
  2. NoOfReplicas=2   
  3. DataMemory=256M   
  4. IndexMemory=18M  
  5.   
  6. [MYSQLD DEFAULT]   
  7.   
  8. [NDB_MGMD DEFAULT]   
  9.   
  10. [TCP DEFAULT]  
  11.   
  12. [NDB_MGMD]   
  13. HostName=192.168.1.10  
  14.   
  15. [NDBD]   
  16. HostName=192.168.1.11   
  17. DataDir=/var/lib/mysql-cluster   
  18.   
  19. [NDBD]   
  20. HostName=192.168.1.12   
  21. DataDir=/var/lib/mysql-cluster  
  22.   
  23. [MYSQLD]   
  24. HostName=192.168.1.11  
  25.   
  26. [MYSQLD]   
  27. HostName=192.168.1.12  
  28.   
  29. [MYSQLD]   
  30. 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:
  1. 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:
  1. ndbcluster  
  2. ndb-connectstring=192.168.1.10  
Y creamos una sección [mysql_cluster] con esta información:
  1. 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:
  1. sudo service mysql-ndb-mgm restart  
Y posteriormente el resto de nodos que intervienen en el cluster con las sentencias:
  1. sudo service mysql-ndb restart  
  2. 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:
  1. ndb_mgm  
  2. 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:
  1. 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:
  1. 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:
  1. CREATE TABLE table_test (id int) ENGINE=NDB;  
E insertamos una serie de registros:
  1. INSERT INTO table_test () VALUES (1);  
  2. INSERT INTO table_test () VALUES (2);  
  3. INSERT INTO table_test () VALUES (3);  
  4. INSERT INTO table_test () VALUES (4);  
  5. 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:
  1. USE table_test;  
Vemos que sin hacer nada el schema table_test ya existe y ahora si ejecutamos la sentencia:
  1. 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.

Comentarios

  1. Hola

    Entiendo que esta configuración es para un servidor y n clientes; pero como lo configuro si quiero que sean n servidores a los cuales se pueda conectar un cliente desde un servidor de aplicaciones.

    Gracias

    ResponderEliminar

Publicar un comentario