Enviado por admin el
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:
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
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
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
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
Todos los nodos del Cluster están activos.
Se abre el cliente MySQL:
mysql -u root
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):
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:
- MySQL Cluster fault tolerance – impact of deployment decisions
-
Introducción a MySQL Cluster
- La guía oficial
Costo de los servidores para esta solución: 110 dólares/mes
6 comentarios
Duda
Enviado por Ugisam (no verificado) el
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
Re: Duda
Enviado por admin el
Hola,
en CentOS en /etc/my.cnf
Me cuentas.
Saludos
no funciona
Enviado por ugisam (no verificado) el
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
Enviado por Ugisam (no verificado) el
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
Enviado por admin el
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
Enviado por omunoz (no verificado) el
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!!