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)

2 comments:

  1. Hola

    Gracias por tus artículos.
    He estado investigando sobre balanceo de carga con base de datos y tengo unas preguntas.
    los servidores de bases de datos, ambos aceptan solicitudes de tipo master(lectura/escritura)?
    cuando utilizas LVS, controlas a los servidores reales y no al balanceador del MySQL , Que pasa con la función del balanceador MySQL cluster? Es reemplazado por el LVS?

    ReplyDelete
    Replies
    1. Puedes utilizar cualquiera de los dos métodos para repartir el tráfico.

      Delete