MySQLのレプリ遅延の原因には、大きく分けて、転送遅延とSQL実行遅延の2つがあります。
転送遅延は、マスタでバイナリログに出力されたSQLクエリが、スレーブのリレーログに出力されていないケース。SQL実行遅延は、SQLクエリがリレーログに出力されたが、実行が遅れているケース。レプリ遅延時の問題の切り分けとして、まずどちらのケースに該当しているかを判断する必要があります。
転送遅延の判定方法
マスタでの SHOW MASTER STATUS の結果と、対象スレーブでの SHOW SLAVE STATUS の結果を比較します。比較する項目は、以下のとおり。
比較元(MASTER) | 比較先(SLAVE) | 説明 |
---|---|---|
File | Master_Log_File | 読取対象のバイナリログファイルの比較 |
Position | Read_Master_Log_Pos | 読取完了した位置の比較 |
この2項目で差がある場合、転送遅延が起こっている。マスタとスレーブのサーバ間に何らかの問題が起こっていると考えられるので、その線で本質的な問題を追っていくことになります。
SQL実行遅延の判定方法
転送に遅延がなかった場合、こちらの調査に移ります。
対象スレーブでの SHOW SLAVE STATUS から、次の項目同士を比較して判断します。
比較元 | 比較先 | 説明 |
---|---|---|
Master_Log_File | Relay_Master_Log_File | SQLスレッドが最後に実行したバイナリログ |
Read_Master_Log_Pos | Exec_Master_Log_Pos | 読取完了と実行完了の位置比較 |
スレーブ側における、I/OスレッドとSQLスレッドの処理差から、つまりSQLの実行処理がどのくらい遅れているのかを調べることができます。SQL実行遅延の場合、スレーブの負荷が何らかの理由で高まっているケースなどが考えられます。マスタに比べてスレーブサーバの処理性能が劣るような場合、更新クエリが詰まることも考えられます。結構、厄介な話。
SQL実行遅延の場合、ほっときゃ直るケースも多かったりするのですが、転送遅延の場合は抜本的な対策が求められることが多いような気がします。両者とも各環境に応じたノウハウの積み上げから、最終判断をする必要はありますが。
ちなみに、そもそもの話として、レプリ遅延を監視するには、SHOW SLAVE STATUS のSeconds_Behind_Master という項目を見る方法が手っ取りばやいです。ただ、MySQL4.1.1以降から対応らしいので、MySQL4.0系では、こちらで紹介されているような方法は良いですね。
SHOW MASTER STATUS 、SHOW SLAVE STATUS で見られる項目の説明については、本家が一番わかりやすいと思います。
良いレプリ運用ライフを!