MySQL レプリケーションには 3
つのスレッドが関連しています。マスタには 1
スレッド、スレーブでは2つのスレッドがあります。START
SLAVE
ステートメントが発行されると、I/O
スレッドがスレーブに作成されます。このスレッドはマスタに接続し、マスタのバイナリ
ログに記録されているクエリの送信を要求します。そして、マスタが、そのバイナリ
ログを送信するために、スレッドを作成します。このスレッドは、マスタの
SHOW PROCESSLIST
出力で Binlog
Dump
として確認できます。スレーブの I/O
スレッドは、マスタの Binlog Dump
スレッドが送信するアップデートを読み取り、それをスレーブのデータ
ディレクトリにあるrelay logs
と呼ばれるローカル
ファイルにコピーします。そして、スレーブがリレー
ログを読み取りそれに含まれるクエリを実行するために、3
つ目の スレッドである SQL
スレッドを作成します。
マスタとスレーブ間の 1 接続につき、3 つのスレッドがあります。つまり、マスタには複数のスレーブがあり、マスタは接続したスレーブごとにスレッドを作成します。そして、このスレーブには I/O スレッドおよび SQL スレッドの両方が存在します。
スレーブは2つのスレッドを使い、マスタからのアップデートを読み取りと実行を 2 つの独立したタスクに区切ります。これにより、クエリの実行が遅い場合でも、クエリの読み取りというタスクが遅くなることはありません。たとえば、スレーブ サーバが一時的に稼動していない場合に、SQL スレッドが遅れていたとしても、スレーブが起動するときに は、I/O スレッドがマスタのすべてのバイナリ ログ内容をすばやく取り出します。つまり、SQL スレッドが取り出したクエリのすべてを実行し終える前にスレーブが停止する場合でも、I/O スレッドの方ですべてを取り出しているため、クエリのコピーがスレーブのリレー ログで安全に格納されていることになり、スレーブが起動するときには、そのクエリを実行する準備ができているということです。このため、マスタはスレーブの読み出しを待つ必要がなくなり、マスタサーバがマスタ元のバイナリ ログをより早く削除することを可能にします。
SHOW PROCESSLIST
ステートメントを使用すると、レプリケーションに関するマスタ側およびスレーブ側での処理内容を確認できます。以下で、SHOW
PROCESSLIST
. の出力で、この 3
つのスレッドがどのように表示されるかを例示します。
マスタサーバでは、SHOW PROCESSLIST
の出力は以下のようになります。
mysql> SHOW PROCESSLIST\G
*************************** 1. row ***************************
Id: 2
User: root
Host: localhost:32931
db: NULL
Command: Binlog Dump
Time: 94
State: Has sent all binlog to slave; waiting for binlog to
be updated
Info: NULL
ここで、スレッド Id 2 は 接続したスレーブの
Binlog Dump
レプリケーション
スレッドです。State
の情報は、すべてのアップデート (更新情報)
がスレーブに送信されたことを示し、マスタは次の更新情報を待機している状態です。マスタサーバの
Binlog Dump
スレッドが表示されない場合は、このレプリケーションは実行されていないことを意味します。—つまり、この時点でスレーブが接続されていないということです。
スレーブ サーバでは、SHOW PROCESSLIST
の出力は以下のようになります。
mysql> SHOW PROCESSLIST\G
*************************** 1. row ***************************
Id: 10
User: system user
Host:
db: NULL
Command: Connect
Time: 11
State: Waiting for master to send event
Info: NULL
*************************** 2. row ***************************
Id: 11
User: system user
Host:
db: NULL
Command: Connect
Time: 11
State: Has read all relay log; waiting for the slave I/O
thread to update it
Info: NULL
この情報は、 スレッド Id 10 が I/O
スレッドであり、マスタサーバと通信していることを示し、スレッド
Id 11 は SQL スレッドであり、 リレー ログ
に格納されたアップデートを処理中であることを示します。SHOW
PROCESSLIST
が実行された場合、スレッドの両方がアイドル状態であり、次のアップデートを待機しています。
Time
カラムの値は、マスタと比較した場合に、スレーブがどれくらい遅れているかを示します。詳しくは
項5.4.4. 「レプリケーション FAQ」 を参照してください。