IngDiaz

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

¡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»

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:

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

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:


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

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

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