Instalación de un MySQL Clúster (NDB 7.5.8) en Ubuntu Server 16.04

00¡Hola a todos!

Lo primero… ¿Qué es un clúster? Se puede decir que es un conjunto de computadoras (servidores, o como sea…) unidos entre sí normalmente por una red de datos y que se comportan como si fuesen una única computadora. Básicamente eso es.

Ahora, tomado de la wiki, Clúster MySQL nos permite el clustering de bases de datos en memoria en un ambiente de no compartición.

La arquitectura de no compartición permite que el sistema gestor de base de datos (SGBD) funcione utilizando hardware no muy costoso y con requerimientos mínimos tanto de software como de hardware.

Por tanto, esta diseñado para no tener un sólo punto de falla, dado que cada componente tiene su propia porción de disco y memoria para trabajar.

En pocas palabras, es un ambiente en donde varias computadoras permiten que exista una alta disponibilidad de un servicio, el cual en éste caso, tiene que ver con el acceso a bases de datos en MySQL, además de que ofrece alto rendimiento, balanceo de carga y escalabilidad.

En Clúster MySQL tenemos los siguientes “roles”

  • El nodo de administración (Management node), que es el que gestiona en sí el Clúster MySQL.
  • Los Nodos y grupos de nodos de datos (Data nodes) donde se guardan los datos de las bases de datos (tablas, registros, etc.).
  • Los nodos SQL (SQL nodes) donde se ejecuta el servidor MySQL conectado al Cluster y donde se efectúan las consultas a las base de datos existentes.

La configuración mínima de un Cluster MySQL está compuesta por 1 Management, 2 nodos de datos y por lo menos 1 nodo para las consultas y modificaciones. Mencionar que éste tutorial lo hago en base a mis investigaciones y pruebas/errores que realicé xD

Éste sería el escenario del laboratorio que haremos:

01

Creo que esta de más mencionar que se debe de configurar cada equipo (aprovechando la virtualización seguramente) de tal manera que estén en la misma red, con sus respectivas direcciones IP’s, actualizados (sudo apt update && sudo apt upgrade), y con sus nombres de host que les facilite identificarlos (en mi caso les puse mgm, nodoa, nodob & nodosql respectivamente).


Proceso en Management Node (Nodo de administración)

Nos vamos al servidor que será el nodo de administración (10.20.30.4).

