レプリケーションを構成するスレッド
以下の図におけるスレッドについて記載する。
マスタースレッド
MySQL のレプリケーションでは、マスターがサーバでスレーブがクライアントという関係になっており、レプリケーションのための接続は、スレーブからマスターという形となる。
そのため、マスター上ではスレーブがログインするためのアカウントが必要であり、権限として REPLICATOIN SLAVE を付与しておく必要がある。スレーブが複数存在するとスレーブの数に応じたマスタースレッドが生成される。
マスタースレッドの役割は「バイナリログを読み取ってスレーブへ送る」ことである。スレーブがログインした際に、マスターにバイナリログを送信するように指示を出すことで、マスターはバイナリログの送信を開始する。
スレーブがマスターへバイナリログの送信を依頼するコマンドは COMBINLOGDUMP もしくは COMBINLOGDUMP_GTID となる。
前者はバイナリログファイル名とポジションによって、後者は GTID によってバイナリログ送信のポジションを決定する。
スレーブ I/O スレッド
スレーブ I/O スレッドは 2 種類あるスレーブのスレッドのうちの1つであり、以下を行う。
- マスターへ接続し、COMBINLOGDUMP / COMBINLOGDUMP_GTID コマンドを発行
- マスターから連続的に更新を受け取る
- 受け取った更新データをリレーログと呼ばれる更新ファイルに保存する
リレーログのフォーマットはバイナリログとまったく同様であり、受け取ったデータを右から左へと書き込んでいく。
リレーログにもバイナリログ同様、インデックスファイルが存在する。リレーログの中身を見るには SHOW RELAYLOG EVENTS を使う。
スレーブ SQL スレッド
スレーブ SQL スレッドは、リレーログから更新の差分を読み取り、スレーブ上で再生するためのスレッド。SQL スレッドとも呼ばれ、IO スレッドに比べてこちらの方が処理量が多く、遅延が生じがち。
Second Behid Master (SBM) の原因は SQL スレッドの性能不足である。MySQL 5.7 では SQL スレッドのスループットを向上させるための機能が追加されている。