lamanotramaの日記

2014-12-18 実録、ほぼ無停止な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. 一旦mhaマネージャデーモンを停止
    • 起動しているとオンラインmaster切り替えが実行できない
  3. オンラインマスター切り替えを2回実行
  4. マネージャデーモンを起動
  5. 右上の現master(node001)のmysqldを停止
  6. マネージャによる自動マスター切り替え

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


まとめ


どうぞご利用ください。


明日は@です。

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