Lo primero que recomiendo es tener los privilegios de sudo; luego instalar el paquete libaio1. También, debemos de descargar del sitio de MySQL (https://dev.mysql.com/downloads/cluster/) el paquete Linux genérico de 64bits, descomprimirlo, y copiar básicamente los archivos ndb_mgm* binarios hacia la carpeta /usr/local/bin ; Adicional, les damos permisos de ejecución, creamos la carpeta /var/lib/mysql-cluster y creamos un archivo de configuración llamado config.ini

Si, sé que es tedioso lo anterior, pero lo haré así para no tener que ir explicando línea con línea. A continuación las líneas de comando de lo mencionado:

$ sudo -s
# apt install libaio1
# wget wget https://dev.mysql.com/get/Downloads/MySQL-Cluster-7.5/mysql-cluster-gpl-7.5.8-linux-glibc2.12-x86_64.tar.gz
# tar xvfz mysql-cluster-gpl-7.5.8-linux-glibc2.12-x86_64.tar.gz
# cd mysql-cluster-gpl-7.5.8-linux-glibc2.12-x86_64/
# cp bin/ndb_mgm* /usr/local/bin
# cd /usr/local/bin
# chmod +x ndb_mgm*
# mkdir /var/lib/mysql-cluster
# cd /var/lib/mysql-cluster
# nano config.ini

Ahora, el contenido del archivo config.ini deberá de tener lo siguiente:

[ndbd default]
# Opciones que afectan a los servicios ndbd en todos los nodos de datos:
NoOfReplicas=2
DataMemory=80M
IndexMemory=18M
ServerPort=2202

[ndb_mgmd]
# Opciones de nodo de administración:
HostName=10.20.30.4 # Hostname o IP del nodo de administración
DataDir=/var/lib/mysql-cluster # Directorio para guardar registros

[ndbd]
# Opciones para el nodo de datos A:
HostName=10.20.30.1 # Hostname o IP
NodeId=2 # ID del nodo A
DataDir=/usr/local/mysql/data # Directorio para los archivos de datos

[ndbd]
# Opciones para el nodo de datos A:
HostName=10.20.30.2 # Hostname o IP
NodeId=3 # ID del nodo B
DataDir=/usr/local/mysql/data # Directorio para los archivos de datos

[mysqld]
# Opciones para el nodo SQL:
HostName=10.20.30.3 # Hostname o IP

Iniciamos el nodo de administración:

# ndb_mgmd -f /var/lib/mysql-cluster/config.ini --configdir=/var/lib/mysql-cluster/

Y para que al iniciar el server se inicie también éste servicio, hacemos:

# nano /etc/rc.local

Dentro del archivo rc.local , debemos de agregar la siguiente línea ANTES de exit 0 , o sea así deberían de quedar las últimas 2 líneas:

ndb_mgmd -f /var/lib/mysql-cluster/config.ini --configdir=/var/lib/mysql-cluster/
exit 0

Copiamos el paquete que descargamos en el servidor desde el sitio de MySQL hacia los demás nodos así:

# scp ~/mysql-cluster-gpl-7.5.8-linux-glibc2.12-x86_64.tar.gz usuario@10.20.30.1://tmp
# scp ~/mysql-cluster-gpl-7.5.8-linux-glibc2.12-x86_64.tar.gz usuario@10.20.30.2://tmp
# scp ~/mysql-cluster-gpl-7.5.8-linux-glibc2.12-x86_64.tar.gz usuario@10.20.30.3://tmp

Donde “Usuario” es el usuario que se creó durante la instalación de cada servidor Ubuntu al que se hace referencia… para éste ejemplo, el usuario se llama “Usuario”. Realizamos la copia dado que lo utilizaremos en cada uno de dichos servidores.


Proceso en Date Node A y B (Nodo de datos)

Éste procedimiento aplica tanto para el nodo de datos A como en el B (10.20.30.1 & 10.20.30.2).

Necesitamos los privilegios de sudo, instalamos el paquete libaio1, copiamos el paquete que descargamos en el nodo de administración y que luego copiamos a éste en la carpeta /tmp, lo movemos, descomprimimos, copiamos ndbd y ndbmtd en /usr/local/bin, asignamos permisos de ejecución y creamos el archivo de configuración my.cnf. Así:

$ sudo -s
# apt install libaio1
# mv /tmp/mysql-cluster-gpl-7.5.8-linux-glibc2.12-x86_64.tar.gz ~
# tar xvfz mysql-cluster-gpl-7.5.8-linux-glibc2.12-x86_64.tar.gz
# cd mysql-cluster-gpl-7.5.8-linux-glibc2.12-x86_64/
# cp bin/ndbd /usr/local/bin/ndbd
# cp bin/ndbmtd /usr/local/bin/ndbmtd
# cd /usr/local/bin
# chmod +x ndb*
# nano /etc/my.cnf

Dentro del archivo my.cnf dejamos lo siguiente:

[mysqld]
 # Opciones para el servicio mysqld:
 ndbcluster # Ejecutar el motor de almacenamiento del NDB

[mysql_cluster]
 # Options for NDB Cluster processes:
 ndb-connectstring=10.20.30.4  # Nodo de administración

Ahora creamos un par de carpetas necesarias e iniciamos el servicio ndbd para que se “pegue” al nodo de administración. Adicional, hacemos que el servicio ndbd se inicie al encender el servidor.

# mkdir /usr/local/mysql
# mkdir /usr/local/mysql/data
# ndbd
# nano /etc/rc.local

Dentro de dicho archivo, agregar antes de “exit 0” (para efectos de demostración, se mostrará como quedarían las últimas 2 líneas):

ndbd 
exit 0

Recordar nada más que eso sería haría tanto en el Nodo de datos A y B. Idéntico.


Proceso en SQL Node (Nodo SQL)

Ahora nos vamos al servidor que es el nodo SQL (10.20.30.3).

Necesitamos los privilegios de sudo, instalamos el paquete libaio1, creamos un grupo llamado mysql, creamos un usuario llamado mysql y lo agregamos al grupo que creamos anteriormente, movemos el paquete que habíamos copiado desde el nodo de administración de /tmp a ~ , descomprimimos y movemos la carpeta entera hacia /usr/local ; luego, creamos un enlace simbólico de dicha parte para que se llame mysql (personalmente pienso que sería mejor cambiarle el nombre con mv, pero así estaba en la documentación oficial de MySQL y por eso lo dejé así xD ), entramos a la carpeta bin del MySQL e inicializamos el servicio. El procedimiento sería:

$ sudo -s
# apt install libaio1
# groupadd mysql
# useradd -g mysql -s /bin/false mysql
# mv /tmp/mysql-cluster-gpl-7.5.8-linux-glibc2.12-x86_64.tar.gz ~
# tar xvfz mysql-cluster-gpl-7.5.8-linux-glibc2.12-x86_64.tar.gz 
# mv mysql-cluster-gpl-7.5.8-linux-glibc2.12-x86_64 /usr/local/ 
# ln -s /usr/local/mysql-cluster-gpl-7.5.8-linux-glibc2.12-x86_64 /usr/local/mysql 
# cd /usr/local/mysql/bin 
# ./mysqld --initialize

Al finalizar el proceso anterior, se genera una clave aleatoria… Se debe de copiar dicha clave dado que se utilizará más adelante. ¡ES IMPORTANTE!.

a02

En la imagen de ejemplo, se puede ver que la clave para este caso, fue RwvfX;kfr7,k

Ahora, asignaremos el usuario propietario y grupo a las carpetas y copiamos el archivo de gestión del servicio en /etc/init.d ; asignamos el permiso de ejecución y crearemos el archivo my.cnf.

# cd ..
# chown -R root .
# chown -R mysql data
# chgrp -R mysql .
# cp support-files/mysql.server /etc/init.d/
# chmod +x /etc/init.d/mysql.server
# nano /etc/my.cnf

Dentro del archivo my.cnf dejamos lo siguiente:

[mysqld]
 # Opciones para el servicio mysqld:
 ndbcluster # Ejecutar el motor de almacenamiento del NDB

[mysql_cluster]
 # Options for NDB Cluster processes:
 ndb-connectstring=10.20.30.4  # Nodo de administración

Ahora habilitamos el servicio, inicializaremos el servicio del MySQL y parametrizamos la instalación del MySQL para darle más seguridad.

# systemctl enable mysql.server
# service mysql.server start
# bin/mysql_secure_installation

En éste proceso, se solicitará la clave aleatoria generada anteriormente, la cual se deberá de digitarse y, luego, podemos personalizar la clave root; Después, el asistente solicita que se contesten varias preguntas de seguridad… se configura al antojo o según las necesidades de ustedes.A continuación, un ejemplo:

a03


Pruebas de funcionamiento…

Bien, hasta aquí todo va bien, ¡éste es el momento de la verdad!. Nos vamos al servidor que es el nodo de administración (10.20.30.1) y verificamos si se han pegado los otros 3 servidores a la administración. Sería así:

# sudo ndb_mgm -e show

Éste comando es importante (ndb_mgm), dado que es el cliente de administración para verificar el estado del clúster, ejecutar copias de seguridad, y realizar otras funciones administrativas.

En la salida de la línea de comando anterior, tendrían que aparecer los cuatro ID’s defnidos en los archivos de configuración (config.ini y los my.cnf) con sus respectivas IP’s versión de ndb y, en el caso de los nodos de datos, el NodeGroup (es cero en nuestro caso).

001

Si esta bien, pues ya lo demás es vanidad jajajj. Menciono solo algunas cosas importantes a tomar en cuenta:

  • El primer servidor que debería de estar encendido (o servicio iniciado) es el de administración, porque él es quien gestiona en sí el clúster. Sé que es lógico pero es necesario mencionarlo.
  • De ahí, se deben de encender (o iniciar el servicio) los nodos de datos; el orden de si primero A o B en sí no importa para nuestro laboratorio.
  • Finalmente, se debería de encender (o iniciar el servicio) el nodo SQL.

Ok, dentro del nodo SQL (10.20.30.3) procederemos a entrar en el cliente MySQL, crearemos una base de datos nueva, una tabla nueva e insertaremos un registro en dicha tabla (para hacer las verdaderas pruebas); notar en la creación de la tabla que se utilizará el motor NDBCLUSTER, el cual es sumamente importante éste detalle… dado que si no se crean las tablas con éste motor no se replicará la data.

# /usr/local/mysql/bin/mysql -u root -p
mysql> create database prueba;
mysql> use prueba;
mysql> create table mitabla1 (campo1 varchar(50), campo2 varchar(50)) engine=ndbcluster;
mysql> insert into mitabla1 values ('uno','uno');
mysql> select * from mitabla1;

Ahora, apagamos (sudo shutdown -h now) el nodo de datos A (10.20.30.1) y hacemos nuevamente el “select * from mitabla1;” en el nodo SQL, para comprobar que sigue funcionando el acceso a la base de datos.

Si nos vamos al servidor que es el nodo de administración (10.20.30.4), al hacer un “sudo ndb_mgm -e show” veremos que esta abajo el Nodo de datos A.

Encendemos el nodo de datos A (10.20.30.1) hasta que cargue el SO y chequeamos nuevamente en el nodo de administración (10.20.30.4) para ver si se visualiza el nodo de datos A activo (recordar ejecutar el sudo ndb_mgm -e show)

De ahí, pueden apagar ahora el nodo de datos B (10.20.30.2) y ver si de igual forma pueden hacer el “select” a la tabla desde el nodo SQL (10.20.30.3).

De más estaría mencionar que, si están apagados los nodos de datos A y B, no tendremos acceso a la data desde el nodo SQL; Además, si esta apagado el nodo SQL, es como que no tengamos un cliente MySQL para entrar a ver la data xD

Bueno, eso sería todo. Si hay dudas de algo, lo pueden mencionar en los comentarios. ¡Saludos!

Fuente: https://dev.mysql.com/doc/refman/5.7/en/mysql-cluster-installation.html

Comentarios por Facebook

comentarios

9 respuestas a “Instalación de un MySQL Clúster (NDB 7.5.8) en Ubuntu Server 16.04”

  1. Muchas gracias, me sirvio de lujo. Una pregunta, hay alguna manera para acceder a mysql que no sea /usr/local/mysql/bin/mysql -u root -p es decir… con apt-get install myqsl-server, accedes a mysql asi > mysql -u root -p. Hay forma de poder cambiar a esta manera?. Gracias.

  2. Primero felicitarte por el post! y segundo me gustaría hacerte una pregunta:
    Comentas que si se cae el Nodo A puedes seguir accediendo a la BD y viceversa, pero si se cae el Nodo SQL como es lógico no accederemos a ningún nodo BD.
    Que pasa si se cae el Nodo MGM? Seguimos teniendo acceso a las BD?
    Tambien he visto que cabe la posibilidad de poner un segundo Nodo SQL para que en caso de que perdamos uno, sigamos teniendo acceso. MySQL te proporciona una IP Virtual entre esos dos nodos SQL o tendría que utilizar un balanceador tipo HAProxy?.
    Esto ultimo no se si se te habrá ocurrido o habrás buscado algo de información.
    Un saludo y gracias de antemano.

    • ¡Buen día! Gracias. Referente a las preguntas, si se cae el nodo MGM entiendo que ya no se puede tener acceso a la data dado que éste es quien gestiona el cluster. Se pueden agregar varios nodos sql creo que de la misma manera en como se mira en el tutorial, lo único es que, en el archivo config.ini , se debe de agregar con un ID diferente. Algo así:
      [MYSQLD]

      [MYSQLD]

      Pero esto es en teoría, dado que no lo he comprobado. Espero haber respondido a las consultas. ¡Saludos!

  3. una pregunta, si al seguir tus pasos el nodo mysql osea el ultimo que configuras aparece como no conectado en el manager al hacer el sudo ndb_mgm -e show, que puedo hacer?

    • Hola. Verifica que esté bien la configuración del ID tanto en el manager como en el nodo mysql. Revisa el estado del servicio también, para ver si esta iniciado y, la otra (como todo un buen informático…) reinicia todos los servers, iniciando cada uno en el orden adecuado. ¡Saludos!

  4. Hola, no podemos conectar el nodo SQL, no nos da la clave qie deberia de dar en esta parte ./mysqld –initialize y lo demás menos, porfa podrías ayudarme?

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

*