前提知識
MySQLのスレーブでは、以下の2つのスレッドを使って、レプリケーションを行っている
- I/Oスレッド : マスタからバイナリログの差分を取得する
- SQLスレッド : IOスレッドから取得したバイナリログを元にDBを更新する
SHOW SLAVE STATUS
で見るべき値
そもそも起動しているか
IOスレッド-SQLスレッド間が遅延しているか
Seconds_Behind_Master
を見る
- Relay_Master_Log_File : SQLスレッドが最後に実行したバイナリログのファイル名
- Exec_Master_Log_Pos : SQLスレッドが最後に実行したバイナリログのファイル名
- Seconds_Behind_Master : SQLスレッドとIOスレッドの差異
Seconds_Behind_Master
が増えている場合、IOスレッドが渡すバイナリログをSQLスレッドが消化しきれていない
Seconds_Behind_Master
が 0 なのに、スレーブが遅延している場合は、マスタ-IOスレッド間の遅延が疑われる
マスタ-IOスレッド間が遅延しているか
以下の値について、マスタの SHOW MASTER STATUS
での File
, Position
と差異を確認する
- Master_Log_File : IOスレッドが現在最新だと認識しているバイナリログのファイル名
- Read_Master_Log_Pos : IOスレッドが現在最新だと認識しているバイナリログのポジション
大きく差異がある場合、マスタの変更にIOスレッドが追いつけていない
遅延している場合どうしたら良いの?
- 一過性のものであるなら静観
- 延々と増え続けるなら、サーバ性能やネットワーク性能が、DBの更新に追いつけていないので、インフラをアップグレードする
- 信頼性を犠牲にするが、ディスクフラッシュの頻度を下げることで速度を上げる方法もある