MySQL Cluster es una solución de clustering para el motor de bases de datos MySQL que permite el clustering de bases de datos en un ambiente de no compartición, es decir que cada componente de la solución tiene su propia porción de disco y memoria para operar, en su mas basica implementación MySQL Cluster debe contar con un servidor de MySQL standard y un motor de almacenamiento en memoria llamado NDB Cluster. En esta guia practica pretendo mostrarles de la forma mas basica posible la implementación de MySQL Cluster en un entorno GNU/Linux.

Antes de proceder con la guia hay que tener claro algunos conceptos:

MySQL Node: Sistema Operativo con un servicio de MySQL Node Standard.
Data Node: Sistema Operativo con un servicio de Almanenamiento NDBCluster.
Management Node: Sistema Operativo con un servicio para el manejo de los Nodos intengrantes del Cluster.

La instalación de MySQL Cluster la podemos realizar facilmente gracias a que desde la pagina web de MySQL podemos descargar diferentes binarios para cada Sistema Operativo pero de todas maneras hay que tener en cuenta cuales binarios instalamos ya que hay diferentes binarios para cada area funcional del Nodo, por ejemplo un Nodo que se va a utilizar como “MySQL Node” va a necesitar el servicio MySQLD, el “Management Node” requiere el servicio ndb_mgmtd y el “Data Node” requiere el servicio ndbd, por lo tanto no es necesario la ejecución de todos los servicios en un Nodo.

Los binarios que Oracle proporciona pueden ser de dos tipos:

  • Server: Binario que nos brinda todo lo necesario para tener una base de Datos MySQL con el soporte para el Motor NDBCLUSTER, incluyendo el Management Node, Data Node, y sus binarios.
  • Client: Nos brinda todo lo necesario para tener el cliente MySQL que nos permitirá administrar nuestra base de datos MySQL.

Cabe destacar que podemos tener ambos binarios instalados en nuestro sistema y que cada Nodo puede tener el Rol de Data, MySQL o Management.


Luego de descargados los binarios correspondientes desde la sección de Descagas de la pagina web de MySQL procedemos a instalarlos con yum o cualquier otro gestor de paquetes.


root@server # yum localinstall MySQL-Cluster-* -y

Configuración Inicial:

Cada Data o SQL Node requiere la generación o modificación del archivo /etc/my.cnf que describe dos parametros elementales: la identificación del Management Node, y la activación del Motor NDB.

El management Node requiere la generación del archivo config.ini en la cual se especificarán cuantas réplicas se van a tener, cuanta memoria de almacenamiento se utilizará, donde encontrar los Data Node y los SQL Node y donde guardar la información en cada Data Node.

Como ejemplo de implementación vamos a plantear el siguiente escenario en donde tenemos 3 servidores, 2 de los cuales van a trabajar como Data y SQL Node y uno va a trabajar como Management Node:





Como podemos observar en el escenario anterior tenemos 3 servidores con el siguiente direccionamiento IP y funcion:

Dirección IP Rol         Dirección Virtual
192.168.1.1 Data, SQL 192.168.1.100
192.168.1.2 Data, SQL 192.168.1.100
192.168.1.10 Management

El servidor que funcionara como Management Node se encargará del monitoreo de los otros dos servidores mientras los otros dos servidores funcionaran como Data y SQL Node, lo que significa que tendran un Gestor de Bases de Datos con soporte para Clustering y tendrán un servicio de Almacenamiento en donde la información será replicada entre ellos, como también compartirán una dirección IP Virtual para la redundancia.

Para configurar el Data y SQL Node procedemos a generar el archivo /etc/my.cnf con el siguiente contenido:

[mysqld]
# Options for mysqld process:
ndbcluster                      # run NDB storage engine
[mysql_cluster]
# Options for MySQL Cluster processes:
ndb-connectstring=192.168.1.10  # location of management server

Luego procedemos a configurar el Management Node creando la carpeta que contendrá su configuración:

