Cómo configurar un clúster MySQL 8 de tres nodos en Debian 10

MySQL es un sistema de gestión de bases de datos relacional, gratuito y de código abierto. Se utiliza para almacenar datos con diversos fines, como el almacenamiento de datos, el comercio electrónico y las aplicaciones de registro. MySQL Cluster es una tecnología que proporciona escalabilidad y disponibilidad a bajo coste.

En este tutorial, utilizaremos un nodo maestro para almacenar la configuración del clúster y dos nodos de datos para almacenar los datos del clúster. La dirección IP de cada nodo se muestra a continuación:

  • Nodo Maestro o Gestor – 104.245.33.61
  • Nodo de Datos1 – 104.245.32.195
  • Nodo de Datos2 – 69.87.218.169

Requisitos previos

  • Tres servidores con Debian 10, uno para el nodo gestor y los otros son nodos de datos.
  • Se establece una contraseña de root en cada servidor.

Cómo empezar

En primer lugar, tendrás que actualizar todos los servidores a la última versión. Puedes actualizarlos todos con el siguiente comando:

apt-get update -y

Una vez actualizados todos los servidores, puedes pasar al siguiente paso.

Instalar y configurar MySQL Cluster Manager

En primer lugar, tendrás que instalar el paquete de gestión del clúster MySQL en el nodo Maestro. Por defecto, este paquete no está incluido en el repositorio por defecto de Debian 10. Así que tendrás que descargarlo del sitio web oficial de MySQL.

Puedes descargarlo con el siguiente comando:

wget https://cdn.mysql.com//Downloads/MySQL-Cluster-8.0/mysql-cluster-community-management-server_8.0.24-1debian10_amd64.deb

Tras descargar el archivo deb, instálalo con el siguiente comando:

dpkg -i mysql-cluster-community-management-server_8.0.24-1debian10_amd64.deb

Una vez completada la instalación, crea un directorio para almacenar la configuración del clúster con el siguiente comando:

mkdir /var/lib/mysql-cluster

A continuación, crea un nuevo archivo de configuración con el siguiente comando:

nano /var/lib/mysql-cluster/config.ini

Añade las siguientes líneas:

[ndbd default]
NoOfReplicas=2  # Number of replicas

[ndb_mgmd]
# Management process options:
hostname=104.245.33.61 #IP of the MySQL Cluster Manager
datadir=/var/lib/mysql-cluster
[ndbd]
hostname=104.245.32.195 #IP of the first data node
NodeId=2            # Node ID for this data node
datadir=/usr/local/mysql/data   # Remote directory for the data files
[ndbd]
hostname=69.87.218.169 #IP of the second data node
NodeId=3            # Node ID for this data node
datadir=/usr/local/mysql/data   # Remote directory for the data files
[mysqld]
# SQL node options:
hostname=104.245.33.61 #IP of the MySQL Cluster Manager

Guarda y cierra el archivo cuando hayas terminado y, a continuación, inicia el gestor de clústeres con el siguiente comando:

ndb_mgmd -f /var/lib/mysql-cluster/config.ini

Deberías obtener la siguiente salida:

MySQL Cluster Management Server mysql-8.0.24 ndb-8.0.24
2021-05-10 08:23:05 [MgmtSrvr] INFO     -- The default config directory '/usr/mysql-cluster' does not exist. Trying to create it...
2021-05-10 08:23:05 [MgmtSrvr] INFO     -- Sucessfully created config directory

Ahora, mata el servidor en ejecución con el siguiente comando:

pkill -f ndb_mgmd

A continuación, crea un archivo de servicio systemd para que MySQL Cluster Manager gestione el servicio:

nano /etc/systemd/system/ndb_mgmd.service

Añade las siguientes líneas:

[Unit]
Description=MySQL NDB Cluster Management Server
After=network.target auditd.service
[Service]
Type=forking
ExecStart=/usr/sbin/ndb_mgmd -f /var/lib/mysql-cluster/config.ini
ExecReload=/bin/kill -HUP $MAINPID
KillMode=process
Restart=on-failure
[Install]
WantedBy=multi-user.target

Guarda y cierra el archivo y vuelve a cargar el demonio systemd con el siguiente comando:

systemctl daemon-reload

A continuación, inicia el Gestor de Clústeres y habilítalo para que se inicie al reiniciar el sistema con el siguiente comando:

systemctl start ndb_mgmd
systemctl enable ndb_mgmd

