Replicación asíncrona unidireccional Maestro – Esclavo en MySQL 5.0

mysql logoSupongamos un escenario real de producción en el que tenemos dos servidores. Una de las máquinas contiene un servidor http y una base de datos MySQL que usamos para abserver el tráfico web; la otra la utilizamos para otras tareas necesarias. Sería magnífico poder utilizar la segunda máquina como backup de nuestro MySQL por si hay algún problema grave en la primera ¿no? En este artículo os explico como hacerlo.

La replicación en MySQL funciona de la siguiente manera, el servidor maestro escribe todas las actualizaciones en un fichero de log binario, y mantiene un índice de los ficheros para rastrear las rotaciones de logs. A su vez, el servidor esclavo, que mantiene una conexión abierta contínua con el maestro, es informado cuando sucede algún cambio en el log binario del maestro, y ejecutan estos cambios en sus tablas.

Configuración de la replica asíncrona unidireccional

1) Localizaremos el fichero de configuración de MySQL de la máquina que hará de maestro. Generalmente lo podemos encontrar en la ruta /etc/mysql/my.cnf y descomentamos las líneas:

log_bin=/var/log/mysql/mysql-bin.log
server-id = 1

Buscamos la misma línea en el servidor que hará las veces de esclavo y descomentamos la línea log_bin y server-id modificando el valor a uno diferente del de master:

log_bin=/var/log/mysql/mysql-bin.log
server-id = 2

Ahora podemos arrancar los dos servidores MySQL para empezar a enseñarles a replicar.

2) Una vez arrancados ambos servidores, nos ponemos en el que hará de master y creamos la base de datos y el volcado de los datos en las tablas. En mi caso haré una importación de un fichero sql:

mysql -u [DBUSER-MASTER] -p -e "CREATE DATABASE `myBaseDeDatos`"
mysql -u [DBUSER-MASTER] -p myBaseDeDatos < myBaseDeDatos.sql

3) Ahora crearemos una cuenta de usuario con permisos de replicación, para autorizar, en el servidor maestro, al nuevo usuario a realizar replicas:

mysql> GRANT REPLICATION SLAVE ON *.* TO '[DBUSER-REPLICATOR]'@'[IP-SERVER-SLAVE]' IDENTIFIED BY '[DBPASS-REPLICATOR]';
mysql> flush privileges;
mysql> exit

4) Finalmente, consultamos el nombre del archivo de log binario y la posición de compensación, datos necesarios para configurar el esclavo:

mysql> SHOW MASTER STATUS;
+------------------+----------+--------------+------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000    | 103      |              |                  |
+------------------+----------+--------------+------------------+
1 row in set (0.00 sec)

5) Una vez hecho esto, volcaremos la base de datos en el servidor esclavo tal y como hicimos con el maestro. Ejecutaré el mismo archivo sql:

mysql -u [DBUSER-SLAVE] -p -e "CREATE DATABASE `myBaseDeDatos`"
mysql -u [DBUSER-SLAVE] -p myBaseDeDatos < myBaseDeDatos.sql

6) 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-SERVER-MASTER]';
mysql> CHANGE MASTER TO MASTER_USER = '[DBUSER-REPLICATOR]';
mysql> CHANGE MASTER TO MASTER_PASSWORD = '[DBPASS-REPLICATOR]';
mysql> CHANGE MASTER TO MASTER_LOG_FILE = 'mysql-bin.0001';
mysql> CHANGE MASTER TO MASTER_LOG_POS = 103;
mysql> start slave;

Y con esto ya queda configurado el servidor esclavo y alineado con el master. Desde este momento comenzará la replicación con el maestro.

Para comprobar que realmente está replicando, podemos ejecutar el siguiente comando en el servidor esclavo:

mysql> show slave status

Eso muestra:

*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: [IP-SERVER-MASTER]
Master_User: [DBUSER-REPLICATOR]
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql-bin.0001
Read_Master_Log_Pos: 103
Relay_Log_File: esclavo-relay-bin.000001
Relay_Log_Pos: 103
Relay_Master_Log_File: mysql-bin.0001
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Replicate_Do_DB: myBaseDeDatos
Replicate_Ignore_DB:
Replicate_Do_Table:
Replicate_Ignore_Table:
Replicate_Wild_Do_Table:
Replicate_Wild_Ignore_Table:
Last_Errno: 0
Last_Error:
Skip_Counter: 0
Exec_Master_Log_Pos: 103
Relay_Log_Space: 103
Until_Condition: None
Until_Log_File:
Until_Log_Pos: 0
Master_SSL_Allowed: No
Master_SSL_CA_File:
Master_SSL_CA_Path:
Master_SSL_Cert:
Master_SSL_Cipher:
Master_SSL_Key:
Seconds_Behind_Master: 0
1 row in set (0.00 sec)

En Read_Master_Log_Pos y Relay_Log_Pos podemos ver que ambos valores están correctamente alineados. La variable Seconds_Behind_Master nos indica el desfase de actualización entre maestro y esclavo, si todo está bien, mostrará un valor 0.

One thought on “Replicación asíncrona unidireccional Maestro – Esclavo en MySQL 5.0

  1. interesante el tema
    tengo una duda que vaga por mi cabeza , esto de replicacion maestro esclavo es para todas las base de datos que tenga el maestro?
    puedo hacer una replicacion solo para una sola base de datos?

Comments are closed.