MySQL Cluster 7.3.2 - Instalación y configuración

Para los que utilizan Asterisk y/o A2billing y quieren implementar un sistema de alta disponibilidad para la base de datos utilizadas, una solución puede ser una replicación maestro/esclavo o maestro/maestro. Aunque no sea una solución “total”, puede ser un buen inicio; en los casos en que se requiera un sistema que no tenga puntos de criticidad y pueda proporcionar un funcionamiento continuo y constante, la mejor opción es implementar un Cluster MySQL. Un Cluster MySQL es un sistema donde los datos de las base de datos y de las tablas se guardan de forma redundante en distintos nodos del Cluster y si un nodo se cae, los demás seguirán brindando el servicio. Un Cluster MySQL se compone de tres componentes:

  • el Management node que gestiona el Cluster MySQL
  • los nodos y grupos de nodos donde se guardan los datos de las tablas
  • los nodos SQL 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 los siguientes componentes:

  • un Management node
  • dos nodos donde se guardan los datos de las tablas
  • por lo menos un nodo para las consultas y modificaciones

Si se quiere una configuración más completa y con una redundancia más alta se aconseja la siguiente:

  • dos Management node
  • 4 nodos de datos divididos en dos grupos distintos
  • 2 nodos SQL

Esta es la configuración adoptada en este articulo. Para la prueba se han utilizado VPS de DigitalOcean, sociedad que brinda un buen servicio, buenos costos y cobro por hora. Se han creado 8 VPS con la siguiente configuración:

Cluster1

Como los Management node no necesitan muchos recursos, se han creado de 512 RAM. Para los nodos datos, que utilizan bastantes recursos, se han utilizado VPS con 2GB de RAM. Para los nodos SQL se ha utilizado VPS con 1GB de RAM.

Una vez creados los VPS, se accede a cada unos de ellos y se ejecutan las siguiente operaciones.

Se actualiza el sistema:

yum update -y

Se modifica la zona horaria y se instala el servidor para sincronizar la hora:

rm /etc/localtime

ln -s /usr/share/zoneinfo/America/Bogota /etc/localtime

yum install ntp -y

chkconfig ntpd on

service ntpd start

Se crea un partición de Swap ya que no viene con el VPS:

dd if=/dev/zero of=/swapfile bs=1024 count=512k

mkswap /swapfile

swapon /swapfile

nano /etc/fstab

/swapfile          swap            swap    defaults        0 0

chmod 0600 /swapfile

MANAGEMENT NODEs

Terminada esta operación se inicia con la configuración de los dos Management Node (198.199.77.211,198.199.88.204). Las operaciones a seguir se ejecutan en los dos servidores.

Primero se descarga el paquete con los archivos binarios (ya compilados) del MySQL Cluster:

cd /usr/src

wget http://dev.mysql.com/get/Downloads/MySQL-Cluster-7.3/mysql-cluster-gpl-7...

Se descomprime:

tar -xf mysql-cluster-gpl-7.3.2-linux-glibc2.5-i686.tar.gz

Se entra en la carpeta creada:

cd mysql-cluster-gpl-7.3.2-linux-glibc2.5-i686

Se copian los dos archivos para iniciar y gestionar el Management node:

cp bin/ndb_mgm* /usr/local/bin

Se entra en la carpeta donde se han copiados los archivos y se vuelven ejecutables:

cd /usr/local/bin
chmod +x ndb_mgm*

Se crean dos carpetas:

mkdir /usr/local/mysql
mkdir /var/lib/mysql-cluster

en la segunda es donde hay que crear el archivo de configuración del Management node y donde se guardarán los registros del sistema y el archivo de “cache” de la configuración:

se crea el archivo de configuración:

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

[ndbd default]
NoOfReplicas=2
DataMemory=512M
IndexMemory=54M

[ndb_mgmd]
NodeId=1
hostname=198.199.77.211
datadir=/var/lib/mysql-cluster

[ndb_mgmd]
NodeId=2
hostname=198.199.88.204
datadir=/var/lib/mysql-cluster

[ndbd]
hostname=192.241.135.123
datadir=/usr/local/mysql/data
NodeID=3

[ndbd]
hostname=198.199.70.76
datadir=/usr/local/mysql/data
NodeId=4

[ndbd]
hostname=208.68.37.219
datadir=/usr/local/mysql/data
NodeId=5

[ndbd]
hostname=198.211.104.17
datadir=/usr/local/mysql/data
NodeId=6

[mysqld]
NodeId=7
hostname=198.199.123.60

[mysqld]
NodeId=8
hostname=192.241.131.10

