MySQLレプリケーション:マスターの後ろの超高音


8

本番データベース用にスレーブdbサーバーをセットアップしましたが、show slaveステータスを確認したところ、マスターの数秒後に非常に大きな数値が表示されました。

これは出力です:

           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

次に、SHOW PROCESSLISTを実行すると、スレッドの時間が秒単位で示された時間と一致していることがわかります。

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 |

その時はゆっくりと落ちています。Read_Master_Log_Pos、Relay_Log_Pos、Exec_Master_Log_Pos、Relay_Log_Spaceは常に変化しています。

日時も確認しましたが、両方のサーバーが同期しています。

マスター側:

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             

そしてスレーブホストが空に見えることを示します...

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

mysql> 

では、実際に何が起こっているのでしょうか。スレーブは実際に接続されて動作しているように見えますが、非常に遅いですか?誰かがこれについてもっとデバッグする方法についていくつかのヒントを教えてもらえますか?サーバーは95%でかなりアイドル状態です。

回答:


15

あなたがSeconds_Behind_Masterその高さを見るとき、私は以下を見ます:

Relay_Log_Space: 8179978166

処理する7.6182GBのリレーログがあります。

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

これまでにを読んmysql-bin.000173だことがあるが、現在からのものを処理していることがわかりますmysql-bin.000093

これにより、マスターに約80のバイナリログがあり、それぞれ約100 MBであることがわかります。

これSeconds_Behind_Masterは、単にNOW()からmysql-bin.000093(Relay_Master_Log_File)位置91173210(Exec_Master_Log_Pos)に設定されたTIMESTAMPを引いたものです。

Slave_SQL_ThreadがYesである限り、リレーログが処理されます

  • Relay_Log_Space リレーログが行われるたびに減少します
  • Exec_Master_Log_Pos 現在のリレーログが完了するまで増加し、次のリレーの最初にリセットされます
  • TIMESTAMPは増加し続け、Seconds_Behind_Master減少します(NOW()から、Relay_Master_Log_Fileの位置に設定されたTIMESTAMPを差し引いたExec_Master_Log_Pos)。

これは、レプリケーションが486330秒(5日15時間5分29秒)オフであり、実行するとどうなるかです。 start slave;

あなたを見てくださいSHOW PROCESSLIST;。IOスレッドは66530秒(18時間28分50秒)稼働しています。これは、誰かまたは何かが18時間28分50秒前にレプリケーションを開始したことを意味します。

質問で、本番サーバーのレプリケーションを設定したと述べました。これは、mysqldumpを5日15時間5分29秒前に実行し、18時間28分50秒前に本番マスターから複製を開始したことを意味します。

マスターからmysqldumpを取得したのと同じ日にスレーブをセットアップした場合、レプリケーションの負荷ははるかに少なくなります。それにもかかわらず、レプリケーションは正常に機能してSlave_IO_Threadおり、Slave_SQL_ThreadどちらもそうYesです。


1
正しい。SLAVE STARTはMASTERダンプの1日後に実行するようにスケジュールされていましたが、実行されなかったため、長い週末の後にSLAVE STARTを実行する必要がありました。私がやったことはinnodb_flush_log_at_trx_commit = 2を設定することであり、これによりLAGが減少しました。これを行うことは安全ですか?
マティアス2014
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.