Replicación MySQL: segundos detrás de Master super high

8

He configurado un servidor db esclavo para mi base de datos de producción, pero cuando verifiqué el estado de mostrar esclavo, noté un número súper grande en segundos detrás del maestro.

Esta es la salida:

           Slave_IO_State: Waiting for master to send event
              Master_Host: 1.2.3.4
              Master_User: replicator
              Master_Port: 3306
            Connect_Retry: 60
          Master_Log_File: mysql-bin.000173
      Read_Master_Log_Pos: 15909435
           Relay_Log_File: mysqld-relay-bin.000079
            Relay_Log_Pos: 91173356
    Relay_Master_Log_File: mysql-bin.000093
         Slave_IO_Running: Yes
        Slave_SQL_Running: Yes
          Replicate_Do_DB: 
      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: 91173210
          Relay_Log_Space: 8179978166
          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: 486330
Master_SSL_Verify_Server_Cert: No
            Last_IO_Errno: 0
            Last_IO_Error: 
           Last_SQL_Errno: 0
           Last_SQL_Error: 
Replicate_Ignore_Server_Ids: 
         Master_Server_Id: 1
1 row in set (0.00 sec)

ERROR: 
No query specified

Luego, cuando ejecuto SHOW PROCESSLIST, veo que el tiempo del hilo coincide con el tiempo indicado en segundos detrás:

mysql> SHOW PROCESSLIST;

| 40 | system user |           | NULL | Connect |  66530 | Waiting for master to send event | NULL             |
| 41 | system user |           | NULL | Connect | 486330 | Reading event from the relay log | NULL             |
| 45 | root        | localhost | NULL | Query   |      0 | NULL                             | SHOW PROCESSLIST |

Ese tiempo está cayendo, lentamente. Read_Master_Log_Pos, Relay_Log_Pos, Exec_Master_Log_Pos y Relay_Log_Space están cambiando todo el tiempo.

También he verificado la hora / fecha y ambos servidores están sincronizados.

En el lado del maestro:

mysql> SHOW PROCESSLIST;

| 66739 | replicator | 1.2.3.5:52884 | NULL                | Binlog Dump |    65671 | Master has sent all binlog to slave; waiting for binlog to be updated | NULL             

y mostrar hosts esclavos parece vacío ...

mysql> SHOW SLAVE HOSTS;
+-----------+------+------+-----------+
| Server_id | Host | Port | Master_id |
+-----------+------+------+-----------+
|         2 |      | 3306 |         1 |
+-----------+------+------+-----------+
1 row in set (0.00 sec)

mysql> 

Entonces, ¿qué está pasando realmente aquí? Parece que el esclavo está realmente conectado y funcionando, pero muy, muy lento. ¿Alguien puede darme algunas pistas sobre cómo hacer más depuración sobre esto? El servidor está bastante inactivo al 95%.

Matías
fuente

Respuestas:

15

Cuando veas Seconds_Behind_Masteresa altura, miro lo siguiente:

Relay_Log_Space: 8179978166

Tienes 7,6182 GB de registros de retransmisión para procesar.

Master_Log_File: mysql-bin.000173
Relay_Master_Log_File: mysql-bin.000093

Esto me dice que ha leído mysql-bin.000173, pero que actualmente está procesando cosas desde elmysql-bin.000093 .

Esto también me dice que tiene unos 80 registros binarios en el Master, cada uno de unos 100 MB.

El Seconds_Behind_Masteres simplemente el NOW () menos el TIMESTAMP establecido en la mysql-bin.000093posición 91173210(Relay_Master_Log_File) (Exec_Master_Log_Pos).

Mientras Slave_SQL_Thread sea Sí, los registros de retransmisión se procesarán

  • Relay_Log_Space disminuirá cada vez que se realice un registro de retransmisión
  • Exec_Master_Log_Pos aumentará hasta que se complete el registro de relé actual, luego se restablecerá al comienzo del siguiente relé
  • TIMESTAMP sigue aumentando, lo que hace Seconds_Behind_Masterdisminuir (NOW () menos el TIMESTAMP establecido en la posición Relay_Master_Log_File Exec_Master_Log_Pos)

Esto es lo que sucede cuando la replicación está desactivada durante 486330 segundos (5 días 15 horas 5 minutos 29 segundos) y ejecuta start slave;

Mira tu SHOW PROCESSLIST;. El hilo IO ha estado activo durante 66530 segundos (18 horas 28 minutos 50 segundos). Esto significa que alguien o algo comenzó la replicación hace 18 horas 28 minutos y 50 segundos.

En su pregunta, indicó que ha configurado la replicación para el servidor de producción. Esto significa que ejecutó el mysqldump hace 5 días 15 horas 5 minutos 29 segundos y comenzó a replicar desde el maestro de producción hace 18 horas 28 minutos y 50 segundos.

Si hubiera configurado el Slave el mismo día que obtuvo el mysqldump del Master, la carga de replicación sería mucho menor. No obstante, la replicación está funcionando normalmente Slave_IO_Thready Slave_SQL_Threadambos dicen Yes.

RolandoMySQLDBA
fuente
1
Correcto. El INICIO ESCLAVO estaba programado para ejecutarse un día después del volcado MASTER, pero no sucedió, así que tuve que INICIAR ESCLAVO después de un largo fin de semana. Lo que he hecho es configurar innodb_flush_log_at_trx_commit = 2 y esto ha reducido el LAG. ¿Qué tan seguro es hacer esto?
Matías