lunes, 2 de noviembre de 2009

Como hacer un Clúster con MYSQL-Cluster.

Para aquellos que llevamos alguna carrera derivada de la informática, les traduzco como hacer un Mysql-Cluster (o simplemente clúster) con ubuntu (o derivados de debian con sus respectivas modificaciones por permisos y gestor de paquetes). Traduzco, Traduzco, Traduzco:

Para un correcto funcionamiento necesitarás 3 máquinas como mínimo. La primera máquina será el nodo administrador, y las otras dos serán los nodos de almacenamiento.

Durante la configuración, logueate en las máquinas como superusuario para obtener acceso de root permantente y no tener que escribir "sudo" cada vez que tengas que guardar algún cambio.
Úsalo con precaución.

INSTALANDO MYSQL:
Usando "apt" es facilísimo. Solo teclea el comando siguiente en las tres máquinas para instalar MySQL server.
#apt-get install mysql-server
Una vez instalado, te preguntará la contraseña root de la base de Datos de MySQL (recuérdala, es muy necesaria después). Despues de instalado, procedemos a configurar el nodo administrador.

CONFIGURANDO EL NODO ADMINISTRADOR:
Crea y edita el archivo /etc/mysql/ndb_mgmd.cnf. Copia y pega el siguiente texto cambiando las direcciones IP para que coincidan en tu configuración (i.e. las IP de tus máquinas).

[NDBD DEFAULT]
NoOfReplicas=2 #Numero de replicas
DataMemory=80M # Memoria para almacenamiento
IndexMemory=18M # Memoria para almacenamiento de los índices
# For DataMemory and IndexMemory, we have used the
# default values. Since the "world" database takes up
# only about 500KB, this should be more than enough for
# this example Cluster setup.
[MYSQLD DEFAULT]
[NDB_MGMD DEFAULT]
[TCP DEFAULT]
# Section for the cluster management node
[NDB_MGMD]
# Direccion IP para el nodo administrador. (this system)
HostName=192.168.1.5
# Section for the storage nodes
[NDBD]
# IP para el primer nodo de almacenamiento
HostName=192.168.1.6
DataDir=/var/lib/mysql-cluster
BackupDataDir=/var/lib/mysql-cluster/backup
DataMemory=512M
[NDBD]
# Dirección IP para el segundo nodo de almacenamiento
HostName=192.168.1.7
DataDir=/var/lib/mysql-cluster
BackupDataDir=/var/lib/mysql-cluster/backup
DataMemory=512M
# one [MYSQLD] per storage node
[MYSQLD]
[MYSQLD]

CONFIGURANDO LOS NODOS DE ALMACENAMIENTO:
Como pudiste observar en el archivo que hemos creado en el paso anterior, el cluster estará utilizando /var/lib/mysql-cluster en las máquinas de almacenamiento. Este directorio es creado cuando instalas MySQL server pero el dueño es root. Ahora vamos a crear un directorio de respaldo (backup) y cambiar su dueño a mysql.
#mkdir /var/lib/mysql-cluster
#chown -R mysql:mysql /var/lib/mysql-cluster
Ahora necesitaremos editar la configuracion de MySQL para poder configurar los nodos de almacenamiento con el nodo administrador. Edita
#nano /etc/mysql/my.cnf
NOTA: Puedes utilizar cualquier editor de textos (nano, pico, emacs, vi, vim, kate.... )

Busca [mysqld] Y agrega lo sigueinte:
[mysqld]
ndbcluster
# Dirección IP del nodo administrador:
ndb-connectstring=192.168.1.5

