Feb 28, 2009

Cluster para base de datos (III)

Para finalizar la exposición del sistema de bases de datos replicadas, se van a mostrar las herramientas necesarias para monitorizar los nodos del cluster MySQL. También se va a desarrollar un ejemplo para comprobar el correcto funcionamiento del sistema configurado.

Si se ejecuta el comando ndb_mgm en el nodo frontal activo (HA1), accederemos a la consola de administración (Management Client) del cluster MySQL. Dentro de esta consola tendremos a nuestra disposición un promt (ndb_mgm>) a través del cual podremos ejecutar distintos comandos. Para ver una lista de las órdenes disponibles teclearemos la orden help.

El comando más interesante que vamos a ver será show, el cual nos ofrecerá información sobre el estado de los nodos de del cluster.

root@ha1:~# ndb_mgm
-- NDB Cluster -- Management Client --
ndb_mgm> show
Connected to Management Server at: localhost:1186
Cluster Configuration
---------------------
[ndbd(NDB)] 2 node(s)
id=2 @10.0.0.12 (Version: 5.0.67, Nodegroup: 0, Master)
id=3 @10.0.0.13 (Version: 5.0.67, Nodegroup: 0)

[ndb_mgmd(MGM)] 1 node(s)
id=1 @10.0.0.20 (Version: 5.0.67)

[mysqld(API)] 2 node(s)
id=4 @10.0.0.12 (Version: 5.0.67)
id=5 @10.0.0.13 (Version: 5.0.67)


Como puede observase en la salida anterior, se tiene un nodo de administración del cluster (ndb_mgmd) con la dirección IP 10.0.0.20 (es decir, máquina desde la cual estamos ejecutando el comando show, HA1).

También se tienen un par de nodos de almacenamiento (ndbd) en donde estará a la escucha el demonio de MySQL (mysqld) para atender peticiones (lectura o escritura en la base de datos). Estos dos nodos tendrán las direcciones IP 10.0.0.12 y 10.0.0.13 (LB1 y LB2).

Para salir de la consola de administración del cluster tendremos que ejecutar el comando quit.

A continuación vamos a hacer la prueba de crear una base de datos para ser utilizada por el cluster. Esta operación la repetiremos en ambos nodos de almacenamiento (LB1 y LB2). Para ello nos conectaremos en primer lugar al demonio de MySQL mediante el usuario root.

~# mysql -u root -p
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 28
Server version: 5.0.67-0ubuntu6 (Ubuntu)

Type 'help;' or '\h' for help. Type '\c' to clear the buffer.

mysql> show databases;
+--------------------+
Database
+--------------------+
information_schema
mysql
+--------------------+
2 rows in set (0.00 sec)


Si ejecutamos el comando show databases; para mostrar los nombres de las bases de datos existentes, podremos ver que ya tenemos dos bases de datos por defecto: information_schema y mysql. Mediante el comando create database my_dbcluster;, crearemos una tercera base de datos denominada my_dbcluster.

mysql> create database my_dbcluster;
Query OK, 1 row affected (0.01 sec)

mysql> show databases;
+--------------------+
Database
+--------------------+
information_schema
my_dbcluster
mysql
+--------------------+
3 rows in set (0.00 sec)

Para abandonar la consola de conexión con el demonio de MySQL, bastará con ejecutar el comando quit;. Recordar que la base de datos se deberá crear en cada uno de los nodos de almacenamiento (LB1 y LB2 para el caso del cluster que se está desarrollando).

Y ya por último con el objetivo de comprobar la correcta sincronización de los nodos de almacenamiento, y en su defecto, el correcto comportamiento global del cluster MySQL, se va a realizar la prueba de crear una tabla denominada test_table dentro de la base de datos my_dbcluster, todo ello en la máquina LB1. A su vez, dentro de dicha tabla se creará un campo de tipo entero llamado i.

root@lb1:~# mysql -u root -p
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 31
Server version: 5.0.67-0ubuntu6 (Ubuntu)

Type 'help;' or '\h' for help. Type '\c' to clear the buffer.

mysql> use my_dbcluster;
Database changed
mysql> create table test_table (i int) engine=ndbcluster;
Query OK, 0 rows affected (0.34 sec)


Dentro de la tabla (campo i), insertaremos el número entero 1. Cuando se cree una tabla en un nodo de almacenamiento, automáticamente será replicada al resto de nodos de almacenamiento, así como los datos insertados en ella.

mysql> insert into test_table values (1);
Query OK, 1 row affected (0.01 sec)

mysql> select * from test_table;
+------+
i
+------+
1
+------+
1 row in set (0.00 sec)

