MHA + HAproxyによるMySQLの冗長構成の検証 (環境構築編)
現在運用中の、Heartbeat + DRBDによるMySQLクラスタ環境の改善を試みるために、
MHA + HAproxyによるMySQLクラスタ環境をテスト中。
今回は環境を整えるところまで。
環境構築
AWS上に以下の図と文章で示すような環境を構築。
構築手順
mysqlのインストール, レプリケーションの設定(@mysqlserver-[abc])
MySQL Community Server 5.6.16 をインストール。
mysqlserver-a -> mysqlserver-[bc]のレプリケーションを設定する。
細かい手順は割愛。
作業用ディレクトリの作成(@全サーバー)
作業用のディレクトリとして、
/etc/mha4mysql
/var/log/mha4mysql
を全サーバーに作成しておく。
MHAのインストール、設定(@全サーバー)
以下のページからrpmをダウンロード。
MHA(manager)
http://code.google.com/p/mysql-master-ha/downloads/detail?name=mha4mysql-manager-0.52-0.noarch.rpm
MHA(node)
http://code.google.com/p/mysql-master-ha/downloads/detail?name=mha4mysql-node-0.52-0.noarch.rpm
managerserverにはmanagerとnodeを
mysqlserver-[abc]にはnodeを
それぞれインストールする。
MHAの細かい設定手順については
https://code.google.com/p/mysql-master-ha/wiki/Tutorial
この辺りに詳しく載っているので割愛。
/etc/mha4mysql/manager.confの設定は以下の通り。
設定ファイルを指定して起動。実際にはnohupと&を付けてbackgroundで起動。
managerserver# masterha_manager --conf=/etc/mha4mysql/manager.conf
ここまでの設定で、MySQLのレプリケーションクラスタがMHAによってフェイルオーバーする仕組みは完成。
続いてはHAproxyによってwebserverからのMySQLサーバーの接続先を切り替える環境を構築する。
HAproxyのインストール、設定(@webserver)
HAproxyについてはSL6.4のEPELリポジトリに登録されているのでyumで普通にインストールできる。
haproxyの設定はMHAと連携して書き換わる必要があるので、
以下のような設定を行う。
- 初期状態の/etc/haproxy/haproxy.cfgを配置。
- /etc/haproxy/haproxy.cfg.erbにフェイルオーバー時に切り替えるためのhaproxy.cfgのテンプレートを準備
- /etc/mha4mysql/manager.confのmaster_ip_failover_scriptに、フェイルオーバー時のスクリプト/etc/mha4mysql/scripts/rewrite_haproxy_config.rbを設定
- このスクリプトが、フェイルオーバー完了後にキックされ、haproxy.cfgの書き換えとhaproxyのreloadを行う。
- https://code.google.com/p/mysql-master-ha/wiki/Parameters#master_ip_failover_script
設定ファイルとスクリプトの設置が完了したら、HAproxyを起動する。
webserver# /etc/init.d/haproxy start
尚、今回はwebserverとmanagerserverが同一インスタンスなのでmaster_ip_failover_scriptで直接rewrite_haproxy_config.rbを指定したが、
本来はリモートサーバーにあるrewrite_haproxy_config.rbを呼び出すスクリプトを指定する必要がありそう。
以上で、MHA + HAproxyによるMySQLの冗長構成環境が作成完了。
これからこの環境でいろいろと検証していく予定。
(おまけ)環境構築時に詰まった問題
libのインストールディレクトリの問題
masterha_check_ssh実行時に以下のようなエラーに。
managerserevr# masterha_check_ssh --conf /etc/mha4mysql/manager.conf Can't locate MHA/SSHCheck.pm in @INC (@INC contains: /usr/local/lib64/perl5 /usr/local/share/perl5 /usr/lib64/perl5/vendor_perl /usr/share/perl5/vendor_perl /usr/lib64/perl5 /usr/share/perl5 .) at /usr/bin/masterha_check_ssh line 25. BEGIN failed--compilation aborted at /usr/bin/masterha_check_ssh line 25.
本環境では/usr/lib64/perl5/vendor_perl/以下にインストールされなければならないMHAが、
/usr/lib/perl5/vendor_perl/にインストールされているのが原因の模様。
managerserevr# rpm -ql mha4mysql-manager-0.52-0.noarch | grep lib /usr/lib/perl5/vendor_perl/MHA/Config.pm /usr/lib/perl5/vendor_perl/MHA/DBHelper.pm /usr/lib/perl5/vendor_perl/MHA/FileStatus.pm /usr/lib/perl5/vendor_perl/MHA/HealthCheck.pm /usr/lib/perl5/vendor_perl/MHA/ManagerAdmin.pm /usr/lib/perl5/vendor_perl/MHA/ManagerAdminWrapper.pm /usr/lib/perl5/vendor_perl/MHA/ManagerConst.pm /usr/lib/perl5/vendor_perl/MHA/ManagerUtil.pm /usr/lib/perl5/vendor_perl/MHA/MasterFailover.pm /usr/lib/perl5/vendor_perl/MHA/MasterMonitor.pm /usr/lib/perl5/vendor_perl/MHA/MasterRotate.pm /usr/lib/perl5/vendor_perl/MHA/SSHCheck.pm /usr/lib/perl5/vendor_perl/MHA/Server.pm /usr/lib/perl5/vendor_perl/MHA/ServerManager.pm managerserevr# rpm -ql perl-5.10.1-119.el6.x86_64 | grep /usr/lib /usr/lib64/perl5/5.10.0 /usr/lib64/perl5/5.10.0/x86_64-linux-thread-multi /usr/lib64/perl5/5.10.0/x86_64-linux-thread-multi/CORE .. snip ..
シンボリックリンクを貼ることで回避。
managerserevr# ln -s /usr/lib/perl5/vendor_perl/MHA /usr/lib64/perl5/vendor_perl/MHA
※よくある質問に載ってた。
https://code.google.com/p/mysql-master-ha/issues/detail?id=30