Seconds_Behind_Masterは、タイムトラベルを介して過去を表示するようなものです。
次のように考えてください。
- 太陽は地球から93,000,000マイル離れています
- 光速は186,000マイル/秒です
- 単純な除算は、太陽の光が地球に到達するまでに約500秒(8分20秒)かかることを示しています
- 太陽を見ると、実際には太陽は見えません。8分20秒前の場所がわかります。
同様に、マスターは多くのクエリを同時に処理しているようです。
スレーブを振り返って実行するSHOW SLAVE STATUS\G
と、200 forと表示されSeconds_Behind_Master
ます。その数はどのように計算されますか?スレーブのクロック時間(UNIX_TIMESTAMP(NOW())-クエリが完了してマスターのバイナリログに記録されたときのクエリのTIMESTAMP。
に注目すべき別の指標がありますSeconds_Behind_Master
。そのメトリックはと呼ばれRelay_Log_Space
ます。これは、スレーブ上のすべてのリレーファイルのすべてのバイトの合計を表します。デフォルトでは、最大の単一リレーログは1GBに制限されています。場合はRelay_Log_Space
少ない1ギガバイト以上で、これは多くの実行時間の長いクエリが並列にマスター上で実行することを示しています。残念ながら、シングルスレッドの性質を持つレプリケーションのSQLスレッドにより、クエリは順番に実行されます。
たとえば、マスターに次のシナリオがあるとします。
- スロークエリログが有効になっています
- マスターで並列に実行される20のクエリ
- 各クエリに3秒かかりました
- 各クエリは同じタイムスタンプでマスターバイナリログに記録されます
スレーブがクエリをリレーログから読み取り、それらを1つずつ処理するとき
- 奴隷の時計が動く
- 20個のクエリそれぞれのタイムスタンプは同じになります
- 差は3秒増加し、クエリが完了します
- これは60秒になります
Seconds_Behind_Master
スローログに関しては、long_query_timeのデフォルトは10秒です。リレーログ内のすべてのクエリが10秒未満の場合、スロークエリログでは何もキャッチされません。
マスターサーバーとスレーブサーバーの両方に次の推奨事項があります
- 推奨事項#1:MySQL 5.5にアップグレードします。MySQL 5.5およびPercona Server 5.1.38以降では、InnoDBを調整して複数のCPUにアクセスできます。これについて過去の投稿を書いています
- 推奨事項#2:すべてのテーブルにInnoDBを使用します。InnoDBはデータとインデックスをRAMにキャッシュし、MyISAMはインデックスのみをキャッシュします。
- 推奨事項#3:RAMを増やします。スレーブとマスターの両方で、より多くのデータとインデックスをキャッシュする必要があります
- 推奨事項#4:すべてのクエリを調整します。数百回実行されるクエリからミリ秒を削減することは、削減するのに長い道のり
Seconds_Behind_Master
です。
さらなるトラブルシューティング
レプリケーションラグの原因となっているクエリを確認するには、次の操作を行います。
SHOW SLAVE STATUS\G
- からリレーログの名前を取得
Relay_Log_File
STOP SLAVE;
START SLAVE;
- OS、
cd /var/lib/mysql
またはリレーログが書き込まれる場所
- リレーログをテキストファイルにダンプする
たとえば、やってみましょう SHOW SLAVE STATUS\G
Slave_IO_State: Waiting for master to send event
Master_Host: 10.64.51.149
Master_User: replicant
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql-bin.000009
Read_Master_Log_Pos: 1024035856
Relay_Log_File: relay-bin.000030
Relay_Log_Pos: 794732078
Relay_Master_Log_File: mysql-bin.000009
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Replicate_Do_DB:
Replicate_Ignore_DB: search_cache
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: 1024035856
Relay_Log_Space: 794732271
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: 0
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: 106451149
を実行するSTOP SLAVE; START SLAVE;
と、リレーログが閉じ、新しいログが開きます。しかし、あなたは欲しいrelay-bin.000030
。
次のように内容をダンプします。
cd /var/lib/mysql
mysqlbinlog relay-bin.000030 > /root/RelayLogQueries.txt
less /root/RelayLogQueries.txt
これで、スレーブが現在処理しようとしているクエリを確認できます。これらのクエリをチューニングの開始点として使用できます。