Ahora puedes comprobar el estado del servicio con el siguiente comando:

systemctl status ndb_mgmd

Deberías obtener la siguiente salida:

    ? ndb_mgmd.service - MySQL NDB Cluster Management Server
   Loaded: loaded (/etc/systemd/system/ndb_mgmd.service; disabled; vendor preset: enabled)
   Active: active (running) since Mon 2021-05-10 08:23:53 UTC; 6s ago
  Process: 984 ExecStart=/usr/sbin/ndb_mgmd -f /var/lib/mysql-cluster/config.ini (code=exited, status=0/SUCCESS)
 Main PID: 985 (ndb_mgmd)
    Tasks: 12 (limit: 2359)
   Memory: 6.5M
   CGroup: /system.slice/ndb_mgmd.service
           ??985 /usr/sbin/ndb_mgmd -f /var/lib/mysql-cluster/config.ini

May 10 08:23:53 master systemd[1]: Starting MySQL NDB Cluster Management Server...
May 10 08:23:53 master ndb_mgmd[984]: MySQL Cluster Management Server mysql-8.0.24 ndb-8.0.24
May 10 08:23:53 master systemd[1]: Started MySQL NDB Cluster Management Server.

Cuando hayas terminado, puedes pasar al siguiente paso.

Instalar y configurar nodos de datos

A continuación, vamos a paquete de nodos de datos en otros servidores y configurarlo para comunicarse con MySQL Cluster Manager.

En primer lugar, instala las dependencias necesarias en ambos nodos de datos con el siguiente comando:

apt-get install libclass-methodmaker-perl -y

Una vez instaladas todas las dependencias, descarga la última versión del archivo deb de Nodos de Datos MySQL con el siguiente comando:

wget https://cdn.mysql.com//Downloads/MySQL-Cluster-8.0/mysql-cluster-community-data-node_8.0.24-1debian10_amd64.deb

Una vez finalizada la descarga, instala el archivo descargado con el siguiente comando:

dpkg -i mysql-cluster-community-data-node_8.0.24-1debian10_amd64.deb

Por defecto, los nodos de datos almacenan todas las configuraciones en el archivo /etc/my.cnf.

Por tanto, crea un nuevo archivo /etc/my.cnf en ambos nodos de datos con el siguiente comando:

nano /etc/my.cnf

Añade la IP del clúster como se muestra a continuación:

[mysql_cluster]
# Options for NDB Cluster processes:
ndb-connectstring=104.245.33.61 #IP of the MySQL Cluster Manager

Guarda y cierra el archivo y, a continuación, crea un directorio de datos en ambos nodos de datos:

mkdir -p /usr/local/mysql/data

Ahora, inicia los nodos de datos con el siguiente comando:

ndbd

Deberías obtener la siguiente salida:

2021-05-10 08:27:13 [ndbd] INFO     -- Angel connected to '104.245.33.61:1186'
2021-05-10 08:27:13 [ndbd] INFO     -- Angel allocated nodeid: 2

A continuación, mata el proceso ndbd en ejecución con el siguiente comando:

pkill -f ndbd

A continuación, crea un archivo de servicio systemd para ndbd en ambos nodos de datos con el siguiente comando:

nano /etc/systemd/system/ndbd.service

Añade las siguientes líneas:

[Unit]
Description=MySQL NDB Data Node Daemon
After=network.target auditd.service
[Service]
Type=forking
ExecStart=/usr/sbin/ndbd
ExecReload=/bin/kill -HUP $MAINPID
KillMode=process
Restart=on-failure
[Install]
WantedBy=multi-user.target

Guarda y cierra el archivo y, a continuación, vuelve a cargar el demonio systemd con el siguiente comando:

systemctl daemon-reload

A continuación, inicia el servicio ndbd y haz que se inicie al reiniciar el sistema con el siguiente comando:

systemctl start ndbd
systemctl enable ndbd

También puedes comprobar el estado del servicio ndbd con el siguiente comando:

systemctl status ndbd

Deberías obtener la siguiente salida:

? ndbd.service - MySQL NDB Data Node Daemon
   Loaded: loaded (/etc/systemd/system/ndbd.service; disabled; vendor preset: enabled)
   Active: active (running) since Mon 2021-05-10 08:28:28 UTC; 12s ago
  Process: 740 ExecStart=/usr/sbin/ndbd (code=exited, status=0/SUCCESS)
 Main PID: 741 (ndbd)
    Tasks: 46 (limit: 2359)
   Memory: 827.1M
   CGroup: /system.slice/ndbd.service
           ??741 /usr/sbin/ndbd
           ??742 /usr/sbin/ndbd

