Montar un cluster de MySQL

25
65579

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.

25 COMENTARIOS

  1. 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!

  2. 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.

  3. 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.

  4. 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.

  5. 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.

  6. 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

  7. Estimado, tengo problemas para poder conectar los server SQL en el log de MGMD sale «WARNING — Failed to allocate nodeid for API at 192.168.2.38. Returned error: ‘No free node id found for mysqld(API).'»

    y cuanbdo levanto el mysql no se conecta y sale lo siguiente
    «150827 18:21:38 InnoDB: 1.1.8 started; log sequence number 1595675
    150827 18:22:12 [Warning] NDB: server id set to zero – changes logged to bin log with server id zero will be logged with another server id by slave mysqlds
    »
    Por favor tu ayuda para saber como puedo solucionar este problema.

    saludos

  8. Muchas gracias por el tutorial, la verdad es que a este nivel se me escapan los conceptos… a la hora de programa en PHP, ¿hay que tener algo en cuanta si se usa MySQL Cluster? O símplemente es a la hora de crear las tablas…

    Muchas gracias!!!

  9. Hola Ruben.
    Estoy en un dilema, no se que gestor de base de datos usar. Estudie TIC y en la carrera me enseñaron a utilizar Oracle para las Bases de Datos y programar en NetBeans. En el ultimo proyecto que desarrolle utilice NetBeans instalado en mi Mac y el Oracle instalado en una maquina virtual con windows 7. Formatie mi lap y respalde base de datos y el proyecto de NetBeans pero ahora no se si utilizar de nuevo el Oracle en la maquina virtual ya que un compañero me ha recomendado no usar maquina virtual y utilizar sequel y MySQL.
    Que podrías recomendarme?

  10. holaaaa miguel que tal, pues muy bien el tutorial pero necesito mas detalles en como crear un cluster de cero hasta llegar trabajar con ello.
    es un trabajo de fin de carrera.

  11. hola buen día,

    Antes que nada excelente post. Y mi duda es que en estos momentos no puedo ver mi BD del cluster. Inician bien mis dos nodos y al momento de conectarme desde mysql y consultar la BD no me aparece la BD o en dado caso sale una hay una BD pero es local la cual solo 6 tablas me muestar pero son las locales. Y no se puede conectar a la BD del cluster.

    Tendrán alguna forma de ayudarme.
    Este es mi management y los servicios me conecta de forma correcta pero no veo la información de los nodos.

    — NDB Cluster — Management Client —
    ndb_mgm> show
    Connected to Management Server at: localhost:1186
    Cluster Configuration
    ———————
    [ndbd(NDB)] 2 node(s)
    id=2 @10.200.0.6 (mysql-5.6.31 ndb-7.4.12, Nodegroup: 0, *)
    id=3 @10.200.0.7 (mysql-5.6.31 ndb-7.4.12, Nodegroup: 0)

    [ndb_mgmd(MGM)] 1 node(s)
    id=1 @10.200.0.4 (mysql-5.6.31 ndb-7.4.12)

    [mysqld(API)] 1 node(s)
    id=4 @10.200.0.8 (mysql-5.6.31 ndb-7.4.12)

  12. Hola Ruben, Te hago una consulta.
    Supongamos un escenario donde tengamos dos nodos MYSQLD, en ambos nodos el trabajo es generar consultas del tipo INSERT. Como se maneja el tema de las claves primarias, ya que el ultimo registro de una tabla podría tener el id 4 (suponiendo que es auto_increment) y ambos nodos hacen una insercion (Ambos van a querer insertar la id 5).
    Un caso mas critico supongamos que cae la linea de comunicación del nodo A. El nodo B seguiría almacenando datos, id 5, 6, 7, …. Al igual que el nodo A que almacenaría los datos en su propio equipo, como se la arregla para no usar los mismos indices, y mas aun si usa los mismos indices y vuelve la linea de comunicación, cuando se quiera sincronizar se rompería todo.

    Agradezco tu tutorial, muy buen trabajo. Saludos

  13. Hola,

    ¿Es posible instalar un phpmyadmin para poder acceder a la base de datos sin usar cli ?
    ¿Esto es como un tipo balanceo de carga pero a nivel mysql ?

  14. Hola Rubén,

    Tu publicación me sirvió mucho para realizar una maqueta de MySQL clúster, ahora quisera saber cuánto es lo mínimo recomendable en memoria para los nodos que se usarán como MGM y NDB. Muchas gracias

  15. Hola, tengo una aplicación web en un servidor publico, mi cliente quiere tener disponible esta aplicación en el caso de dejar de tener conexión con el servidor público, pienso copiar la aplicación en Un servidor local, y utilizando MySQL Cluster, puedo tener “sincornizadas” las bases cuando no tenga acceso a internet y cuando está se reestablezca actualizad estos datos en el público ?

DEJA UNA RESPUESTA

Por favor ingrese su comentario!

He leído y acepto la política de privacidad

Por favor ingrese su nombre aquí

Información básica acerca de la protección de datos

  • Responsable:
  • Finalidad:
  • Legitimación:
  • Destinatarios:
  • Derechos:
  • Más información: Puedes ampliar información acerca de la protección de datos en el siguiente enlace:política de privacidad