INTRODUCCIÓN A LA REPLICACIÓN EN MYSQL

La replicación consiste en copiar automáticamente los datos de un servidor, llamado master o primary a uno o varios servidores, slaves o replicas.

Principales

  • Alta disponibilidad y failover
  • Escalabilidad de lectura (leer desde réplicas).
  • Backup sin afectar el servidor principal.
  • Distribución geográfica de datos.
  • Análisis de datos sin impactar producción.

Arquitecturas Comunes

  • Master → Slave(s) (la más usada).
  • Master-Master (activo-pasivo o activo-activo con precauciones).
  • Multi-Source Replication (varios masters a una réplica).
  • MySQL Group Replication (basado en Paxos, ofrece alta disponibilidad nativa).
  • MySQL InnoDB Cluster (Group Replication + MySQL Router + MySQL Shell).

Componentes Clave de la Replicación

  • Binary Log (log_bin): Registro de todos los cambios en el master.
  • Relay Log: En las réplicas, copia temporal de los eventos recibidos.
  • GTID (Global Transaction Identifier): Desde MySQL 5.6, identifica cada transacción de forma única en toda la topología.
  • IO Thread: En la réplica, se encarga de leer eventos del master.
  • SQL Thread: En la réplica, se encarga de ejecutar los eventos.

Tipos de Replicación en MySQL

Según el formato de registro

Tipo Descripción Ventajas Desventajas
Statement-based (SBR) Replica las sentencias SQL Logs más pequeños Puede fallar con queries no deterministas (UUID, RAND, etc.)
Row-based (RBR) Replica los cambios por fila Más seguro y preciso Logs más grandes
Mixed Usa SBR por defecto y RBR cuando es necesario Mejor equilibrio
Recomendación actual: Usar Row-based,especialmente con GTID.

Según el modo de sincronización

  • Asíncrona (predeterminada): El master no espera confirmación de las réplicas.
  • Semi-síncrona: El master espera a que al menos una réplica confirme que recibió el evento.
  • Síncrona: Solo posible con MySQL Group Replication o NDB Cluster.

Cómo Configurar Replicación Master-Slave con GTID

El término GTID se refiere principalmente a Global Transaction Identifier, Identificador Global de Transacción, en el ámbito de las bases de datos relacionales, como MySQL y Azure Database for MySQL. Es un identificador único que se genera y asigna automáticamente a cada transacción confirmada en el servidor.
  1. Configuración del Master ("my.cnf")
    [mysqld]
    server-id = 1
    log_bin = mysql-bin
    binlog_format = ROW
    gtid_mode = ON
    enforce_gtid_consistency = ON
    expire_logs_days = 7
    
  2. Configuración de la Réplica ("my.cnf")
    [mysqld]
    server-id = 2
    log_bin = mysql-bin
    relay_log = relay-bin
    gtid_mode = ON
    enforce_gtid_consistency = ON
    read_only = ON # Recomendado
    super_read_only = ON# MySQL 8.0+
    
  3. En el Master
    - Crear usuario de replicación
    CREATE USER 'repl'@'%' IDENTIFIED BY 'ContraseñaSegura123';
    
    GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%';
    
    -- Ver posición GTID
    SHOW MASTER STATUS\G
    
  4. En la Réplica
    CHANGE REPLICATION SOURCE TO
      SOURCE_HOST = 'IP_DEL_MASTER',
      SOURCE_USER = 'repl',
      SOURCE_PASSWORD = 'ContraseñaSegura123',
      SOURCE_AUTO_POSITION = 1;-- Importante con GTID
    
    START REPLICA;
    
    -- Ver estado
    SHOW REPLICA STATUS\G
    

Monitorización de Replicación

Comandos esenciales

-- Estado detallado
SHOW REPLICA STATUS\G

-- Ver lag (MySQL 8.0+)
SELECT SOURCE_SERVER_UUID, THREAD_ID, LAST_APPLIED_TRANSACTION, 
  LAST_APPLIED_TRANSACTION_END_QUEUE_TIMESTAMP 
FROM performance_schema.replication_applier_status_by_worker;

-- Chequear si está sincronizado
SHOW SLAVE STATUS\G  -- (versión antigua)

Herramientas recomendadas

  • Percona Toolkit (pt-table-checksum, pt-table-sync).
  • MySQL Enterprise Monitor.
  • Prometheus + Grafana (exporter de MySQL).
  • Orchestrator (para failover).

Mejores Prácticas

  • Usar siempre GTID.
  • Configura read_only y super_read_only en réplicas.
  • Monitorizar el replication lag constantemente.
  • Usar réplicas con hardware similar o superior al master.
  • Implementar backup de réplicas (no del master).
  • Configura binlog_expire_logs_seconds adecuadamente.
  • Usat filtrado de replicación solo cuando sea realmente necesario.
  • En entornos críticos, considerar MySQL Group Replication o InnoDB Cluster.

Problemas Comunes y Soluciones

  • Error 1236 (binlog purgeado): Restaurar con backup + "START REPLICA UNTIL_SQL_BEFORE_GTIDS".
  • Error 1062 (duplicados): Usar "pt-table-sync".
  • Lag alto: Aumentar "slave_parallel_workers", revisar queries lentas, usar RBR..
  • Réplica desincronizada: "pt-table-checksum" + "pt-table-sync".