Cluster de MySQL en Ubuntu 11.10
May 03
El motor de base de datos MySQL cuenta con el servicio de cluster el cual permite realizar replicas de las tablas a través de los diferentes maquinas pertenecientes al cluster permitiendo aumentar la tolerancia a fallos del sistema, así como la escalabilidad al permitir también utilizar un proxy que redirecciona las peticiones a los diferentes nodos de datos del cluster permitiendo un balanceo de cargas al momento de realizar operaciones sobre las tablas.
La configuracion basica de un cluster de MySQL cuenta con dos elementos principales :
- Administrador del Cluster :
Una maquina encargada del manejo del cluster la cual identifica el estado de los nodos y las transacciones de replicacion - Nodos de Datos :
Maquinas que almacena los datos de las tablas clusterizadas y que permiten el acceso a ellas para realizar las operaciones de insertar, actualizar, borrar
- Crear una maquina virtual con el software mínimo para su funcionamiento :
- Instalar VirtualBox 4.x http://www.virtualbox.org
- Descargar la iso del sistema operativo Ubuntu 11.10 de 32bits http://releases.ubuntu.com/11.10/ubuntu-11.10-server-i386.iso
Instalación de la Maquina Virtual :
- Iniciar Virtual Box
- Crear Maquina Virtual :
- Crear una nueva maquina virtual
- Seguir los pasos del Wizard
- Seleccionar el tipo de sistema operativo Linux ya la version Ubuntu
- Se puede dejar los 512 MB de memoria RAM
- Crear un disco virtual con la información por defecto (8 GB de espacio)
- Finalizar la creación de la maquina virtual
- Cambios en la Configuración Inicial :
- Presionar el botón Settings
- Habilitar el PAE/NX en la sección Processor de System
- Ir a Settings -> Storage
- Remover el disco duro del arbol de dispositivos, seleccionarlo y utilizar el boton con el menos
- Remover el controlador SATA dando click sobre el Storage Controller ya que este no se utilizara
- Adicionar el disco duro como IDE haciendo click sobre el controlador y adicionando un nuevo disco
- Montar CD de instalación :
- Seleccionar en la pantalla el CD Empty
- Adicionar el archivo iso al manejador de medios virtuales
- Enlazarlo al CD
- Iniciar la Maquina
- Instalación de Ubuntu Server
- Seleccionar el idioma
- Presionar la tecla F4 y seleccionar minimal virtual machine
- Seleccionar la opción Install Ubuntu Server
- Seleccionar el idioma de instalación
- Seleccionar el Pais
- Detectar la distribución del teclado
- Suministrar el nombre del servidor : ubuntu
- Configurar la zona horaria
- Particionar el disco utilizando la opción guiada
- Se realiza la instalación base del sistema
- Suministrar información del usuario
- Nombre de usuario : ubuntu
- Clave : ubuntu
- No encriptar directorio home
- No realizar actualizaciones automáticas
- Seleccionar el Software a Instalar :
- Basic Ubuntu Server
- OpenSSH Server
- Instalar el GRUB
- Terminar la instalación
- Reiniciar (Recuerde quitar el archivo ISO como archivo del CD)
- Entrar a la maquina
- Eliminar la información de cache de las interfaces de red
sudo rm /etc/udev/rules.d/70-persistent-net.rules - Editar el archivo de reglas de red
sudo vi /lib/udev/rules.d/75-persistent-net-generator.rules - Busque la linea :
# ignore KVM virtual interfaces - Adicione antes de esta linea las siguientes lineas :
# ignore VirtualBox virtual interfaces ENV{MATCHADDR}=="08:00:27:*", GOTO="persistent_net_generator_end" - Guarde el archivo
Instalación MySQL :
- Iniciar la maquina virtual recien creada
- Entrar como el usuario administrador
- Instalar el MySQL con el comando
sudo apt-get install mysql-server - Asignar la clave del administrador de MySQL
- Instalar el paquete de cluster
sudo apt-get install mysql-cluster-server
Clonar las Maquinas :
- Clonar la maquina virtual recién instalada cuatro (4) veces
- No olvide activar la opción de reinicializar la dirección MAC para las tarjetas de red para que tomen IPs diferentes
- Iniciar todas las maquinas, conectarse a cada una y obtener la ip con el comando ifconfig
- La maquinas virtuales son :
- MySQL Master (192.168.0.108)
- MySQL Node 1 (192.168.0.110)
- MySQL Node 2 (192.168.0.109)
- MySQL Proxy (192.168.0.111)
Configuración del Maestro :
- Entrar a la maquina MySQL Master
- Editar el archivo de configuración sudo
vi /etc/mysql/ndb_mgmd.cnf) - Busque las IPs de las maquinas y cámbielas por su configuración
[NDBD DEFAULT]
NoOfReplicas=2
DataMemory=256M # How much memory to allocate for data storage
IndexMemory=18M # How much memory to allocate for index storage
[MYSQLD DEFAULT]
[NDB_MGMD DEFAULT]
[TCP DEFAULT]
# Section for the cluster management node
[NDB_MGMD]
# IP address of the management node (this system)
HostName=192.168.0.108
#For multiple management nodes we just create more [NDB_MGMD] sections for each node
# Section for the storage nodes
[NDBD]
# IP address of the first storage node
HostName=192.168.0.110
DataDir=/var/lib/mysql-cluster
BackupDataDir=/var/lib/mysql-cluster/backup
DataMemory=512M
[NDBD]
# IP address of the second storage node
HostName=192.168.0.109
DataDir=/var/lib/mysql-cluster
BackupDataDir=/var/lib/mysql-cluster/backup
DataMemory=512M
# one [MYSQLD] per storage node
#These do not require any configuration, they are the “front-end” access to our data
[MYSQLD]
[MYSQLD]
Configuración de los Nodos :
- En cada una de las maquinas
- Editar el archivo
sudo vi /etc/mysql/my.cnf - Debajo de la Linea
[mysqld] - Adicionar las lineas ndbcluster ndb-connectstring=192.168.0.108
- Al final del archivo adicionar
[mysql_cluster]
ndb-connectstring=192.168.0.108 - Crear los directorios de backup del nodo sudo mkdir /var/lib/mysql-cluster/backup sudo chown mysql:mysql -R /var/lib/mysql-cluster
Iniciar el Cluster :
- Se debe iniciar el Cluster en el siguiente orden :
- Entrar a la maquina MySQL Master
- Ejecutar el comando
sudo /etc/init.d/mysql-ndb-mgm restart - Mensajes de salida :
2012-05-02 22:48:01 [MgmtSrvr] INFO -- The default config directory '/usr/mysql-cluster' does not exist. Trying to create it...
2012-05-02 22:48:01 [MgmtSrvr] INFO -- Sucessfully created config directory [ OK ] - Adicionar los nodos al cluster
- Ejecutar el comando :
sudo /etc/init.d/mysql-ndb restart - Mensajes de Salida :
2012-05-02 22:49:04 [ndbd] INFO -- Angel connected to '192.168.0.108:1186'
2012-05-02 22:49:04 [ndbd] INFO -- Angel allocated nodeid: 2 [ OK ] - Reiniciar el servidor de MySQL
sudo /etc/init.d/mysql restart - Mensajes de Salida :
* Stopping MySQL database server mysqld [ OK ]
* Starting MySQL database server mysqld [ OK ]
* Checking for tables which need an upgrade, are corrupt or were
Prueba del Cluster :
- En la maquina MySQL Master
- Ejecutar el cliente del cluster
sudo ndb_mgm - Ejecutar el comando show que visualice la informacion del cluster
show <ENTER>
Connected to Management Server at: localhost:1186
Cluster Configuration ---------------------
[ndbd(NDB)] 2 node(s)
id=2 @192.168.0.110 (mysql-5.1.51 ndb-7.1.9, Nodegroup: 0, Master)
id=3 @192.168.0.109 (mysql-5.1.51 ndb-7.1.9, Nodegroup: 0)
[ndb_mgmd(MGM)] 1 node(s)
id=1 @192.168.0.108 (mysql-5.1.51 ndb-7.1.9)[mysqld(API)] 2 node(s)
id=4 @192.168.0.110 (mysql-5.1.51 ndb-7.1.9)
id=5 @192.168.0.109 (mysql-5.1.51 ndb-7.1.9)
Probar una Base de Datos :
- Entrar al servidor MySQL Node 1
- Ejecutar el client de MySQL
mysql -u root -p - Crear la base de datos pruebacluster
create database pruebacluster;
use pruebacluster; - Crear una tabla usuarios que usa el motor de clusterizacion, insertar valores y consultar
create table usuario(nombre char(8), clave char(8)) engine=ndbcluster;
insert into usuario values ('pedro','12345');
select * from usuario; - Entrar en el servidor MySQL Node 2
- Ejecutar el client de MySQL
mysql -u root -p - Conectarse a la base de datos de prueba y listar los usuarios
use pruebacluster;
select * from usuario;
Prueba de Replicacion :
- Desde la maquina MySQL Node 2 detener el servicio de mysql
sudo service mysql stop - Desde la maquina MySQL Node 1, insertar nuevos registros
mysql -u root -p
use pruebacluster;
select * from usuario;
insert into usuario values ('juan','12345'); - Detener el servicio de MySQL en el Node 1
sudo service mysql stop - Ir a la maquina MySQL Node 2, iniciar el servidor de MySQL y consultar la base de datos
sudo service mysql start
use pruebacluster;
select * from usuario; - Debe aparecer el usuario creado mientras la base de datos estaba detenida
Usar un Balanceador de Cargas :
- En cada uno de los nodos
- Habilitar las conexiones remotas
- Editar el archivo de configuracion
sudo vi /etc/mysql/my.cnf - Buscar la linea
bind-address = 127.0.0.1 - Cambiar la direccion 127.0.0.1 por la ip de la maquina o por 0.0.0.0
- Crear un usuario para conectarse desde el proxy
- Ejecutar los comandos
mysql -u root -p
use mysql - Adicionar el usuario con el que se conectaran los usuarios al cluster desde el proxy suministrando
nombre de usuario (ejemplo root), ip del proxy (ejemplo 192.168.0.111) y clave (ubuntu) :
grant all on *.* to 'root'@'192.168.0.111' identified by 'ubuntu'; - Reiniciar el servicio de mysql en los nodos cliente
sudo service mysql restart - Instalar el Balanceador de Cargas
- Conectarse a la maquina MySQL Proxy
Instalar el software necesario
sudo apt-get install mysql-proxy - Ejecute el proxy dando las direcciones IP de los dos nodos de datos
mysql-proxy --plugins=proxy --proxy-backend-addresses=192.168.0.109:3306 --proxy-backend-addresses=192.168.0.110:3306 - Pulsar las teclas
Ctrl+A D - Conectarse al proxy con el comando
mysql -u root -p -h 192.168.0.111 -P 4040
Nota :
- Recuerde cambiar las IPs de esta guía por las IPs de las maquinas que va a usar
- Si se cambia la configuracion como la IP del equipo debe removerse la configuracion antigua
sudo rm /usr/mysql-cluster/ndb_1_config.bin.1 - Esta guía no contempla configuraciones de seguridad
- Se usa el usuario root como ejemplo para conectarse desde el proxy pero esto no es recomendable, use los usuarios de las base de datos que estarán en el cluster
- Esta es una guía educativa sobre clusterizacion en MySQL



Es una aplicación muy parecida al Real aplication Cluster de Oracle, bueno, MySQL es de Oracle, lo que si noté es que en un ambiente en producción esta implementación de cluster de Mysql tiene problemas con indices, tablas en memoria, Bulk inserts, y consume mucha RAM ya que es un storage basado en memoria y las claves primarias siempre permanecen en RAM, por lo que recomiendo la replicación nativa Mastar/Master de MySQL para tener un sistema tolerante a fallos en ambientes reales.