root@server # mkdir -p /var/lib/mysql-cluster/

Y luego creando dentro de esta carpeta su archivo config.ini con el siguiente contenido:

[ndbd default]
# Options affecting ndbd processes on all data nodes:
NoOfReplicas=2    # Number of replicas
DataMemory=80M    # How much memory to allocate for data storage
IndexMemory=18M   # How much memory to allocate for index storage

[ndb_mgmd]
# Management process options:
hostname=192.168.1.10           # Hostname or IP address of MGM node
datadir=/var/lib/mysql-cluster  # Directory for MGM node log files

[ndbd]
hostname=192.168.1.1           # Hostname or IP address
datadir=/usr/local/mysql/data   # Directory for this data node’s data files

[ndbd]
hostname=192.168.1.2           # Hostname or IP address
datadir=/usr/local/mysql/data   # Directory for this data node’s data files

[mysqld]
# SQL node options:
hostname=192.168.1.1           # Hostname or IP address

[mysqld]
# SQL node options:
hostname=192.168.1.2           # Hostname or IP address

Inicialización de Servicios:

Luego desde el Management Node iniciamos el servicio con el siguiente comando:
root@server # ndb_mgmd -f /var/lib/mysql-cluster/config.ini

Luego para subir los Data Node ejecutamos en cada uno de ellos:
root@server # ndbd

Y para subir los SQL node:
root@server # service mysql start

Luego para administrar la base de Datos tendremos que configurar una contraseña para Root en los SQL Node siguiendo el siguiente procedimiento:

root@server # service mysql stop
root@server # mysqld_safe –skip-grant-tables &&
root@server # mysql -u mysql
mysql >  use mysql
mysql > UPDATE user SET password=PASSWORD(‘newpassword’) WHERE user=’root’;
root@server # service mysql restart
Verificación del Cluster desde Management Node:
Desde el Management Node ejecutamos ndb_mgm y estaremos dentro de la consola de administración en la que podemos verificar el status de nuestro cluster con los siguientes comandos internos:
  • show
  • all status
  • all report memory

Operativa de MySQL Cluster:

La forma en la que trabajamos con el Cluster es identica a trabajar con MySQL estándar solo que tenemos que especificar el motor NDBCLUSTER cuando creamos nuevas tablas de tal forma que se repliquen en los demas servidores, por ejemplo:

mysql > use prueba;
mysql > create table tabla1 (id Int, nombre varchar(30)) ENGINE=NDBCLUSTER;

SI las tablas ya estan creadas podriamos alterarlas para que trabajen con el motor NDBCLUSTER:

mysql > ALTER TABLE tabla1 ENGINE=NDBCLUSTER;

Redundancia en los Data/SQL Node:

Para la redundancia entre los servidores vamos a utilizar el protocolo VRRP que viene dentro de la solución keepalived, el cual es un servicio de enrutamiento escrito en C que podemos encontrar disponible en nuestro sistema Linux, nos proporciona una simple y robusta solución para lograr redundancia y balanceo de carga entre dos sistemas Linux, Podemos realizar su instalación desde yum:
root@server # yum install -y keepalived

Luego de instalado, procedemos a configurar el archivo /etc/keepalived/keepalived.conf en cada Data/SQL node:



vrrp_instance VI_1 {
       interface eth1
       state MASTER
       virtual_router_id 51
       priority 101
       authentication {
           auth_type PASS
           auth_pass Add-Your-Password-Here
       }
       virtual_ipaddress {
               192.168.1.100 dev eth1
       }
}

Luego reiniciamos el servicio keepalived:

root@server # service keepalived restart

Apagado del Cluster:

Para detener el Management Node bastaría con el comando:
root@server # ndb_mgm -e shutdown

Para detener los SQL Node:
root@server # service mysql stop

Para detener los Data Node matamos el servicio ndbd de la siguiente manera:
root@server # killall ndbd

Para detener la redundancia bastaría con:
root@server # service keepalived stop