A partir del mysql 5, es posible replicar servidores de bases de datos MySql, algo que no mucha gente usa por el hecho que no siempre se dispone del acceso a la administración de más de un servidor.
Esta serie de posts tiene como objetivos:
1) Dar a conocer esta extraordinaria funcionalidad de MySql
2) Comentar mi experiencia en un proyecto que utiliza 5 servidores de mysql replicados en diferentes ubicaciones geográficas.
3) Retomar este tipo de post didáctico que hace mucho abandoné por falta de tiempo.
Ver primero la parte 1: “Introducción a la replicación” o ve como solucionar problemas de replicación de mysql
Caso Práctico de replicación de bases de datos
Imaginemos que tenemos sistema requiere de dos servidores de base de datos que tengan la misma información. Pero como nuestro sistema tiene un módulo de estadÃsticas, necesitamos que uno de ellos mantenga históricamente todos los registros mientras que el otro sólo mantenga los últimos 30 dÃas para que las consultas sean mucho más rápidas ya que es información que se vuelve obsoleta y por lo tanto innecesaria fuera del módulo de estadÃsticas.
Realizar dos conexiones a dos bases de datos distintas para ejecutar nuestros inserts/updates es poco eficiente y poco seguro, serÃa común ver inconsistencias. Para este caso, entonces, nada mejor que realizar una replicación.
Configuraremos entonces para que que el servidor maestro replique hacia el slave todos los inserts y updates que se ejecuten en éste y se configurará un cron en el esclavo que borre diariamente todos los listings anteriores a 30 dÃas. De esta forma cada insert o update que se realice en el maestro se realizará también en el esclavo que, además, borrará los registros viejos todos los dÃas.
Esto es mucho más seguro, porque todos los inserts/updates son logueados y controlados. Podemos saber y corregir en todo momento cual es la inconsistencia si la hubiese entre ambos servidores.
A continuación les presento un ejemplo de cómo configurar esta funcionalidad en ambos servidores para que cumplan su papel.
Configurar el servidor Maestro (Master)
1) Como primer paso, debemos decirle al servidor Master dónde va a loguear toda su actividad; qué va a loguear, es decir que base de datos queremos que loguee y además le asignaremos un identificador. Para esto debemos editar el my.cnf de mysql agregando lÃneas como éstas:
server-id=1 binlog-do-db=nuestra_DB log-bin = /var/log/mysql/mysql-bin.log
También debemos decir que permita el acceso remoto, no sólo el acceso desde el localhost; por lo que debemos comentar estos parámetros en caso de que existan.
#bind-address #skip-networking
2) Reiniciamos el servidor de mysql desde la consola de linux y nos logueamos por consola al mysql con acceso root
# /etc/init.d/mysql restart # mysql -u root -p
3) Como próximo paso, debemos crear un usuario con acceso a la replicación. Este usuario es el que usará el Slave para identificarse. En la consola MySql y con acceso root, podrán crear el usuario de esta forma (también pueden usar phpMyAdmin para crearlo)
GRANT REPLICATION SLAVE ON *.* TO 'slave1'@'%' IDENTIFIED BY 'slave_password'; FLUSH PRIVILEGES;
slave1: será el nombre de usuario
slave_password: será el password de ese usuario
4) Ahora necesitamos saber la información del log para configurar el servidor slave, lo podremos hacer con el siguiente comando tambien en la consola MySql:
USE exampledb; FLUSH TABLES WITH READ LOCK; SHOW MASTER STATUS;
Les aparecerá una tabla con la el nombre del log, la posición, la base, etc. Copien esa info a algun archivo de texto a menos que tengan mucha memoria fotográfica.
Para terminar con el servidor Maestro sólo resta desbloquear las tablas bloqueadas en el paso anterior desde la consola MySql:
UNLOCK TABLES; quit;
Configurar el servidor esclavo
1) Suponiendo que ya creamos la base de datos con el mismo nombre que la del Maestro, vamos directamente a editar la configuración del archivo my.cnf de mysql agregando/editando estas lÃneas:
# Servirá como identificador server-id=2 # El ip del servidor Master master-host=190.17.9.105 # El monbre de usuario que configuramos en el master master-user=slave_user # El password del usuario que configuramos en el master master-password=slave_password # Segundos antes de reintentar conectarse master-connect-retry=60 # Base de datos a replicar replicate-do-db=nuestra_DB
2) Reiniciamos entonces el servidor esclavo para que tome la nueva configuración:
# /etc/init.d/mysql restart
3) Nos logueamos como root al MySql y le decimos al esclavo que carge la info que exista en la DB del maestro para tener como punto de partida:
#mysql -u root -p # Enter password: LOAD DATA FROM MASTER;
4) En este paso, le vamos a tener que proveer a nuestro slave, la info que guardamos en el txt acerca del log del master parando la replicación (estos valores son de ejemplo, cambienlo por el que tienen ustedes):
SLAVE STOP; CHANGE MASTER TO MASTER_HOST='190.17.9.105', MASTER_USER='slave_user', MASTER_PASSWORD='slave_password', MASTER_LOG_FILE='mysql-bin.002', MASTER_LOG_POS=4;
5) Reiniciamos el servicio esclavo y ya tenemos nuestra replicación andando:
START SLAVE; quit;
Para saber si la replicación está andando sólo basta con poner el siguiente comando en la consola MySql
SHOW SLAVE STATUS G;
Esto fue todo en cuanto a la configuración de los servidores, espero que puedan seguir los pasos sin mayores inconvenientes.
Para el próximo y último post de esta serie, voy a comentar mi experiencia con esta funcionalidad y voy a dejar varias soluciones a problemas que surgieron en el proyecto que administraba y que sin duda les será útil si esto alguna vez les falla.










