2014年11月26日水曜日

MHA + HAproxyで、MySQLのHA構成を組む

https://www.flickr.com/photos/iwanamadrid/5808172940/in/photostream/

MHAとHAproxyを使って、MySQLのHA構成を組みます。
どちらも枯れたソフトウェアなので、使い方などを書いている方はかなり多いと思いますが、個人的なまとめとしてスライドに書き起こしてみました。
構成は下のようになります。



ポイントは、MySQLへの接続の中継をすべてHAproxyが担っているところです。
電車の線路における分機器といったイメージです。
これをアプリケーションと同じサーバに同居させています。HAproxyは、かなり軽いソフトウェアなのでアプリケーションの邪魔をしません。
MySQLへの参照を分散しているため、参照への高負荷対策としては、基本的にMySQL Slaveを増やしていきさえすれば良いとなります。
HAproxyはgraceful restartが可能なので、分散先のMySQL Slaveを設定したときに、無停止で投入することができます。

以下、HAproxyの設定のサンプルです。

MySQLへの参照アクセスはtimeout checkで10秒間以上の接続を切るようにしています。
log-errorで設定したファイルに、HAproxyがMySQLをチェックするタイミングで以下のログが書き込まれます。
2014-11-27 14:52:03 25199 [Warning] Client failed to provide its character set. 'utf8' will be used as client character set.
http://bugs.mysql.com/bug.php?id=72543
[3 Nov 18:04] Paul Dubois Noted in 5.6.23, 5.7.6 changelogs. The server no longer logs the following warnings because they are uninformative: Client failed to provide its character set. 'charset' will be used as client character set.
とのことです。
アプリケーションの要求によってそれぞれパラメータを調整するとよいでしょう。

Enjoy!