Si el sistema está bien configurado, al realizar un listado de las tablas existentes en la base de datos my_dbcluster pero desde el segundo nodo de almacenamiento (LB2), podremos ver que también se habrá creado automáticamente una tabla llamada test_table cuyo campo i estará inicializado con el valor 1.

root@lb2:~# mysql -u root -p
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 32
Server version: 5.0.67-0ubuntu6 (Ubuntu)

Type 'help;' or '\h' for help. Type '\c' to clear the buffer.

mysql> use my_dbcluster;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed
mysql> show tables;
+------------------------+
Tables_in_my_dbcluster
+------------------------+
test_table
+------------------------+
1 row in set (0.01 sec)

mysql> select * from test_table;
+------+
i
+------+
1
+------+
1 row in set (0.01 sec)

Feb 22, 2009

Cluster para base de datos (II)

En el artículo anterior y continuando con el desarrollo del sistema de alta disponibilidad y balanceo de carga, expuse la teoría conceptual del cluster MySQL. En esta entrada se van a diseñar las configuraciones que nos permitirán establecer dicho sistema de bases de datos replicadas.

En los dos nodos frontales (HA1 y HA2) configuraremos el demonio de administración (ndb_mgmd). Pero al conformar estos dos nodos un sistema de alta disponibilidad activo-pasivo, el demonio estará arrancado únicamente en el nodo activo. En caso de caída de este nodo, el nodo pasivo tomará el rol de activo y levantará dicho demonio.

En los dos nodos traseros (LB1 y LB2) se configurará el demonio de MySQL (mysqld) destinado a atender las queries y el demonio encargado de comunicarse con el sistema de administración del cluster (ndb_mgm).

Lo primero que vamos a hacer es instalar mysql-server en los cuatro nodos (versión 5.0.67). El proceso de instalación nos solicitará una contraseña para el usuario root de MySQL.

~# aptitude install mysql-server

Después configuraremos el ndb_mgmd en los nodos HA1 y HA2 a través del fichero /etc/mysql/ndb_mgmd.cnf. La sección [NDB_MGMD] se utilizará para especificar las propias características del demonio ndb_mgmd. Posteriormente se definirá un bloque [NDBD] por cada uno de los nodos de almacenamiento existentes (en nuestro caso dos, LB1 y LB2).

A continuación se muestra el fichero de configuración del demonio ndb_mgmd para los nodos HA1 y HA2 (el archivo no existe, tendremos que crearlo previamente):

~# cat /etc/mysql/ndb_mgmd.cnf
[NDBD DEFAULT]

# Número de nodos de almacenamiento
# (Número de réplicas para cada tabla almacenada en el cluster)
NoOfReplicas=2

# Memoria reservada para el almacenamiento de datos
DataMemory=80M

# Memoria reservada para el almacenamiento de índices
IndexMemory=18M

[MYSQLD DEFAULT]

[NDB_MGMD DEFAULT]

[TCP DEFAULT]

# Sección dedicada al nodo de administración del cluster
[NDB_MGMD]

# Dirección IP donde permanecerá a la escucha el demonio ndb_mgmd
HostName=10.0.0.20

# Sección dedicada al nodo de almacenamiento LB1
[NDBD]

# Dirección IP del nodo de almacenamiento LB1
HostName=10.0.0.12

# Directorio utilizado por el cluster de MySQL en la máquina local
DataDir=/var/lib/mysql-cluster

# Directorio empleado para el área compartida
BackupDataDir=/var/lib/mysql-cluster/backup

# Memoria RAM empleada para guardar las bases de datos
DataMemory=256M

# Sección dedicada al nodo de almacenamiento LB2
[NDBD]

# Dirección IP del nodo de almacenamiento LB2
HostName=10.0.0.13


# Directorio utilizado por el cluster de MySQL en la máquina local
DataDir=/var/lib/mysql-cluster


# Directorio empleado para el área compartida
BackupDataDir=/var/lib/mysql-cluster/backup


# Memoria RAM empleada para guardar las bases de datos
DataMemory=256M


[MYSQLD]
[MYSQLD]

Para que los cambios surjan efecto, reiniciaremos el demonio ndb_mgmd:

~# /etc/init.d/mysql-ndb-mgm restart

Una vez configurada la parte de administración, le tocará el turno a la de almacenamiento. Los nodos encargados de albergar las bases de datos van a ser LB1 y LB2, por lo tanto tendremos que editar el fichero /etc/mysql/my.cnf con el siguiente contenido:

~# cat /etc/mysql/my.cnf
...
# Sección utilizada por el demonio mysqld
[mysqld]


