レプリケーション時のRESET MASTERとRESET SLAVE

4月 14, 2010

さっそく一部追記(2010/04/14)。

MySQLレプリケーションにおいて発行するコマンド、RESET MASTERとRESET SLAVE、
それぞれの動作・挙動についてうっすらとまとめておく。なお、どちらもスレーブ側で
実行するという前提で話を進める。

RESET MASTER
RESET MASTER文はスレーブがマスタに昇格するフェイルオーバー時に発行する。
これにより、スレーブはマスタのバイナリログを読みに行くのをストップする。
具体的には以下の状態になる。

バイナリログインデックスファイルを空白にリセット。
インデックスファイルにリストされたすべてのバイナリログを削除。


バイナリログがすべて消えてなくなるのではなく、例えばbin-log.000019まであった
バイナリログはリセットされ、bin-log.000001のみが存在する状態になる。

RESET SLAVE
RESET SLAVE文発行時の動作は以下のようになる。

マスタのバイナリログのレプリケーションポジションをリセットする。
master.info、relay-log.infoファイルを削除する。
リレーログファイルが初期化される。


リレーログファイル内のSQLスレッドが完了していない状況におけるコマンド発行に注意。
つまりリレーログ内のSQLスレッドを実行中にRESET SLAVEした場合、途中であっても
そのリレーログは削除される、ということだ。
SQLスレッドが完了しているかどうかの判別はどうするか。
SHOW PROCESSLIST¥GしたときのSQLスレッドの状態が以下ならOK、かもしれない。

State: Has read all relay log; waiting for the slave I/O thread to update it


あるいはSHOW SLAVE STATUSしたときの”Seconds_Behind_Master”が0ならOK、だろうか・・・。
でも、これもちょっと怪しい。ちなみにこの値は何かというと。

スレーブ SQL スレッドによって実行された最後の
マスタイベントのタイムスタンプから経過した秒数。


と、いうことなのでレプリケーション遅延の判定に使用される。
ちなみにこの値がNULLの時は、以下の状況が想定される。

スレーブ I/O スレッドが起動していない、またはマスタに接続されていない時


詳しくは以下参照。
12.6.2.7. SHOW SLAVE STATUS 構文
うっすら知ってはいたが、改めて読んでみたら最後の方、ついていけなくなりました。
・・・いかん、また話がそれた。

RESET SLAVE文は主にレプリケーション障害が発生した時などに実行する。
その際発行するコマンドは以下の順番になる。

1.STOP SLAVE
2.RESET SLAVE
4.改めてCHANGE MASTER TO文発行
4.START SLAVE

※一部修正。RESET SLAVEの前にSTOP SLAVEしておかないと、怒られる。


この後スタートしたレプリケーションは、再開ではなく新たなレプリケーションセットとなる。

気になっていることがある。フェイルオーバー時の、master.infoファイルの扱いだ。
master.infoファイルは動的に生成されるファイルなので、直接作成したり編集したりしない、
と参考書に書かれている。概ね正しいのだろうが、オフィシャルサイトに以下のような
ことが書かれている(一部自分解釈)。

スレーブマシンのMySQLサーバはマスタ参照先としてmaster.info
ファイルを使用し続ける。
※my.cnfではなくmaster.infoの記述が優先される。

参照先としてmaster.infoに書かれた値とは異なる値を使用する
にはmaster.infoファイルを取り除いてからサービスを再起動するか、
または CHANGE MASTER TO ステートメントを使用し、
スレーブ実行中に値をリセットする。


スレーブがマスタにフェイルオーバーした後もデータディレクトリ配下にmaster.infoが
残っているのが目障りだと思っていたのだが、手動で削除するのは問題なさそうだ。
上記はフェイルオーバー時ではなく「スレーブとして再起動」というシチュエーションが
前提となっているようだが。

個人的な疑問
(完全個人的メモ書きです。読み飛ばしてください)
スレーブ→マスタフェイルオーバー時に、手動でmaster.infoを削除するのではなく、
RESET SLAVE文発行でクリーンアップするやり方って、ありなんだろうか。
master.infoもリレーログもマスタマシンとして稼働している間は必要ないわけだし、
マスタ昇格後でもSHOW SLAVE STATUSを実行すると、スレーブだった時の
エラー情報が表示されてしまうことがあり、これまた目障りだ。
これらをクリーンアップするにはRESET SLAVE文がてっとり早いと思うのだが、
フェイルオーバー時にRESET SLAVEを実行する手順例は、オフィシャルサイトはもちろん、
他のブログ/サイトでも見つからない。うぅむ・・・

多分また追記。


Categories: MySQL