MySQLレプリケーションにおけるフェイルオーバー
MySQLレプリケーションにおいて、スレーブをマスタとしてフェイルオーバーさせる時に
やることをざっくりまとめてみた。
マスタでは障害等によりMySQLインスタンスが停止していることが前提。
マスタ1:スレーブ1構成の場合
1.マスタに昇格するスレーブにSTOP SLAVEを発行。
2.マスタに昇格するスレーブにRESET MASTERを発行。
3.スレーブに降格するマシンでCHANGE MASTER を実行し、
START SLAVEする。
もう少し詳しく書くと。
1.スレーブ側でIOスレッドでのバイナリログ受け渡しが完了する頃を見計らって、
STOP SLAVE IO_THREAD を発行。
mysql > STOP SLAVE IO_THREAD;
“Has read all relay log”を確認できまるまで、SHOW PROCESSLIST の出力結果をチェックする。
2.スレーブ側でRESET MASTERを発行する。
mysql > RESET MASTER;
これによりインデックスファイルにリストされたすべてのバイナリログを削除し、
バイナリログインデックスファイルを空白にリセットする。master.infoファイルも削除され、
バイナリログを読みに行くのをストップする。
また、バイナリログの位置情報が初期化される。
追記:RESET MASTER文ではmaster.infoファイルは削除されない。RESET SLAVEにより削除される。
3.スレーブ側のread_onlyを解除する。my.cnfにはあえて記述せずシステム変数のセットで
対応すれば、ランタイムに実行できる。1で有効、0で無効となる。
もちろん、my.cnfで記述しておいてコメントアウトしてインスタンス再起動、でもよいわけだが。
my.cnfの編集やサービス再起動を避けたい向きにはSETコマンド発行がよいだろう。
mysql > SET GLOBAL read_only = 0;
※GLOBALをつけないと怒られる。。
この時点で新マスタ(元スレーブ)は更新/読取りどちらも処理できるようになる、はず。
4.停止していた元マスタにおいてはリストアを実施後、インスタンスを起動。
5.起動後、SET GLOBAL read_only = 1 → CHANGE MASTER → START SLAVE を実行する。
この時のCHANGE MASTER では、バイナリログ名や読み込み先のバイナリログ位置を指定する必要はない
(デフォルトで一番初めのバイナリログ、位置は 4、が認識される)。
この辺りはオフィシャルサイトに書いてあるので確実だろう。
大体こんなところだろうか。
Webアプリの参照先を変更するとか(あるいは動的に変更するようにしておくとか)、
付随してやるべきこともあるかもしれない。
オフィシャルサイトには「新たなレプリケーションを整えた後に、Web Client が
マスタへ昇格したマシンへクエリを送信するよう指示します」と書いてある。
これもいろんなやり方があるだろうが、、、考え出すときりがない。
機会があれば別途書くとして。
スレーブが複数台のケースも一応書いておく。
マスタ1:複数スレーブ構成のケース
1.更新処理完了を見計らい、すべてのスレーブで STOP SLAVEを発行。
2.マスタに昇格するスレーブに RESET MASTERを発行。
3.他のスレーブには CHANGE MASTER を実行する。
スレーブに降格するマシンでも同様とし、START SLAVEする。
それから大事なことを。
スレーブマシンでは「log-binは有効だがlog-slave-updatesは無効である」
という状態にしておくべきらしい。スレーブが複数の場合、log-slave-updatesを有効に
しておくと切り替え時にアップデートを二度受信してしまう、という問題があるためだとか。
うーむ、スレーブをスムーズに昇格させるにはlog-slave-updatesを有効にしておくのが
いいと思っていたのだが。。
ちなみにオフィシャルサイトには「log-slave-updatesはレプリケーションサーバを
チェーン状に構成する場合に使用する」とある。
あくまで自分の解釈だが、log-slave-updatesオプションはピラミッド構成なら
無効に、チェーン状構成なら有効にするという認識でよいと思われる。
そんなこんなで、一筋縄でいきそうにないMySQL Replicationのフェイルオーバー。
何か出て来たらまた追記。
参考URL
5.3.6. フェイルオーバでのマスタ切り替え
MySQL バージョン 5.0.3-alpha リファレンスマニュアル – 4
12.6.2.1. CHANGE MASTER TO 構文
MySQLでスレーブをマスターに
4.2.4 システム変数の使用
4.2.4.2. 動的システム変数
MySQLシステム変数