Replikasi MySQL: Detik Di Balik Master super tinggi

8

Saya telah menyiapkan server db slave untuk database produksi saya, tetapi ketika saya memeriksa status show slave, saya melihat angka super besar dalam hitungan detik di belakang master.

Ini hasilnya:

           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

Lalu ketika saya menjalankan SHOW PROCESSLIST, saya melihat bahwa waktu utas cocok dengan waktu yang ditunjukkan dalam detik di belakang:

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 |

Waktu itu menurun, perlahan. Read_Master_Log_Pos, Relay_Log_Pos, Exec_Master_Log_Pos dan Relay_Log_Space berubah sepanjang waktu.

Saya juga sudah memeriksa waktu / tanggal dan kedua server sedang sinkron.

Di sisi Master:

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             

dan tampilkan host budak terlihat kosong ...

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

mysql> 

Jadi apa yang sebenarnya terjadi di sini? Sepertinya budak benar-benar terhubung dan berfungsi, tetapi sangat sangat lambat? Dapatkah seseorang memberi saya beberapa petunjuk tentang cara melakukan lebih banyak debug pada ini? Server agak menganggur pada 95%.

Matías
sumber

Jawaban:

15

Ketika Anda melihat Seconds_Behind_Masterketinggian itu, saya melihat yang berikut:

Relay_Log_Space: 8179978166

Anda memiliki log relai 7,6182GB untuk diproses.

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

Ini memberi tahu saya bahwa Anda telah membaca hingga mysql-bin.000173, tetapi saat ini Anda sedang memproses sesuatu dari mysql-bin.000093.

Ini juga memberi tahu saya Anda memiliki sekitar 80 log biner pada Master, masing-masing sekitar 100 MB.

Ini Seconds_Behind_Masterhanyalah posisi SEKARANG () dikurangi TIMESTAMP yang ditetapkan pada mysql-bin.000093posisi 91173210(Relay_Master_Log_File) (Exec_Master_Log_Pos).

Selama Slave_SQL_Thread Ya, log relai diproses

  • Relay_Log_Space akan berkurang setiap kali log relai dilakukan
  • Exec_Master_Log_Pos akan meningkat hingga log relai saat ini selesai, lalu reset ke awal relai berikutnya
  • TIMESTAMP terus meningkat, yang membuat Seconds_Behind_Masterpenurunan (SEKARANG () minus TIMESTAMP ditetapkan pada Relay_Master_Log_File posisi Exec_Master_Log_Pos)

Inilah yang terjadi ketika replikasi tidak aktif selama 486330 detik (5 hari 15 jam 5 menit 29 detik) dan Anda menjalankan start slave;

Lihatlah milikmu SHOW PROCESSLIST;. IO Thread telah aktif selama 66530 detik (18 jam 28 menit 50 detik). Ini berarti seseorang atau sesuatu memulai replikasi 18 jam 28 menit 50 detik yang lalu.

Anda menyatakan dalam pertanyaan Anda bahwa Anda telah menyiapkan replikasi untuk server produksi. Ini berarti Anda menjalankan mysqldump 5 hari 15 jam 5 menit 29 detik yang lalu dan mulai mereplikasi dari master produksi 18 jam 28 menit 50 detik yang lalu.

Jika Anda mengatur Slave pada hari yang sama Anda mendapatkan mysqldump dari Master, beban replikasi akan jauh lebih sedikit. Meskipun demikian, replikasi bekerja secara normal disediakan Slave_IO_Threaddan Slave_SQL_Threadkeduanya mengatakan Yes.

RolandoMySQLDBA
sumber
1
Benar. MULAI MULAI dijadwalkan untuk berjalan satu hari setelah dump MASTER tetapi itu tidak terjadi, jadi saya harus MULAI MULAI setelah akhir pekan yang panjang. Apa yang saya lakukan adalah mengatur innodb_flush_log_at_trx_commit = 2 dan ini telah mengurangi LAG. Seberapa aman melakukan ini?
Matías