Concepto general
La replicación es el proceso mediante el cual los datos de un servidor (maestro) se sincronizan con uno o varios servidores (esclavos), de modo que los esclavos contengan una copia idéntica de la información del maestro. MySQL introdujo la replicación desde la versión 3.x y ha ido mejorándola con el tiempo: paralelismo en la replicación, GTID, replicación desde múltiples orígenes, etc. Actualmente la tecnología es estable. La replicación en MySQL se implementa a nivel del servidor, por lo que funciona con cualquier motor, ya sea InnoDB, MyISAM u otros.
Flujo de la replicación
MySQL utiliza el registro binario (binlog) para la replicación, la cual involucra tres hilos:
- En el maestro: el hilo dump recopila los cambios del binlog y se comunica con el hilo IO del esclavo.
- En el esclavo: el hilo IO recibe los datos y los almacena en un archivo de registro de retransmisión (relaylgo), cuyo formato es idéntico al del binlog.
- En el esclavo: el hilo SQL lee los eventos del relaylog y los aplica a la base de datos.
Diagrama de flujo
Maestro: dump thread → binlog → (red)
Esclavo: IO thread → relaylog → SQL thread → datos
Información de hilos
Hilos en el maestro
[root@GreatSQL][(none)]>show processlist;
+----+-----------------+-----------------+------+-------------+------+-----------------------------------------------------------------+------------------+
| Id | User | Host | db | Command | Time | State | Info |
+----+-----------------+-----------------+------+-------------+------+-----------------------------------------------------------------+------------------+
| 8 | sync | 127.0.0.1:35424 | NULL | Binlog Dump | 5092 | Source has sent all binlog to replica; waiting for more updates | NULL |
+----+-----------------+-----------------+------+-------------+------+-----------------------------------------------------------------+------------------+
3 rows in set (0.00 sec)
Hilos en el esclavo
[root@GreatSQL][(none)]>show processlist;
+----+-----------------+-----------------+------+---------+-------+----------------------------------------------------------+------------------+
| Id | User | Host | db | Command | Time | State | Info |
+----+-----------------+-----------------+------+---------+-------+----------------------------------------------------------+------------------+
| 16 | system user | connecting host | NULL | Connect | 5279 | Waiting for source to send event | NULL |
| 17 | system user | | NULL | Query | 5010 | Replica has read all relay log; waiting for more updates | NULL |
+----+-----------------+-----------------+------+---------+-------+----------------------------------------------------------+------------------+
5 rows in set (0.00 sec)
Configuración paso a paso de la replicación maestro-esclavo
-
Implementar dos instancias (se omite el proceso de instalación).
-
Crear usuario de replicación en el maestro:
mysql> CREATE USER sync@'127.0.0.1' identified by 'GreatSQL'; mysql> GRANT REPLICATION SLAVE ON *.* TO 'sync'@'127.0.0.1'; mysql> FLUSH PRIVILEGES; -
Crear datos de prueba:
mysql> create database test; mysql> use test; mysql> create table t1 (id int auto_increment, name varchar(64), primary key(id)); mysql> insert into t1 values(1,'小明'),(2,'小林'),(3,'小王'); -
Exportar datos:
mysqldump -uroot -p --single-transaction --master_data=2 --set-gtid-purged=OFF -S /tmp/mysql57_3310.sock test > ./3310.sql -
Registrar la posición del binlog:
grep log-bin 3310.sql # Resultado: CHANGE MASTER TO MASTER_LOG_FILE='log-bin.000005', MASTER_LOG_POS=4111; -
Importar datos en el esclavo:
mysql -uroot -p -S /tmp/mysql57_3306.sock test < ./3310.sql -
Configurar la replicación (método tradicional de posición):
CHANGE MASTER TO MASTER_HOST='127.0.0.1', MASTER_PORT=3310, MASTER_USER='sync', MASTER_PASSWORD='GreatSQL', MASTER_LOG_FILE='log-bin.000005', MASTER_LOG_POS=4111; START SLAVE; -
Verificar el estado del esclavo:
SHOW SLAVE STATUS\G;Se debe ver
Slave_IO_Running: YesySlave_SQL_Running: Yes. -
Probar sincronización: Insertar en el maestro:
INSERT INTO test.t1 VALUES(4,'小清');En el esclavo:
SELECT * FROM test.t1; -- Aparecerán los 4 registros.
Parámetros clave de SHOW SLAVE STATUS
| Parámetro | Descripción |
|---|---|
| Slave_IO_State | Estado del hilo IO del esclavo |
| Master_Host | Dirección del maestro |
| Master_User | Usuario de replicación |
| Master_Port | Puerto del maestro |
| Connect_Retry | Intervalo de reconexión tras interrupción (segundos) |
| Master_Log_File | Archivo binlog que el maestro está escribiendo actualmente |
| Read_Master_Log_Pos | Posición que el esclavo está leyendo actualmente |
| Relay_Log_File | Archivo relaylog que el hilo SQL del esclavo está procesando |
| Relay_Log_Pos | Posición dentro del relaylog que el hilo SQL está leyendo |
| Relay_Master_Log_File | Binlog del maestro hasta donde el hilo SQL ha ejecutado |
| Slave_IO_Running | Indica si el hilo IO está activo (Yes/No) |
| Slave_SQL_Running | Indica si el hilo SQL está activo (Yes/No) |
| Exec_Master_Log_Pos | Posición del binlog del maestro ejecutada por el hilo SQL |
| Seconds_Behind_Master | Retraso estimado del esclavo en segundos |
| Master_Server_Id | ID del servidor maestro (debe ser diferente al del esclavo) |
| Master_UUID | UUID del maestro (debe ser diferente al del esclavo) |
| Master_Info_File | Archivo donde se almacena la configuración de conexión al maestro (incluye credenciales) |
| Slave_SQL_Running_State | Estado del hilo SQL (ej. "Replica has read all relay log; waiting for more updates") |
| Master_Retry_Count | Número máximo de reintentos tras una desconexión |
Configuración del binlog
Formatos del binlog
MySQL ofrece tres formatos:
- STATEMENT: registra la sentencia SQL ejecutada. Ocupa menos espacio.
- ROW: registra los cambios fila por fila, incluyendo contexto. Ocupa más espacio.
- MIXED: combinación de ambos, MySQL decide el formato según la operación.
Funciones del binlog
- Permite la replicación maestro-esclavo.
- Permite la recuperación a un punto en el tiempo (point-in-time recovery).
Cómo verificar la configuración del binlog
SHOW GLOBAL VARIABLES LIKE '%log_bin%';
-- Variables importantes:
-- log_bin: ON/OFF
-- log_bin_basename: ruta base de los archivos binlog
-- log_bin_index: ruta del archivo índice
Cómo deshabilitar temporalmente el registro en binlog para una sesión
SET SESSION sql_log_bin = 0; -- Las operaciones de esta sesión no se registrarán
SET SESSION sql_log_bin = 1; -- Se reactiva el registro
Nota: no usar la palabra clave GLOBAL para evitar afectar toda la replicación.
Cómo ajustar el tiempo de retención del binlog
SHOW GLOBAL VARIABLES LIKE 'expire_logs_days';
SET GLOBAL expire_logs_days = 10; -- Los binlogs se eliminarán después de 10 días
Es necesario actualizar también el archivo de configuración para que sea persistente.
Cómo purgar binlogs anteriores a un archivo específico
SHOW BINARY LOGS;
PURGE BINARY LOGS TO 'log-bin.000003';
-- Elimina todos los binlogs anteriores a log-bin.000003
Este artículo cubrió los fundamentos de la replicación maestro-esclavo con el método tradicional de posición. En una próxima entrega se abordará la replicación basada en GTID y las diferencias entre los formatos del binlog.