無料PHPプログラム

MySQL 5.1 リファレンスマニュアル :: 5 レプリケーション :: 5.5 レプリケーションの実装 :: 5.5.1 レプリケーション実装の詳細
« 5.5 レプリケーションの実装

5.5.2 マスタレプリケーションのスレッド状態 »
Section Navigation      [Toggle]
  • 5.5 レプリケーションの実装
  • 5.5.1 レプリケーション実装の詳細
  • 5.5.2 マスタレプリケーションのスレッド状態
  • 5.5.3 スレーブ レプリケーションの I/O スレッド状態
  • 5.5.4 スレーブ レプリケーションの SQL スレッド状態
  • 5.5.5 レプリケーション リレーとステータス ファイル
  • 5.5.6 サーバのレプリケーション ルール評価

5.5.1. レプリケーション実装の詳細

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」 を参照してください。

Copyright c 1997, 2010, Oracle and/or its affiliates. All rights reserved. Legal Notices
Top / Previous / Next / Up / Table of Contents
© 2010, Oracle Corporation and/or its affiliates

無料CGI PHPスクリプト | 新着情報スクリプト | 営業日カレンダー | PHPマニュアル | MySQLマニュアル | PEARマニュアル

Copyright (c) 2010 jmcodex.com All rights reserved.