実録、ほぼ無停止な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台にログイ
- 左上: managerノード上でvipに対して接続テストするスクリプトを実行
- 左下: 同じくmanagerノード上でシェル操作
- 右側: mysqlノード3台でそれぞれmysqlのログをtail
- 一旦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
ここを変更すれば別のバージョンで試したり、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して変えていったら原型が全くなくなった。