May 10 08:28:28 data1 systemd[1]: Starting MySQL NDB Data Node Daemon...
May 10 08:28:28 data1 ndbd[740]: 2021-05-10 08:28:28 [ndbd] INFO     -- Angel connected to '104.245.33.61:1186'
May 10 08:28:28 data1 ndbd[740]: 2021-05-10 08:28:28 [ndbd] INFO     -- Angel allocated nodeid: 2
May 10 08:28:28 data1 systemd[1]: Started MySQL NDB Data Node Daemon.

Instalar y configurar el servidor MySQL

A continuación, descargaremos e instalaremos los paquetes Servidor y Cliente MySQL en el Nodo Gestor del Cluster MySQL.

En primer lugar, descarga la última versión de MySQL Cluster Bundle utilizando el siguiente comando:

wget https://cdn.mysql.com/Downloads/MySQL-Cluster-8.0/mysql-cluster_8.0.24-1debian10_amd64.deb-bundle.tar

A continuación, extrae el archivo descargado dentro del directorio /opt con el siguiente comando:

tar -xvf mysql-cluster_8.0.24-1debian10_amd64.deb-bundle.tar -C /opt

A continuación, cambia el directorio a /opt e instala las dependencias necesarias con el siguiente comando:

cd /opt
apt-get install libaio1 libmecab2 libnuma1 psmisc -y

A continuación, instala el archivo deb Común MySQL con el siguiente comando:

dpkg -i mysql-common*

A continuación, instala los paquetes Cliente MySQL con el siguiente comando:

dpkg -i mysql-cluster-community-client_8.0.24-1debian10_amd64.deb mysql-cluster-community-client-core_8.0.24-1debian10_amd64.deb mysql-cluster-community-client-plugins_8.0.24-1debian10_amd64.deb
dpkg -i mysql-client_8.0.24-1debian10_amd64.deb
dpkg -i mysql-cluster-community-server*

Si aparece algún error de dependencia, ejecuta el siguiente comando:

apt-get install -f

A continuación, instala el paquete Servidor MySQL con el siguiente comando:

dpkg -i mysql-server_8.0.24-1debian10_amd64.deb

Durante la instalación, se te pedirá que establezcas una contraseña de root de MySQL.

Después de instalar el servidor MySQL, tendrás que editar el archivo de configuración principal de MySQL y definir la IP del clúster:

nano /etc/mysql/my.cnf

Añade las siguientes líneas:

[mysqld]
# Options for mysqld process:
ndbcluster                      # run NDB storage engine
[mysql_cluster]
# Options for NDB Cluster processes:
ndb-connectstring=104.245.33.61  #IP of the MySQL Cluster Manager

Guarda y cierra el archivo cuando hayas terminado. A continuación, reinicia el servicio MySQL y habilítalo para que se inicie al reiniciar el sistema:

systemctl restart mysql
systemctl enable mysql

Puedes comprobar el estado del servidor MySQL con el siguiente comando:

systemctl status mysql

Deberías ver la siguiente salida:

? mysql.service - MySQL Cluster Community Server
   Loaded: loaded (/lib/systemd/system/mysql.service; enabled; vendor preset: enabled)
   Active: active (running) since Mon 2021-05-10 08:35:04 UTC; 7s ago
     Docs: man:mysqld(8)
           http://dev.mysql.com/doc/refman/en/using-systemd.html
  Process: 1950 ExecStartPre=/usr/share/mysql-8.0/mysql-systemd-start pre (code=exited, status=0/SUCCESS)
 Main PID: 1985 (mysqld)
   Status: "Server is operational"
    Tasks: 47 (limit: 2359)
   Memory: 372.0M
   CGroup: /system.slice/mysql.service
           ??1985 /usr/sbin/mysqld

May 10 08:35:01 master systemd[1]: Starting MySQL Cluster Community Server...
May 10 08:35:04 master systemd[1]: Started MySQL Cluster Community Server.

Cuando hayas terminado, puedes pasar al siguiente paso.

Probar el Cluster MySQL

Ahora, hemos instalado y configurado con éxito el Cluster MySQL de tres nodos. A continuación, deberás verificar si funciona o no.

En primer lugar, accede al nodo MySQL Cluster Manager e inicia sesión en MySQL con el siguiente comando:

