MySQLリレーログの仕様を学ぶ

4月 22, 2010

MySQLレプリケーションの実装にあたってはバイナリログの存在が不可欠。
そしてスレーブ側マシンにおいてはリレーログが不可欠である。
レプリケーションの処理におけるバイナリログとリレーログの相関について、
今一度まとめてみた。簡単に書くと以下のようになる。

マスタ側の更新系のクエリが、マスタのバイナリログに記録される。
↓ ↓ ↓
スレーブのI/OスレッドがマスタのBinlog Dumpスレッドに接続し、
マスタのBinlog Dumpスレッドはバイナリログの内容を送信する。
↓ ↓ ↓
スレーブのI/Oスレッドは、受け取ったマスタのバイナリログをリレーログに保存。
↓ ↓ ↓
スレーブのSQLスレッドがリレーログからクエリを読み取って実行。


リレーログの挙動について今ひとつ理解していなかったのだが、オフィシャルサイト
に以下のように書いてある。

リレーログはバイナリログと同じ形式なので、mysqlbinlog で読み取ることができます。
リレーログは必要がなくなると(そのイベントがすべて実行されたら)、SQL スレッド
によって自動的に削除されます。


自動的に削除されるのは知らなかった。
ちなみに新規にリレーログが作成されるタイミングは以下となる。

1.スレーブサーバの起動後、最初に I/O スレッドが開始されたとき。
またはMySQL 5.0 以降の場合は、I/O スレッドが開始されるたびに。
2.FLUSH LOGS実行時。
3.規程のサイズを超えたとき。
※max_relay_log_sizeもしくはmax_binlog_sizeに準ずる。


1.の他はマスタのバイナリログにおける仕様と同じみたいだ。

relay-log.infoについて
relay-log.infoファイルはSQLスレッドによって更新される。
(master.infoファイルはI/Oスレッドによって更新される)
relay-log.infoには、マスタのバイナリログのどこまでがリレーログに記録されているか、
またリレーログのどこまでを実行したかが記録される。
以下は例だが、こんな情報が記録される。

/var/lib/mysql/relay-bin.000018
251
log-bin.000009
106


以下、またオフィシャルサイトからの抜粋だが、気になることが書いてあった。

スレーブのデータをバックアップするとき、リレーログファイルとともにこれら 2 つの
小さなファイル(注:master.infoとrelay-log.infoのこと)もバックアップ
してください。スレーブのデータをリストア後、レプリケーションを再会するのに
必要となります。リレーログを失った場合でも relay-log.info ファイルがあれば、
SQL スレッドがマスタバイナリログをどこまで実行したか調べることができます。

うーむ、relay-log.infoはともかく、リレーログ自体はリカバリには必要ないから
バックアップはとらなくていいと思っていたのだが。
大体、SQL文が実行されたら消えていくものだしなぁ。
しかし、上記の例はどうも、スレーブで取得したバックアップによりスレーブマシン
をリカバリする状況を想定しているように思われるので、そうであればリレーログも
必要になってくるのかな。
まぁ他にも調査・解析に使うこともあるかもしれないから、binlogと一緒に
バックアップ取得しておいてもいいだろう。

ちなみにスレーブにもバイナリログを出力させる設定にしていれば、スレーブマシン
にはリレーログファイルと共にバイナリログも存在する状態になる。
推測だが、スレーブ側のバイナリログはリレーログで実行したSQL文が記録されて
いくのだろう。
よって完全に同期がとれている状態であっても、あるイベントのポジションの位置は
マスタとスレーブでは異なる。
つまり、マスタ側の「バイナリログナンバー:ポジション番号」とスレーブ側の
「バイナリログナンバー:ポジション番号」は同一とはならない。
当初この辺りの仕様が分からず、しばし混乱した。

追記
I/OスレッドとSQLスレッドについても、改めてメモ。
スレーブ側でSHOW PROCESSLIST¥Gとすると、(通常のクエリ等のプロセスの他に)
I/OスレッドとSQLスレッドの名プロセスの情報が表示される。
レプリケーションが正常に稼働していることを前提とすると、以下のメッセージが
出力されているはず。

I/Oスレッドのプロセスに表示
State: Waiting for master to send event 

SQLスレッドのプロセスに表示
State: Has read all relay log; waiting for the slave I/O thread to update it


この時のマスタ側SHOW PROCESSLIST¥Gの結果、Binlog Dumpスレッドには以下が表示される。

State: Has sent all binlog to slave; waiting for binlog to be updated


スレーブ側ではI/Oスレッド・SQLスレッドともに”Command”の項目は”Connect”に
なっているはずで、マスタ側では”Binlog Dump”になっている。
“State”に表示されるメッセージはその時の状態により他の内容の場合もある。
(詳しくは以下URL参照)

スレーブ側のStateメッセージは、SHOW SLAVE STATUS¥Gで一番上のSlave_IO_State
にも出力される。
(MySQL 4.1.1 以降)
基本的に、レプリケーションのステータスを確認するならSHOW SLAVE STATUS¥G
だけでもよいだろう。


・・・また長文になってしまった・・・

参考URL
5.5.1. レプリケーション実装の詳細
4.11.3. レプリケーションの実装の詳細

Categories: MySQL

No Responses so far | Have Your Say!

Comments are closed.