読者です 読者をやめる 読者になる 読者になる

s_tajima:TechBlog

渋谷で働くインフラエンジニアのTechブログです。

MHA + HAproxyによるMySQLの冗長構成の検証 (環境構築編)

現在運用中の、Heartbeat + DRBDによるMySQLクラスタ環境の改善を試みるために、
MHA + HAproxyによるMySQLクラスタ環境をテスト中。

今回は環境を整えるところまで。

環境構築

AWS上に以下の図と文章で示すような環境を構築。

  • webserver, manageserver, mysqlserver * 3台(master, slave, slave)
  • webserverは同ホスト上で稼働しているHAproxy経由でMySQLサーバーにアクセス
    • 初期状態
      • 127.0.0.1:3310でmysqlserver-aのmysql(master)に接続。WRITE処理を行う想定。
      • 127.0.0.1:3311でmysqlserver-[bc]のmysql(slave)に接続。READ処理を行う想定。
    • フェイルオーバー後
      • 127.0.0.1:3310でmysqlserver-bのmysql(master)に接続。WRITE処理を行う想定。
      • 127.0.0.1:3311でmysqlserver-cのmysql(slave)に接続。READ処理を行う想定。
  • managerで稼働しているMHAデーモンがmasterを監視。
    • slaveを監視していないのはMHAの基本的な挙動。MHAは基本的にはmasterの動作しか監視していない。
  • フェイルオーバーの動作
    • master障害時にはmysqlserver-[bc]から新たなmasterを選出する。
    • mysqlserver-[bc]のうち、slaveのままになった方のレプリケーションの参照先の切り替えもMHAが担当。
    • HAproxyの設定変更は、MHAがフェイルオーバー時にキックするスクリプトによって実現
  • OSはScientificLinux6.4を使用。

構築手順

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を起動する。

 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