# Dirección IP del nodo de administración
ndbcluster

ndb-connectstring=10.0.0.20
...
bind-address=0.0.0.0
...

# Sección utilizada por el demonio ndbd
[MYSQL_CLUSTER]


# Dirección IP del nodo de administración
ndb-connectstring=10.0.0.20
...


Por último, crearemos un directorio compartido para los nodos de almacenamiento (/var/lib/mysql-cluster/backup) y le pondremos como propietario al usuario mysql (ejecutaremos un chown recursivo para que se modifique el propietario de todos los elementos contenidos dentro del directorio).

~# mkdir /var/lib/mysql-cluster/backup

~# chown -R mysql:mysql /var/lib/mysql-cluster


Para que los cambios surjan efecto, reiniciaremos los demonios mysqld y ndb_mgm:

~# /etc/init.d/mysql restart

~# /etc/init.d/mysql-ndb-mgm restart

En el siguiente artículo cerraremos el desarrollo del cluster para base de datos, mostrando los parámetros de monitorización del sistema y creando una base de datos con sus correspondientes tablas, con el objetivo de analizar el correcto funcionamiento de los nodos.

Feb 1, 2009

Cluster para base de datos (I)

MySQL Cluster es una tecnología que permite clusterizar distintas bases de datos en memoria y en un área de trabajo no compartida. En el Sistema de Alta Disponibilidad y Balanceo de Carga que estamos configurando (el último punto que tratamos fue el servicio FTP mediante vsftpd), se configurará una base de datos en cluster utilizando para ellos los cuatro nodos del sistema.

La arquitectura de no compartición permite que el sistema global funcione sin ningún requerimiento especial hardware y software, y el riesgo de fallo de la infraestructura sea mínimo debido a que se empleará la memoria y el disco de cada una de las máquinas involucradas, y en caso de caída de alguna de ellas, el sistema seguiría funcionando correctamente con los elementos restantes.

MySQL Cluster integra el servidor MySQL estándar junto con un motor de almacenamiento clusterizado en memoria denominado NDB. Se denomina MySQL Cluster a la solución resultante de combinar MySQL y dicho motor de almacenamiento.

En un esquema MySQL Cluster mínimo, existen tres tipos de nodos diferentes:

  • Nodo de administración (MGM): tiene la función de administrar el resto de nodos del cluster (configuraciones, iniciar y detener nodos, realizar copias de seguridad, etc). Los servicios utilizados por este tipo de nodo son ndb_mgmd (Management Server) y ndb_mgm (Management Client).
  • Nodo SQL: tiene la función de acceder a los datos del cluster y ofrecer dicha información a las aplicaciones solicitantes. El servicio utilizado por este tipo de nodo es mysqld (MySQL Server).
  • Nodo de datos: almacena los datos del cluster. El servicio utilizado por este tipo de nodo es ndbd (NDB Server).

En la figura anterior puede observarse que el sistema está formado por dos elementos principales: el cluster de MySQL y las aplicaciones clientes que interactúan con él, como por ejemplo un cliente MySQL.

Dentro del cluster, se distinguen tres componentes. La aplicación que hace de interfaz real entre los clientes y el cluster en sí, es MySQL Server (mysqld). Pueden existir tantos demonios de MySQL Server como sean necesarios. Como se ha comentado anteriormente, la tarea de este tipo de nodo será la de ofrecer la información a los clientes, proveniente ésta de los nodos de almacenamiento, y la de copiar los datos que estos mismos clientes deseen almacenar en el cluster.

Cuando se produzca una operación de escritura, MySQL Server accederá a uno de los nodos de almacenamiento (ndbd) y escribirá la información en él. A su vez, este mismo nodo replicará la información al resto de nodos de almacenamiento.

Y por último, el nodo de administración (ndb_mgmd) tendrá la misión de dirigir toda esta infraestructura (controlar qué nodos están funcionando, iniciar o detener servicios, realizar copias de seguridad, etc). Este demonio será controlado por una aplicación cliente (ndb_mgm).

Como puede observarse en el esquema anterior, si uno de los nodos de almacenamiento se cae, el sistema seguirá funcionando correctamente. Cuando se vuelva a recuperar, actualizará la información a la que contengan el resto de nodos de datos. Si se cae alguno de los nodos MySQL Server, tampoco ocurrirá nada, ya que las aplicaciones clientes seguirán comunicándose con el nodo o nodos restantes.

En el siguiente artículo trasladaré este tipo de infraestructura al Sistema de Alta Disponibilidad y Balanceo de Carga que estoy desarrollando.