Los datos importantes:

  • NoOfReplicas=2; el numero de replicas representa el numero de nodos del Cluster donde se guardarán los datos. En este caso como se utilizarán cuatro nodos y el numero de replicas se configura en dos, significa que los cuatro nodos estarán divididos en dos grupos. Si un servidor de un grupo se cae, el segundo seguirá brindando el servicio dentro del Cluster. Para que el Cluster se caiga tendrán que caerse simultáneamente los dos servidores presentes en el mismo grupo. Esto quiere decir que si se cae un servidor de un grupo y otro del segundo grupo, el Cluster seguirá funcionando sin problemas.
  • DataMemory=512M; como el trabajos a nivel de datos se realiza a nivel de RAM, este valor va calibrado según el tamaño de las base de datos con que se va a trabajar.
  • IndexMemory=54M; lo mismo para los índices de las base de datos

En el segundo bloque se configura el primer Management node. En el tercer bloque el segundo

En los cuatro bloques que siguen se configuran los nodos de datos

En los últimos dos Bloques los nodos SQL.

Se guarda la configuración y se inician los dos nodos:

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

La primera vez que se ejecuta este comando, el programa crea un archivo de cache con la configuración del Management node. En el caso que la configuración se modifique para que el programa la actualice, hay que utilizar el siguiente comando:

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

Se ejecuta el programa de consola del Management node:

ndb_mgm

y se mira el estado del Cluster:

ndb_mgm> show

Cluster2

Como se puede ver los únicos nodos presentes son los de gestión. Para una lista de comandos disponibles en la consola del Management node:

ndb_mgm> help

Para salir:

ndb_mgm> quit

Para que el Management node se inicie con el sistema:

nano /etc/rc.local

/usr/local/bin/ndb_mgmd -f /var/lib/mysql-cluster/config.ini --configdir=/var/lib/mysql-cluster --reload

 

DATA NODEs

Se inicia la configuración de los data nodes (4) descargando y descomprimiendo nuevamente los binarios de MySQL Cluster:

cd /usr/src

wget http://dev.mysql.com/get/Downloads/MySQL-Cluster-7.3/mysql-cluster-gpl-7...

tar -xf mysql-cluster-gpl-7.3.2-linux-glibc2.5-i686.tar.gz

Se entra en la carpeta creada:

cd mysql-cluster-gpl-7.3.2-linux-glibc2.5-i686

Se copian los dos archivos necesarios para el funcionamiento de los nodos:

cp bin/ndbd /usr/local/bin/ndbd
cp bin/ndbmtd /usr/local/bin/ndbmtd

Se vuelven ejecutables los dos archivos:

cd /usr/local/bin
chmod +x ndb*

Se crea la carpeta donde se guardarán los datos de las base de datos:

mkdir /usr/local/mysql
mkdir /usr/local/mysql/data

Se modifica el archivo de configuración my.cnf borrando su contenido y copiando la líneas que siguen:

[mysqld]
datadir=/usr/local/mysql/data
socket=/var/lib/mysql/mysql.sock
user=mysql
symbolic-links=0
ndbcluster

[mysqld_safe]
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid

[mysql_cluster]
ndb-connectstring=198.199.77.211,198.199.88.204

En la línea:

ndb-connectstring se indican las dos IP de los dos Management nodes. Se guardan las modificaciones y se inician los cuatros nodos:

ndbd --initial

Cluster3

Cluster4

Cluster5

Cluster6

Como se puede ver, los cuatros nodos se conectan a la primera IP configurada en el parámetro ndb-connectstring del archivo my.cnf

Ahora desde la consola de uno de los dos Management Node:

ndb_mgm> show

Cluster7

Se verán los cuatros nodos conectados al Cluster. Dos pertenecerán al grupo 0 y dos al grupo 1.

 

SQL NODEs

Para terminar la configuración del Cluster, se configuran los dos nodos SQL. Primero se instalan unas dependencias y el cliente MySQL:

yum install perl libaio mysql -y

Se crea el usuario y grupo mysql:

groupadd mysql
useradd -g mysql mysql

Se descargan los binarios de MySQL Cluster:

cd /usr/src

wget http://dev.mysql.com/get/Downloads/MySQL-Cluster-7.3/mysql-cluster-gpl-7...

Se descomprimen en la carpeta /usr/local:

tar -C /usr/local -xf mysql-cluster-gpl-7.3.2-linux-glibc2.5-i686.tar.gz

Se crea un enlace simbólico a la carpeta /usr/local/mysql:

ln -s /usr/local/mysql-cluster-gpl-7.3.2-linux-glibc2.5-i686/ /usr/local/mysql

Se entra en la carpeta creada:

cd /usr/local/mysql

Se crean las base de datos y tablas predefinidas:

scripts/mysql_install_db --user=mysql

Se cambian algunos permisos en las carpetas y archivos creados:

