レプリケーションしてるMySQLで、マスタやスレーブが障害停止した場合のリカバリプラン でも掲げたゴールである、「マスタが落ちてもぐーすか寝ていられるようにしたい」がほぼできたので、ほとんどサービスが停止することなく、フェイルオーバする様をスクリーンキャストに収めました。
埋め込みプレイヤーだと、小さくてわからないと思うので、リンク直接でみてください。
http://www.irori.org/pub/mysql-mm.mov
登場するホスト
登場するホストは2台、db901とdb902です。
最初は、db901が更新系クエリを受けるプライマリでdb900の浮動IPアドレスを持っています。
画面分割
画面は5分割しています。
動画の解説
- 00:00
- はじまりはじまり。db900に対するselect、db900,db901,db902に対するping、すべて正常に流れている。selectのserver_idは、db901のものである「901」が返ってきているのを覚えておいてください。
- 00:11
- この時点でのプライマリでもあるdb901を強制終了する。強制終了には SysRq を使ってバルスっと落とす (# echo b > /proc/sysrq-trigger)
- 00:12
- db901が停止したので、db901に対するpingがとまる。db901はdb900でもあったので、db900に対するpingとdb900に対するselectも止まる。
- 00:17
- 首尾よくフェイルオーバが完了し、db902がdb900となったので、db900に対するpingとdb900に対するselectが回復(server_idが「901」から「902」に変わっている点に注目!)した。yay!
フェイルオーバのメカニズム
今回のケースでは、停止から 5 秒後には、
- 異常の検知
- プライマリのフェイルオーバ
が完了しています。
フェイルオーバのメカニズムは、レプリケーションしてるMySQLで、マスタやスレーブが障害停止した場合のリカバリプラン の 「<セカンダリをプライマリに昇格>」に書いた通りなんですが、監視とこのフェイルオーバ処理の実装は、
- keepalived --vrrp
- MySQLのL7レベルの監視をするスクリプト (check-service.db)
- 状態変更時にもろもろの処理をするスクリプト (trigger-vrrp.db)
- keepalived.confのnotifyや、check-service.db から実行される
で行ってます。
あとがき
これでお正月は安心しておもちがたべられそうです ^ρ^