HAProxyを使ってMySQLの負荷分散をする時はmysql-checkのuserオプションを使う

AWS運用自動化サービス「Cloud Automator」
この記事は1年以上前に書かれたものです。
内容が古い可能性がありますのでご注意ください。
こんにちは、テクニカルグループの柳瀬です。 アプリケーションサーバからMySQLへの参照を負荷分散する場合、HAProxyを使うことがあります。 AWS上で構築している場合はリードレプリカへの参照を負荷分散させたいというご要望を受けた時ですね。 HAProxyは負荷分散対象に監視を設定し、ダウンと判断したものは分散対象から除外してくれるのでとても便利です。 しかし、MySQLへTCPで監視を設定しているとMySQL側が監視用のパケットを不正と判断して、リクエストを受け付けなくなってしまいます。 max_connect_errorsを大きい値にするという対応もありますが、HAProxyの監視設定で使用するmysql-checkにユーザーオプションを使用すれば不正なパケットとはなりません。

検証環境構成

  • Amazon Linux
  • HAProxy 1.4.22
  • RDS(Multi AZ)
  • RDSリードレプリカ×2

MySQLクライアントのインストール

まずはこれをインストールしないとはじまりませんよね。

HAProxy用のログ設定

きちんとログを出力するように設定しておきます。

HAProxyの監視用ユーザーを作成

マスターのDBに接続してユーザーを作成します。

HAProxyのインストールと設定

option mysql-checkの後にuser haproxyと記載されているところがポイントです。 以下の設定ではリードレプリカがダウンした場合はMasterとなるRDSに接続するようになっています。

負荷分散の動作確認

動作確認をすると負荷分散されている事が分かると思います。

リードレプリカを削除した後に接続すると、RDSのマスターに接続します。

まとめ

監視用のユーザーを追加して少し設定を変更するだけでOKなので、簡単に適用する事が出来ますね:-)

参考リンク

AWS運用自動化サービス「Cloud Automator」