mysql -u root -p

Proporciona tu contraseña de root de MySQL y, a continuación, comprueba la información del clúster con el siguiente comando:

mysql> SHOW ENGINE NDB STATUS \G

Si todo va bien, deberías obtener la siguiente salida:

*************************** 1. row ***************************
  Type: ndbclus
  Name: connection
Status: cluster_node_id=4, connected_host=104.245.33.61, connected_port=1186, number_of_data_nodes=2, number_of_ready_data_nodes=2, connect_count=0
*************************** 2. row ***************************
  Type: ndbclus
  Name: NdbTransaction
Status: created=2, free=2, sizeof=392
*************************** 3. row ***************************
  Type: ndbclus
  Name: NdbOperation
Status: created=4, free=4, sizeof=944
*************************** 4. row ***************************
  Type: ndbclus
  Name: NdbIndexScanOperation
Status: created=0, free=0, sizeof=1152
*************************** 5. row ***************************
  Type: ndbclus
  Name: NdbIndexOperation
Status: created=0, free=0, sizeof=952
*************************** 6. row ***************************
  Type: ndbclus
  Name: NdbRecAttr
Status: created=0, free=0, sizeof=88
*************************** 7. row ***************************
  Type: ndbclus
  Name: NdbApiSignal
Status: created=16, free=16, sizeof=144
*************************** 8. row ***************************
  Type: ndbclus
  Name: NdbLabel
Status: created=0, free=0, sizeof=200
*************************** 9. row ***************************
  Type: ndbclus
  Name: NdbBranch
Status: created=0, free=0, sizeof=32
*************************** 10. row ***************************
  Type: ndbclus
  Name: NdbSubroutine
Status: created=0, free=0, sizeof=72
*************************** 11. row ***************************
  Type: ndbclus
  Name: NdbCall
Status: created=0, free=0, sizeof=24
*************************** 12. row ***************************
  Type: ndbclus
  Name: NdbBlob
Status: created=0, free=0, sizeof=592
*************************** 13. row ***************************
  Type: ndbclus
  Name: NdbReceiver
Status: created=0, free=0, sizeof=128
*************************** 14. row ***************************
  Type: ndbclus
  Name: NdbLockHandle
Status: created=0, free=0, sizeof=48
*************************** 15. row ***************************
  Type: ndbclus
  Name: binlog
Status: latest_epoch=897648164875, latest_trans_epoch=820338753551, latest_received_binlog_epoch=0, latest_handled_binlog_epoch=0, latest_applied_binlog_epoch=0
15 rows in set (0.00 sec)

Ahora, sal del intérprete de comandos de MySQL con el siguiente comando:

mysql> exit

Ahora, realizaremos otra prueba para confirmar que el clúster funciona correctamente.

Conecta la consola de gestión del Cluster con el siguiente comando:

ndb_mgm

Deberías ver la siguiente salida:

-- NDB Cluster -- Management Client --
ndb_mgm>

Ahora, ejecuta el siguiente comando para comprobar todos los ndoes de datos:

ndb_mgm> SHOW

Deberías obtener la siguiente salida:

Connected to Management Server at: 104.245.33.61:1186
Cluster Configuration
---------------------
[ndbd(NDB)]	2 node(s)
id=2	@104.245.32.195  (mysql-8.0.24 ndb-8.0.24, Nodegroup: 0, *)
id=3	@69.87.218.169  (mysql-8.0.24 ndb-8.0.24, Nodegroup: 0)

[ndb_mgmd(MGM)]	1 node(s)
id=1	@104.245.33.61  (mysql-8.0.24 ndb-8.0.24)

[mysqld(API)]	1 node(s)
id=4	@104.245.33.61  (mysql-8.0.24 ndb-8.0.24)

Para comprobar el estado del primer nodo de datos, ejecuta el siguiente comando:

ndb_mgm> 2 STATUS

Deberías ver la siguiente salida:

Node 2: started (mysql-8.0.24 ndb-8.0.24)

Para comprobar el estado del segundo nodo de datos, ejecuta el comando siguiente:

ndb_mgm> 3 STATUS

Deberías ver la siguiente salida:

Node 3: started (mysql-8.0.24 ndb-8.0.24)

Conclusión

Enhorabuena! has instalado y configurado con éxito un clúster MySQL de tres nodos en un servidor Debian 10. Ahora puedes utilizar esta configuración en el entorno de producción para conseguir escalabilidad y disponibilidad.

También te podría gustar...