実録、ほぼ無停止なMHAによるマスターフェイルオーバー(動画もあるよ

タイトルはこちらのインスパイアです。

 

これはPepabo Advent Calendar 2014 - Qiita18日目のエントリーです。 昨日は@社内での活動履歴でした。なかじーーー。

 

1年半ぶりのblog更新ですが、そこそこ元気にやってます。もじゃもじゃは辞めました。 で、MHAですが、MHAってあれです。これです。

MHA for MySQL の概要 - Gosuke Miyashita

すごいです。すごいので今更ですが導入しようとおもいました。

ありがたいことにMHAはドキュメントが非常に充実しているので、大抵のことはそれを読めば把握できます。

mysql-master-ha/Wiki

 が、賢明なインフラエンジニアのみなさんは次のように思うはずです。

  • 実際に構築して動かして検証しないことには!
  • 実運用を想定した意地悪を色々やってみたい!
  • 色々やって環境をぶっ壊して、再現してまたぶっ壊したい!
  • ip_failoverスクリプトを実装して、動作検証したい!

だがしかし、MHAは最低でも3台のホストが必要なのです。カジュアルに3台もオンプレサーバ調達できないし、同じような設定、構築を複数台で何度も行うのは辛いし、そろそろ四十路だ。

 というわけで、つくったのがこちらでです。*1

lamanotrama/vagrant-mha · GitHub

 

デモ

https://cloud.githubusercontent.com/assets/329120/4963945/e8a0eab2-6736-11e4-8823-1616f8033ff7.gif

 

細かいことは置いといて、このデモ動画でやってることはざっくりこんな感じです。

  1. muxを使ってtmuxのpaneを複数開き、vagrant(virtaulbox)のvm4台にログイ
  2. 左上: managerノード上でvipに対して接続テストするスクリプトを実行
  3. 左下: 同じくmanagerノード上でシェル操作
  4. 右側: mysqlノード3台でそれぞれmysqlのログをtail
  5. 一旦mhaマネージャデーモンを停止 -- 起動しているとオンラインmaster切り替えが実行できない + オンラインマスター切り替えを2回実行
  6. マネージャデーモンを起動 + 右上の現master(node001)のmysqldを停止
  7. マネージャによる自動マスター切り替え

 

左下のシェル操作以外は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)上で実行すると、各vmvagrant sshしてあれこれやってくれます。その後レプリケーションとかMHA用にGRANT入れるのは、vagrant provison実行でよろ。

 

まとめ 

  • コマンド数発でMHAを試せる環境をセットアップできるものを作った
  • 検証するときに便利だと思うヘルパースクリプトもつくった
  • 一応動くip failoverスクリプトのサンプル実装もおいといた

 

どうぞご利用ください。

 

明日は@です。

*1:便利そうなプロジェクトを見つけたので試したんだけど、まず動かないし、色々微妙なとこがあったのでforkして変えていったら原型が全くなくなった。