Principio de replicación maestro-esclavo en MySQL y guía de configuración

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

  1. Implementar dos instancias (se omite el proceso de instalación).

  2. 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;
    
  3. 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,'小王');
    
  4. Exportar datos:

    mysqldump -uroot -p --single-transaction --master_data=2 --set-gtid-purged=OFF -S /tmp/mysql57_3310.sock test > ./3310.sql
    
  5. 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;
    
  6. Importar datos en el esclavo:

    mysql -uroot -p -S /tmp/mysql57_3306.sock test < ./3310.sql
    
  7. 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;
    
  8. Verificar el estado del esclavo:

    SHOW SLAVE STATUS\G;
    

    Se debe ver Slave_IO_Running: Yes y Slave_SQL_Running: Yes.

  9. 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.

Etiquetas: MySQL replicación maestro-esclavo binlog relaylog SHOW SLAVE STATUS

Publicado el 6-16 18:30