Después de unas largas vacaciones he decidido regresar con un post sobre bases de datos, nuevamente con MySQL, respondiendo a una duda que siempre me persiguió mientras cursaba la carrera ¿cómo realizar una replicación de una base de datos entre servidores MySQL?
Al investigar me encontré con que existen dos maneras de implementar la replicación entre servidores: una es a través de la replicación asíncrona unidireccional y la otra utilizando MySQL Cluster.
En la primera se tiene un servidor de base de datos maestro, en el cual ocurren todas las actualizaciones a la base de datos, desde el cual los datos son replicados a los servidores esclavos, de forma que se tiene un flujo de información solo de los maestros hacia los esclavos, de ahí la razón de llamarlo unidireccional, además se considera asíncrono porque el servidor maestro y los esclavos no necesitan estar en comunicación todo el tiempo, sino que los esclavos pueden permanecer fuera de línea y los cambios que ocurran en el maestro se replicarán en cuanto se restaure la conexión entre ambos.
El segundo método MySQL Cluster consiste en la implementación de un cluster de servidores, todos los servidores que formen parte de este sistema de replicación se comportan como si se tratara de un solo servidor, por lo que cualquier cambio en un miembro del sistema se replica en en el resto inmediatamente, a través de los mecanismos de sincronización que esta tecnología posee, de forma similar a lo que ocurre con los cluster de computadoras.
En este artículo me enfocaré a la replicación unidireccional, que es un mecanismo muy efectivo para mantener copias de seguridad de nuestras bases de datos, permitiendo además distribuir la carga de trabajo con las bases de datos entre varios servidores.
Como ya se mencionó, dentro de este esquema trabajaremos con los conceptos de servidor maestro y servidor esclavo, a grandes rasgos lo que ocurre es que el servidor maestro guarda un historial de las actualizaciones realizadas en la base de datos replicada dentro de un log binario, después cada servidor esclavo recibe las actualizaciones que el maestro ha guardado en este registro, de forma que el esclavo puede ejecutar las mismas actualizaciones en su copia de los datos.
El punto de partida importante aquí es que en ambos servidores debe existir la misma base de datos, con un nombre idéntico y los mismos datos contenidos, antes de arrancar con el proceso de replicación, ya que, como el sitio oficial de MySQL nos indica, de no ser así al momento que los esclavos intenten ejecutar las instrucciones del log binario del maestro puede ocurrir algún conflicto.
Configuración del maestro
El primer paso en la replicación consiste en configurar uno de los servidores como maestro para la replicación, para ello el primer paso consiste activar el log binario en el servidor maestro, para que éste pueda registrar todos los cambios que ocurran en la información de la base de datos. Para conseguir este objetivo tenemos que modificar el archivo de configuración de MySQL, llamado my.cnf en GNU/Linux y my.ini en Windows:
Dentro del archivo agregaremos las siguientes líneas:
log-bin=mysql-bin
server-id = 1
En donde log-bin indica el nombre del archivo de log binario y server-id define al identificador del servidor, lo más común es que al maestro lo identifiquemos como el número 1 y a los esclavos con los números sucesivos.
Hecho esto, al reiniciar el servidor MySQL se creará automáticamente el archivo del log binario, el esto lo podemos hacer desde el sistema operativo con algún asiste o desde la consola de comandos, en GNU/Linux se puede utilizar:
> service mysqld restart
La siguiente tarea consiste en crear una cuenta de usuario para replicación, que le permita al servidor esclavo autentificarse con el maestro. Dentro de la consola de comandos de MySQL escribimos el siguiente comando:
El comando GRANT indica que se creará una nueva cuenta, mientras que la instrucción REPLICATION SLAVE indica que servirá para la replicación en un esclavo. Dentro de los parámetros de la instrucción encontramos que:
mysql> GRANT REPLICATION SLAVE ON [base de datos].[tabla] TO '[usuario de replicación]'@'[ip del esclavo]' IDENTIFIED BY '[contraseña del usuario de replicación]';
- [base de datos] este indica el nombre de la base de datos que deseamos replicar, en caso de que queramos que se repliquen todas las bases de datos del servidor entonces escribimos el caracter asterisco * en lugar de un nombre;
- [tabla] si deseamos realizar únicamente la replicación de una tabla, entonces este parámetro deberá indicar el nombre de la tabla que deseamos replicar, si queremos replicar todas las tablas de una base de datos entonces dejamos el caracter asterisco * en lugar del nombre de la tabla, por ejemplo, si queremos replicar todas las tablas de la base de datos obras_literarias el comando deberá llevar indicar:
mysql> GRANT REPLICATION SLAVE ON obras_literarias.* TO '[usuario de replicación]'@'[ip del esclavo]' IDENTIFIED BY '[contraseña del usuario de replicación]';
- [usuario de replicación] será el nombre de usuario que utilizaremos en el esclavo para iniciar la replicación;
- [ip del esclavo] representa la dirección ip del servidor esclavo, para que de esta forma el servidor MySQL maestro valide que solo se realicen accesos de replicación desde éste servidor, si se desea que se pueda acceder al maestro desde cualquier servidor para realizar replicaciones entonces en lugar de una ip se debe colocar el caracter de porcentaje %;
- [contraseña del usuario de replicación] como su nombre lo indica, es la contraseña que utilizaremos junto con el nombre de usuario en el esclavo para iniciar la replicación.
Ahora, hecho esto, solo tenemos que asegurarnos que la base de datos del maestro exista en los servidores esclavos en los que se va a replicar, para esto existen varias formas, una de ellas consiste en realizar un dump o respaldo de toda la base de datos en un archivo y utilizarlo para crear la base de datos en el esclavo, para realizarlo de este modo primero tenemos que bloquear las tablas de la base de datos haciendo lo siguiente:
mysql>FLUSH PRIVILEGES
;
mysql> LOCK ALL TABLES READ ONLY;
mysql> exit;
De vuelta a la consola de comandos del sistema operativo (MS-DOS en Windows) realizamos el respaldo de la base de datos por medio del comando mysqldump, por ejemplo si deseamos respaldar la base de datos obras_literarias:
> mysqldump obras_literarias > obras_20090417.sql
Una vez terminado el proceso, regresamos a la consola de comando de MySQL y obtenemos algunos datos del servidor maestro que necesitaremos después, usando el comando SHOW MASTER STATUS:
mysql> SHOW MASTER STATUS;
Esto desplegará una tabla como la siguiente:
+------------------+-------------+-----------------+------------------+
| File | Position | Binlog_Do_DB | Bilog_Ignore_DB |
+------------------+-------------+-----------------+------------------+
| mysql-bin.000001 | 389| | |
+------------------+-------------+-----------------+------------------+
De esta tabla debemos tomar nota de los campos File y Position, ya que los utilizaremos al configurar el servidor esclavo, el campo File indica el nombre archivo log binario para la replicación mientras que la posición indica el desplazamiento dentro del archivo de la última operación.
Finalmente realizado el dump y después de localizar estos campos, podemos desbloquear nuestras tablas, por medio del comando:
mysql> UNLOCK ALL TABLES;
Ahora que el servidor ya cuenta con una configuración de maestro podemos reiniciarlo desde la consola de MySQL con el comando:
mysql> RESET MASTER;
Configuración del esclavo
En el servidor esclavo, agregaremos la línea a su archivo de configuración de MySQL:
server-id=2
De forma que este esclavo tendrá como identificador el número 2. Reiniciamos el servidor MySQL para que este cambio surta efecto, en GNU/Linux se puede utilizar el comando service:
> service mysqld restart
Ahora tenemos que crear la base de datos y las tablas que respaldamos en el servidor maestro, para ello, en el esclavo ahora ejecutamos lo siguiente:
> mysql obras_literarias < obras_20090417.sql
Y una vez que el esclavo tenga generada la base de datos, lo configuramos para que esté posicionado con respecto al maestro:
mysql> CHANGE MASTER TO MASTER_HOST = '[ip del maestro]';
mysql> CHANGE MASTER TO MASTER_USER = '[usuario de replicacion]';
mysql> CHANGE MASTER TO MASTER_PASSWORD = '[contraseña de replicacion]';
mysql> CHANGE MASTER TO MASTER_LOG_FILE = '[archivo de log binario]';
mysql> CHANGE MASTER TO MASTER_LOG_POS = [posición en el archivo de log binario];
mysql> START SLAVE;
En la implementación real, se tendrían que los valores de [archivo de log binario] y [posición en el archivo de log binario] equivalen a los valores de los campos File y Position de que tomamos nota respectivamente. En el ejemplo que se mostró correspondían a mysql-bin.000001 y 389.
Con el comando START SLAVE se inicia la replicación de las actualizaciones que suceden en el maestro dentro de la base de datos del esclavo, para comprobarlo se puede utilizar el comando SHOW SLAVE STATUS:
mysql> SHOW SLAVE STATUS\G
Este fue una pequeña guía que espero que le sirva a todos aquellos que están iniciando en el tema de la replicación de bases de datos con MySQL, si desean más información sobre estos temas, la pueden encontrar en la página oficial de MySQL que trata sobre los pasos para montar una replicación.