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.