Hatena::ブログ(Diary)

(ひ)メモ このページをアンテナに追加 RSSフィード

2009-11-11 (Wed)

実録、ほぼ無停止なMySQLのフェイルオーバ (動画もあるよ)

レプリケーションしてるMySQLで、マスタやスレーブが障害停止した場合のリカバリプラン でも掲げたゴールである、「マスタが落ちてもぐーすか寝ていられるようにしたい」がほぼできたので、ほとんどサービスが停止することなく、フェイルオーバする様をスクリーンキャストに収めました。

埋め込みプレイヤーだと、小さくてわからないと思うので、リンク直接でみてください。

http://www.irori.org/pub/mysql-mm.mov

登場するホスト

登場するホストは2台、db901とdb902です。

最初は、db901が更新系クエリを受けるプライマリでdb900の浮動IPアドレスを持っています。

画面分割

画面は5分割しています。

  • 左上 = 「select sysdate(),@@server_id」をdb900に対して(sleep 1しながら)延々と実行しまくりんぐ
  • 右上 = ping -n db900
  • 右下の2つ = 上のが ping -n db901、下のが ping -n db902
  • 左下 = db901を落とそうと待ち構えているターミナル

動画の解説

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 から実行される

で行ってます。

あとがき

これでお正月は安心しておもちがたべられそうです ^ρ^

twktwk 2009/11/12 18:05 わかりやすい動画ありがとうございます。ただ、フェイルオーバーしても一台での運転じゃおもちは食べられないのでは?

はてなユーザーのみコメントできます。はてなへログインもしくは新規登録をおこなってください。

2003 | 11 | 12 |
2004 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 10 | 11 | 12 |
2005 | 01 | 02 | 03 | 05 | 08 | 09 | 10 | 11 | 12 |
2006 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2007 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2008 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2009 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2010 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2011 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 12 |
2012 | 01 | 02 | 03 | 06 | 08 | 10 | 11 | 12 |
2013 | 01 | 02 | 03 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2014 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 10 |
2015 | 01 | 02 | 07 | 10 |
2016 | 01 | 05 | 10 |