こんにちは、づやです。
AWS(Amazon Web Services)を利用した際に、RDSを利用することが多いかと思います。リードレプリカも簡単に作成できると思うのですが、アプリケーション側からどのリードレプリカに振り分けるかというのがなかなか大変なのではないでしょうか。そんなときの選択肢の 1 つとして、HAProxyを利用するのがよいかもしれません。
設定してみたので、今回はそちらを紹介します。
HAProxyとは
TCP 通信(L4)や HTTP 通信(L7)の負荷分散、プロキシとして利用可能な歴史あるソフトウェアです。豊富な負荷分散方式や ACL 設定が可能など機能面も充実しております。かなりハイパフォーマンスなソフトなので、L4 モードなら同時数百万セッション / 秒とかも捌けるらしいです。
HAProxyの導入方法
まずはインストールです。ちなみに今回は Amazon Linux AMI 環境で設定しております。yum にもありますが、最新安定板を使うのがオススメです。今回も公式からもってきてインストールして使いました。
※執筆時は 1.6.5 でした
公式ページからもってきて、解凍して make するだけですね。
>> http://www.haproxy.org/download/1.6/src/haproxy-1.6.5.tar.gz
RDS(リードレプリカ)側の準備
負荷分散の対象となるリードレプリカも当たり前ですが、複数必要となりますので、あらかじめ用意しておきます。
HAProxy が生存確認するためのユーザーの追加が、RDS 側で行わなければいけない設定となります。
INSERT INTO mysql.user (Host,User) values (‘xxx.xxx.xxx.xxx’,’haproxy_check');
こんな SQL を使って、ユーザーを追加します。
Host の値は環境によって変わると思いますが、HAProxy がアクセスできる Host を指定しておきます。HAProxyの設定
/etc/haproxy.cfg を作成して設定していきます。
今回はリードレプリカ 2 台、master 1 台という構成での設定を行ってみました。global # ログの出力 別途rsyslogの設定をしている log 127.0.0.1 local2 info # pidファイル pidfile /var/run/haproxy.pid # 1プロセスの最大接続数 maxconn 3000 # 実行ユーザとグループ user haproxy group haproxy # デーモンで起動させる daemon # 統計情報を見れるように stats socket /tmp/haproxy-cli.sock defaults # TCP(L4で接続させる) mode tcp # ログをglobalの設定を使う log global # retries 3 # 接続できない際の失敗とする時間 timeout connect 10s # ここから本題のmysqlの設定 listen mysql-slave bind 0.0.0.0:3306 mode tcp # 用意していたユーザで死活監視させる option mysql-check user haproxy_check # ラウンドロビン方式での振り分け。 # 他にもstatic-rr、leastconn、source等色々用意されている。 balance roundrobin # hekth checkもログに出力させる option log-health-checks # server ホスト名 IP:Port check inter 2000 fall 2 rise 3 # WebサーバのIPとPortを指定。checkはヘルスチェックの有効化でinter # でヘルチェック間隔の指定。単位はミリ秒なので今回は2秒。fallは2回。ri # ヘルチェックが落ちたら振り分け対象から切り離すという意味。 # rise 3は3回疎通が通ったら振り分け対象として復活させる server read1 xxxxx-slave1.xxx check port 3306 inter 2000 fall 2 rise 3 server read2 xxxxx-slave2.xxx check port 3306 inter 2000 fall 2 rise 3 # masterを指定しておくと、全部死んだ際にmasterに接続する server master xxxxx-master.xxx:43306 check port 3306 backup
起動させてみて、HAProxy 経由で RDS につないで分散されることを確認します。
mysql -u ユーザ名 -h ホスト -P ポート -p -e "show variables like 'server_id'"
とか、SQL を流して接続するたびに違う server_id が引けてたら OK です。
片方のレプリカ止めて確認したら、適切に忌避話されてるのも確認できるかと思います。これはなかなか便利なのではないでしょうか。
うまく使っていきたいですね。LIGはWebサイト制作を支援しています。ご興味のある方は事業ぺージをぜひご覧ください。