chown -R root .
chown -R mysql data
chgrp -R mysql .

Se instala el script de arranque de MySQL:

cp support-files/mysql.server /etc/rc.d/init.d/mysqld
chmod +x /etc/rc.d/init.d/mysqld
chkconfig --add mysqld

Se modifica el archivo de configuración my.cnf borrando su contenido y copiando las líneas que siguen:

[mysqld]
datadir=/usr/local/mysql/data
socket=/var/lib/mysql/mysql.sock
user=mysql
symbolic-links=0
ndbcluster

[mysqld_safe]
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid

[mysql_cluster]
ndb-connectstring=198.199.77.211,198.199.88.204

Se guardan las modificaciones y se inicia el servicio:

/etc/init.d/mysqld start

Se mira lo que aparece en la consola del Management node:

ndb_mgm> show

Cluster9

Todos los nodos del Cluster están activos.

Se abre el cliente MySQL:

mysql -u root

Cluster8

Se sale del cliente y se crea una contraseña para el usuario root de MySQL:

/usr/local/mysql/bin/mysqladmin -u root password sesamo --socket=/var/lib/mysql/mysql.sock

Se vuelve a entrar con el cliente y se crea una base de datos:

mysql -u root -psesamo

mysql> create database paises;

mysql> use paises

Se crea una nueva tabla:

mysql> CREATE TABLE `City` (
  `ID` int(11) NOT NULL auto_increment,
  `Name` char(35) NOT NULL default '',
  `CountryCode` char(3) NOT NULL default '',
  `District` char(20) NOT NULL default '',
  `Population` int(11) NOT NULL default '0',
  PRIMARY KEY  (`ID`)
) ENGINE=NDBCLUSTER;

Para indicar que la tabla es parte del Cluster es imprescindible poner en el parámetro ENGINE NDBCLUSTER.

Ahora desde el node SQL1 se añade una primera entrada en la tabla:

mysql> INSERT INTO `City` VALUES (1,'Kabul','AFG','Kabol',1780000);

Desde el node SQL2 se añaden dos entradas más:

mysql> INSERT INTO `City` VALUES (2,'Qandahar','AFG','Qandahar',237500);
mysql> INSERT INTO `City` VALUES (3,'Herat','AFG','Herat',186800);

Ahora en ambos nodos SQL se ejecuta el comando:

mysql> select * from City;

El resultado será el mismo.

Ahora se paran los nodos de datos 1 y 3 (que son parte de dos grupos distintos del cluster):

Cluster10

Se vuelve a la consola MySQL del nodo SQL1 y se añade una nueva entrada en la tabla:

mysql> INSERT INTO `City` VALUES (4,'Bogota','COL','Cundinamarca',10000000);

En ambos nodos SQL se ejecuta el comando:

mysql> select * from City;

Las cuatros entradas aparecerán en ambos nodos.

Para profundizar el tema:

Costo de los servidores para esta solución: 110 dólares/mes

Vota el Articulo: 

Sin votos (todavía)
Evalúa la calidad del articulo

6 comentarios

Duda

Hola!
esta muy bien el tutorial, solo tengo una pequeña duda, en que directorio esta alojado el fichero my.cnf , en el nodo SQL??

muchas gracias un saludo

no funciona

despues de configurar todo, y todo coneztado, solo que con 5 maquinas virtuales, 1 nodo administrador, 2 nodos de datos, y 2 nodos SQL, se conectan perfectamente pero al crear una base de datos en un nodo SQL no aparece en el otro, el parametro engine se usa en la tabla o en la base de datos? , veo una sola diferencia con tu configituracion, y es que cuando aparecen los nodos conectados desde la consola de administracion con el comando show, despues de nodegroup te aparece en uno de los nodos "master" mientras que a mi me aparece el simbolo "*", como puedo ver donde esta fallando mi custer.
Muchas gracias por todo.

corregido

ya me sincroniza, nose que podia ser, despues de varias pruebas ya funciona correctamente.

Seria mucho pedir un tutorial similar pero en plataforma Windows?

Muchas gracias

Re: corregido

Hola,

me alegra que te funcione correctamente.

Para Windows lo veo difícil y la verdad la estabilidad que brinda Linux, no la brinda Windows.

Saludos

Duda tonta

Felicidades por el tutorial, esta genial, es de los más completos que he encontrado.

Pero me surge una duda al leer-lo y es que no se si debes tener instalado con antelación mysql o directamente tienes que instalar los paquetes que nos dices en el tutorial.

Muchas gracias de antemano!!

Suscribirse a Comentarios de "MySQL Cluster 7.3.2 - Instalación y configuración" Suscribirse a VozToVoice - Todos los comentarios