7 Comentarios
eleZeta - Lucas Zallio » Blog Archive » Replicación de bases de datos mysql (Parte 1)
febrero 17th, 2008 at 9:49 pm
[...] ya leiste esta introducción o tenés conocimientos acerca de que se trata visita: “Caso práctico de replicación de bases de datos“ o “Solución de problemas comunes de replicación de BD [...]
Humberto Perez
abril 9th, 2008 at 8:02 pm
esta excelente el manual pero aun asi tengo un problema que no funciona no se si es pq el server esta configurado para el puerto 3307 y el cliente para el 3306 (el cual es por defecto de mysq) o si tiene que ver algo el hecho de que uno sea server 2003 y el otro un xp profesional de antemano gracias por la ayuda que me puedan brindar
Lucas Zallio
abril 9th, 2008 at 9:27 pm
Humberto, en primer lugar nunca lo hice funcionar sobre windows asà que no estoy seguro de que funcione. Por otro lado no debe ser ese el problema. Yo se lo atribuirÃa al firewall o los permisos de alguno de los dos servers.
Saludos
César Zúñiga
junio 4th, 2008 at 3:29 am
Gracias por el tutorial está exelente! yo lo prové en windows y va de maravilla, hace la replicacion perfecta y casi que en tiempo real. pero cuando voy a trabajar en una tabla que contiene un campo blob, la replicacion se cae. que puedo hacer alrespecto ya aumente el max packet size a 1024M pero nada.. espero que me puedas dar una solucion. gracias
Algunos links para Replicacion con Mysql | Jorgelig
julio 8th, 2008 at 3:44 am
[...] Replicación de bases de datos mysql (Parte 2) [...]
Tutorial para hacer un balanceador de carga (load balancer) de servidores de base de datos con PHP | eleZeta - Lucas Zallio
octubre 6th, 2008 at 11:48 am
[...] tengan exactamente la misma información. En MySQL, por ejemplo, pueden lograr esto utilizando la replicación que ofrece el motor de base de [...]
Blog de Laura Berdasco » Replicación MySQL con Master-Slave sobre Ubuntu 8.10 (master)
marzo 16th, 2009 at 7:58 am
[...] se escribirá el log del máster. En este caso, utilizamos el mismo que utiliza MySQL. Os dejo un tutorial en el que podréis ver que este archivo log puede destinarse en cualquier [...]