2014-12-18 実録、ほぼ無停止なMHAによるマスターフェイルオーバー(動画もあるよ
これはPepabo Advent Calendar 2014 - Qiita18日目のエントリーです。
昨日は@nakajijapanの社内での活動履歴でした。なかじーーー。
1年半ぶりのblog更新ですが、そこそこ元気にやってます。もじゃもじゃは辞めました。
で、MHAですが、MHAってあれです。これです。
MHA for MySQL の概要 - Gosuke Miyashita
すごいです。すごいので今更ですが導入しようとおもいました。
ありがたいことにMHAはドキュメントが非常に充実しているので、大抵のことはそれを読めば把握できます。
が、賢明なインフラエンジニアのみなさんは次のように思うはずです。
- 実際に構築して動かして検証しないことには!
- 実運用を想定した意地悪を色々やってみたい!
- 色々やって環境をぶっ壊して、再現してまたぶっ壊したい!
- ip_failoverスクリプトを実装して、動作検証したい!
だがしかし、MHAは最低でも3台のホストが必要なのです。カジュアルに3台もオンプレサーバ調達できないし、同じような設定、構築を複数台で何度も行うのは辛いし、そろそろ四十路だ。
というわけで、つくったのがこちらでです。*1
lamanotrama/vagrant-mha ? GitHub
デモ
細かいことは置いといて、このデモ動画でやってることはざっくりこんな感じです。
- muxを使ってtmuxのpaneを複数開き、vagrant(virtaulbox)のvm4台にログイン
- 一旦mhaマネージャデーモンを停止
- 起動しているとオンラインmaster切り替えが実行できない
- オンラインマスター切り替えを2回実行
- マネージャデーモンを起動
- 右上の現master(node001)のmysqldを停止
- マネージャによる自動マスター切り替え
左下のシェル操作以外はREADMEにある、setup手順とdemoの開始コマンドだけで勝手に始まります(多分)。
便利そうじゃないですか?
くわしく
というか想定問答集的な。
provisioning
vmのprovisioningにはpuppetを使っています。
MHA周りの定義はpuppetモジュールとして切り出してあるので、librarian-puppetを使って本番でもさくさくーと同様の環境を構築できるという寸法です。もうちょいブラッシュアップしたら、PuppetForgeにもupします。
lamanotrama/puppet-mha ? GitHub
mysqlのバージョン(パッケージ名)はこの辺で定義しています。
https://github.com/lamanotrama/vagrant-mha/blob/master/roles/mha_node/manifests/init.pp#L15
class { '::mysql::server': manage_config_file => false, package_name => "Percona-Server-server-55", package_ensure => installed,
ここを変更すれば別のバージョンで試したり、node毎に別々のバージョンにしたりってのも出来ます。vmにはmysql本家やpercona、epelといったyumリポジトリは登録済です。
OSは全部CentOS6にしていますが、それはVagrantfileで変更してください。多分el5、6とそのクローンOSでなら動くんじゃないかなと思います(試してない)。
mysql_online_switch ってなんぞ
オンラインでのmaster切り替えには /usr/bin/masterha_master_switch を使うことになっているんですが、オプションの指定が多くて面倒なので、よく指定する(であろう)オプションを面倒みてくれる簡単なラッパースクリプトを作りました。デモで実行しているのはそれです。
puppet-mha/mysql_online_switch at master ? lamanotrama/puppet-mha ? GitHub
接続でなくて更新のテストもしたい
そんなこともあろうかと、単純な更新テストできるスクリプトも置いておきました。
vagrant-mha/roles/mha_manager/templates/usr/local/bin at master ? lamanotrama/vagrant-mha ? GitHub
ip failover どうなってんの
MHAのリポジトリにサンプル実装があるので、それにちょちょいと手を加えて、単純なエイリアスIP付け替えを行うようにしました。
この辺に置いてます。
vagrant-mha/roles/mha_manager/files/usr/local/libexec at master ? lamanotrama/vagrant-mha ? GitHub
尚、初回vagrant up直後はnode001にvipを付けていますが、vmを停止して再度起動してもアタッチされないので、都度vagrant provisonを実行してvipをくっつけてください。手打ちでifconfigでもいいです。
環境のリセット
いろいろ試してレプリケーションをぶっ壊わした後に、全nodeでmysql_install_db実行したりするのは面倒臭かろう。ということでdbをresetするスクリプトを入れておきました。
vagrant-mha/reset_dbs.sh at master ? lamanotrama/vagrant-mha ? GitHub
ホストマシン(Mac)上で実行すると、各vmにvagrant sshしてあれこれやってくれます。その後レプリケーションとかMHA用にGRANT入れるのは、vagrant provison実行でよろ。
まとめ
明日は@kurotakyです。
*1:便利そうなプロジェクトを見つけたので試したんだけど、まず動かないし、色々微妙なとこがあったのでforkして変えていったら原型が全くなくなった。