MySQL-Replikation: Sekunden hinter dem Master super hoch

8

Ich habe einen Slave-Datenbankserver für meine Produktionsdatenbank eingerichtet, aber als ich den Status des Show-Slaves überprüfte, bemerkte ich eine super große Zahl in Sekunden hinter dem Master.

Dies ist die Ausgabe:

           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

Wenn ich dann SHOW PROCESSLIST ausführe, sehe ich, dass die Zeit des Threads mit der in Sekunden dahinter angegebenen Zeit übereinstimmt:

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 |

Diese Zeit sinkt langsam. Read_Master_Log_Pos, Relay_Log_Pos, Exec_Master_Log_Pos und Relay_Log_Space ändern sich ständig.

Ich habe auch die Uhrzeit / das Datum überprüft und beide Server sind synchronisiert.

Auf der Masterseite:

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             

und Show Slave Hosts sieht leer aus ...

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

mysql> 

Also, was ist hier eigentlich los? Sieht aus wie der Slave tatsächlich verbunden ist und funktioniert, aber sehr, sehr langsam? Kann mir jemand einige Tipps geben, wie ich mehr Debugging machen kann? Der Server ist mit 95% eher inaktiv.

Matías
quelle

Antworten:

15

Wenn Sie das Seconds_Behind_Masterso hoch sehen, schaue ich mir Folgendes an:

Relay_Log_Space: 8179978166

Sie müssen 7.6182 GB Relay-Protokolle verarbeiten.

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

Dies sagt mir, dass Sie bis gelesen haben mysql-bin.000173, aber Sie verarbeiten gerade Dinge aus dem mysql-bin.000093.

Dies sagt mir auch, dass Sie ungefähr 80 Binärprotokolle auf dem Master haben, jedes ungefähr 100 MB.

Das Seconds_Behind_Masterist einfach die NOW () minus dem Zeitstempel - Set an mysql-bin.000093(Relay_Master_Log_File) Position 91173210(Exec_Master_Log_Pos).

Solange Slave_SQL_Thread Ja ist, werden die Relay-Protokolle verarbeitet

  • Relay_Log_Space wird jedes Mal verringert, wenn ein Relaisprotokoll erstellt wird
  • Exec_Master_Log_Pos wird erhöht, bis das aktuelle Relaisprotokoll fertig ist, und dann auf den Anfang des nächsten Relais zurückgesetzt
  • TIMESTAMP Seconds_Behind_Masternimmt ständig zu, wodurch sich die Anzahl (NOW () abzüglich des an Relay_Master_Log_File-Position Exec_Master_Log_Pos festgelegten TIMESTAMP verringert).

Dies ist der Fall, wenn die Replikation für 486330 Sekunden (5 Tage 15 Stunden 5 Minuten 29 Sekunden) deaktiviert ist und Sie ausgeführt werden start slave;

Schau dir deine an SHOW PROCESSLIST;. Der E / A-Thread war 66530 Sekunden lang aktiv (18 Stunden 28 Minuten 50 Sekunden). Dies bedeutet, dass jemand oder etwas die Replikation vor 18 Stunden 28 Minuten 50 Sekunden gestartet hat.

Sie haben in Ihrer Frage angegeben, dass Sie die Replikation für den Produktionsserver eingerichtet haben. Dies bedeutet, dass Sie den mysqldump vor 5 Tagen 15 Stunden 5 Minuten 29 Sekunden ausgeführt und vor 18 Stunden 28 Minuten 50 Sekunden mit der Replikation vom Produktionsmaster begonnen haben.

Wenn Sie den Slave am selben Tag eingerichtet hätten, an dem Sie den mysqldump vom Master erhalten haben, wäre die Replikationslast viel geringer. Ungeachtet dessen funktioniert die Replikation normal Slave_IO_Threadund Slave_SQL_Threadbeide sagen Yes.

RolandoMySQLDBA
quelle
1
Richtig. Der SLAVE START sollte einen Tag nach dem MASTER-Dump laufen, aber es passierte nicht, so dass ich nach einem langen Wochenende den SLAVE START durchführen musste. Was ich getan habe, ist innodb_flush_log_at_trx_commit = 2 zu setzen und dies hat die LAG reduziert. Wie sicher ist das?
Matías