Baja hasta encontrar:
[MYSQL_CLUSTER].
Descomenta la línea (quita el #) para que quede como:
[MYSQL_CLUSTER]
ndb-connectstring=192.168.1.5

La razón por la cual la cadena de conexion se encuentra dos veces en el archivos de configuración de MySQL es por que en una es utilizado por el MySQL server y el otro es utilizado por la aplicación de los nodos de datos (ndb data node app). Guarda cambios. Asegúrate de realizar los cambios a ambos nodos.

INICIAR EL NODO ADMINISTRADOR
Inicializa el nodo administrador utilizando:
#/etc/init.d/mysql-ndb-mgm restart
Una vez reiniciado, podemos acceder utilizando el comando ndb_mgm.
#ndb_mgm
Con lo cual te aparecerá un prompt. Escribe
>show;
Deberías ver:
Connected to Management Server at: localhost:1186
Cluster Configuration
---------------------
[ndbd(NDB)] 2 node(s)
id=2 (not connected, accepting connect from 192.168.1.6)
id=3 (not connected, accepting connect from 192.168.1.7)
[ndb_mgmd(MGM)] 1 node(s)
id=1 @192.168.1.5 (Version: 5.0.51)
[mysqld(API)] 2 node(s)
id=4 (not connected, accepting connect from any host)
id=5 (not connected, accepting connect from any host)

Como puedes observar, el nodo administrador esta esperando las conecciones de los nodos de almacenamiento.

INICIALIZAR LOS NODOS DE ALMACENAMIENTO:
En los nodos de almacenamiento:
#/etc/init.d/mysql restart
#/etc/init.d/mysql-ndb restart
NOTA: En todo este proceso, no debes de haber cerrado la shell del nodo administrador, pues de lo contrario se cancelan las conexiones. Asi que te recomiendo que dejes abierto el shell donde escribiste el ndb_mgs:show; para que puedas ver los cambios.

Regresa al nodo administrador y veras algo como:
id=2 @192.168.1.6 (Version: 5.0.51, starting, Nodegroup: 0)
id=3 @192.168.1.7 (Version: 5.0.51, starting, Nodegroup: 0)
Cluster Configuration
---------------------
[ndbd(NDB)] 2 node(s)
id=2 @192.168.1.6 (Version: 5.0.51, Nodegroup: 0, Master)
id=3 @192.168.1.7 (Version: 5.0.51, Nodegroup: 0)
[ndb_mgmd(MGM)] 1 node(s)
id=1 @192.168.1.5 (Version: 5.0.51)
[mysqld(API)] 2 node(s)
id=4 @192.168.1.7 (Version: 5.0.51)
id=5 @192.168.1.6 (Version: 5.0.51)

¡Felicidades, tu clúster ya está en funcionamiento!

PROBANDO EL CLUSTER
Vamos a crear una base de datos de pruebas. En ambos nodos vamos a crear una base de datos manualmente:
$> mysql -u root -p
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 8
Server version: 5.0.51a-3ubuntu5.1 (Ubuntu)
Type 'help;' or '\h' for help. Type '\c' to clear the buffer.

mysql> create database clustertest;
Query OK, 1 row affected (0.00 sec)

Una vez echo en UNO de los nodos de almacenamiento, creamos una tabla de nombre "test" (o el nombre que quieras) y agregamos una entrada.

mysql> use clustertest;
Database changed
mysql> create table test (i int) engine=ndbcluster;
Query OK, 0 rows affected (0.71 sec)
mysql> insert into test values (1);
Query OK, 1 row affected (0.05 sec)
mysql> select * from test;
+------+
i
+------+
1
+------+
1 row in set (0.03 sec)

Hemos creado una tabla test, agregando un valor a esta tabla y asegurandonos que contenga una entrada. Nota que engine=ndbcluster debe ser utilizado para hacerle conocer a MySQL que la tabla debe ser 'clusterizada' a través de los nodos de almacenamiento. Asegurémonos que la tabla haya sido creada en el otro nodo y que contiene una entrada:
mysql> use clustertest;
Database changed


Leyendo la informacion de la tabla para conocer la complexion y el nombre de las columnas. Puedes evitar esta caracteriztica para mayor rapidez con un -A.mysql> show tables;
+-----------------------+
Tables_in_clustertest
+-----------------------+
test
+-----------------------+
1 row in set (0.01 sec)
mysql> select * from test;
+------+
i
+------+
1
+------+
1 row in set (0.04 sec)

Como observarás, el cluster esta trabajando. Si no entendiste el ejemplo, en un nodo agrega un dato, y en el otro pones el >select * from test; y verás como se va refrezcando.

MOVIENDO UNA BASE DE DATOS EXISTENTE AL CLUSTER:
Ahora que tenemos el cluster trabajando, podemos facilmente cambiar una base de datos existente para 'clusterizarla'. Todo lo que necesitar es correr el siguiente comando en cada una de las tablas.
>alter table my_test_table engine=ndbcluster;
La tabla y todos sus datos serán copiados a los nodos de almacenamiento y podrás acceder/cambiarlos después a traves de cualquier nodo en el cluster. Muy Simple...


Agradecimientos a MattDark por el link.

10 comentarios:

Miguel Ángel Salgado Velázquez dijo...

Compañero, muchas gracias!!!

Llevo varias horas buscando como configurar un cluster de mysql precisamente en plataforma de linux, pero la verdad no encontraba mas que información compleja y difícil de entender, hasta que encontré tu blog, muy bien explicado.

Y gracias de antemano, porque me imagino que tu hiciste esta entrada precisamente por la escasa información al grano del cluster en la web. Gracias!!!

skantonio dijo...

Que tal bro segui los pasos al pie de la letra y me sale este error:

Node 2: Forced node shutdown completed. Occured during startphase 0. Caused by error 2805: 'Illegal file system path(Configuration error). Permanent error, external action needed'.

Ya googlee pero no he encontrado una solucion me podrias ayudar?

Espero tu respuesta salu2

Doctrine Dark dijo...

Skantonio:
En que distro estas? (ubuntu, fedora, debian, red hat)
Intenta realizar los pasos como superusuario (sudo su en consola + contraseña) y el directorio donde manejes tu directorio web (tipicamente /var/www)

Ing. Jesús Uzcanga dijo...

Hola, voy a iniciar un proyecto para closterizar varias sedes cada uno su propio server pero tengo el siguiente problema.

La aplicación de escritorio que utilizan solo corre en Mysql-Server 4.1.x por lo cual no puedo trabajar con las últimas versiones de cluster.

Sabes si puedo conseguir los programas de cluster dentro de algún instalador de 4.1.x o Donde puedo conseguirlos?

Gracias de antemano

Zirkan René Cortés Ramos dijo...

Ing. Jesús Uzcanga:
En que distro te encuentras??? o trabajas sobre windows???
Para encontrar las versiones anteriores de Mysql entra a:
http://dev.mysql.com/downloads/
o más específicamente:
http://downloads.mysql.com/archives.php
Si tienes alguna otra duda, no dudes en comentarla.
Saludos.

issamar dijo...

Si cuando ejecuto el comando show despues de ndb_mgm en el nodo que configure como administrador nos aparece como Master, nquiere decir que mi cluster esta mal???

Zirkan René Cortés Ramos dijo...

@issamar
Te ocasiona algun error? Intenta crear y almacenar una BD clusterizada (tablas con engine=ndbcluster) y si te permite el almacenamiento, ya quedó ;)

issamar dijo...

@Zirkan René Cortés Ramos
Gracias!!! ya lo verifique y si permite crear las tablas como tu dijiste, gracias de nuevo

Zirkan René Cortés Ramos dijo...

De nada. Estamos para servirte.

Juanpa dijo...

hola tengo un problema, todos los nodos de datos se logran conectar al management pero los nodos sql no, se inician normalmente como si no estuvieran configurados para ndbcluster, cuando ejecuto el comando show si se muestran los otros nodos, ya probe poner los nodos sql en diferentes maquinas e incluso en las mismas maquinas donde estan los nodos de datos pero nada. Ya busque por todos lados y segui muchos tutoriales pero nada
utilizo fedora 17 alguna recomendacion?