Howto: Replica base de datos MySql

Esta vez voy a escribir sobre algo que aprendí hace poco y logré hacer dos veces (en un servidor OpenSuse y en uno Debian GNU/Linux), el procedimiento fue el mismo las dos veces, solo que noté un pequeño cambio en asuntos de permisos en ambas distribuciones.

Contando un poco, hay una base de datos llamada “registro” en mysql a la cual varias personas necesitan hacer consultas, la información de la base de datos y el servidor son bien sensibles y o se les puede dar acceso directo a todas las personas, por lo que estuve pensando como puedan hacer consultas sin conectarse directamente a ese servidor, así que me puse a investigar y encontré algo llamado “Replicación de servidor MySql“. Lo que esto hace, es crear una copia idéntica de una base de datos en otro servidor, los registros se van actualizando en el servidor replica de manera automática conforme van entrando datos al servidor maestro o principal.

De esta manera, dejo de preocuparme de accesos no autorizados a la base de datos maestra, bien pude haberlo hecho con un usuario de consulta pero lo que se necesita es que no se acceda a la base de datos de ninguna manera. Así que manos a la obra.

Vamos a partir del supuesto que ya hay una base de datos creada y con información. Lo primero que debemos de hacer es ejecutar el siguiente comando en el servidor maestro

mysqladmin variables -u root -p | grep log_bin

y nos fijamos en la linea log_bin, si esta linea dice OFF, tenemos que activar.

| log_bin | ON |
| log_bin_trust_function_creators | OFF |

Para activar esto, nos vamos al archivo my.cnf (en Debian el archivo esta en /etc/mysql/my.cnf y en OpenSuse /etc/my.cnf y agregamos (o modificamos) las siguientes lineas

  • log-bin=/var/lib/mysql/mysql-bin. #para llevar el registro de modificaciones a la base de datos
  • server-id = 1 #para identificar al servidor maestro
  • binlog-do-db = registro #nombre de la base de datos de la cual se llevara el registro

reseteamos nuestro servidor.

/etc/init.d/mysqld restart

Entramos al CLI del MySql maestro y creamos un usuario con persmisos de replicación para el servidor esclavo ejecutando el siguiente comando en la CLI MySql GRANT

REPLICATION SLAVE ON *.* TO ‘usuario-replica’@'ip-del-esclavo’ IDENTIFIED BY ‘contraseña-replica’;

Cuando ya tenemos esto, necesitamos copiar los registros de la base de datos del servidor maestro al servidor esclavo para que ambos tengan los mismos datos y no exista conflictos al momento de pasar los registros de un lado a otro, la idea es que ambos servidores inicien con la misma información. Ejecutamos el comando (siempre en la CLI MySql del maestro)

FLUSH TABLES WITH READ LOCK;

este comando sirve para enllavar MySql y que no pueda guardarse ningún registro, así que en este punto lo ideal es que nadie ingrese información mientras este proceso esta pasando. Necesitamos unos datos para configurar el esclavo mas adelante, así que (siempre dentro la CLI MySql) ejecutamos

SHOW MASTER STATUS;

y obtenemos algo parecido a

+——————+———-+—————————–+——————+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+——————+———-+—————————–+——————+
| mysql-bin.000002 | 98 | registro,registro | |
+——————+———-+—————————–+——————+

Los datos que debemos de anotar y no perder son File y Position, que vamos a ocupar en el esclavo.

Copiamos la base de datos maestra al esclavo, se puede hacer con un mysqldump o copiando el directorio de la base de datos en /var/lib/mysql, aquí va al gusto del cliente. Voy a explicar como hacerlo copiando el directorio completo.

Nos ubicamos en /var/lib/mysql del maestro y ejecutamos (según el nombre de ejemplo que puse arriba) en nuestra bash tar -cf registro.tar registro/, pasamos este archivo .tar al esclavo usando scp registro.tar root@ip-del-esclavo:/var/lib/mysql/.

Ahora le toca el turno al esclavo, en el servidor esclavo

  • Nos ubicamos en el directorio /var/lib/mysql y ejecutamos el comando tar -xf registro.tar, podemos dar un ls para asegurarnos que el directorio registro está ahí.
  • Nos vamos al my.cnf del eslavo y buscamos la linea server-id y la dejamos así server-id= 2. Nos aseguramos que la linea bind-address (en Debian) o skip-networking (en OpenSuse) esté comentada, volvemos a la bash y reiniciamos /etc/init.d/mysql restart.
  • Volvemos a la CLI MySql y dentro ejecutamos el comando

    CHANGE MASTER TO MASTER_HOST=’ip-del-servidor-maestro’, MASTER_USER=’usuario-replica’, MASTER_PASSWORD=’contraseña-replica’, MASTER_LOG_FILE=’mysql-bin.000002′, MASTER_LOG_POS=98;

  • Activamos el servidor esclavo (en la CLI MySql) START SLAVE;.

Para terminar, nos vamos a la CLI del MySql maestro y escribimos UNLOCK TABLES; para desactivar el bloqueo de ingreso de registro que hicimos anteriormente.

Con todo esto (si no tuvimos ningún error) debemos de tener funcionando nuestro servidor replica, para asegurarnos que sea así ejecutamos (en la CLI del MySql esclavo) SHOW SLAVE STATUS\G; y buscamos la linea

Slave_IO_Running: Yes
Slave_SQL_Running: Yes

Si dicen YES, estamos listo! :) ahora para probar, agregamos un registro en el maestro y hacemos la consulta en el esclavo.

Para posibles fallos, podemos revisar el syslog y si queremos volver a hacer pruebas debemos de eliminar los archivos de log, en el esclavo los archivo relay y el master.info y en el maestro los archivos mysql-bin*

Espero que esto le sirva a alguien, si no, igual me queda de material de consulta a mi :)

Cualquier problemita que tengan y si puedo ayudarles, dejen un comentario y ay vemos que hacemos.

Referencias: