HAProxyを利用してRDSのリードレプリカを振り分けてみる

HAProxyを利用してRDSのリードレプリカを振り分けてみる

Kazuya Takato

Kazuya Takato

こんにちは、づやです。

AWS(Amazon Web Services)を利用した際に、RDSを利用することが多いかと思います。リードレプリカも簡単に作成できると思うのですが、アプリケーション側からどのリードレプリカに振り分けるかというのがなかなか大変なのではないでしょうか。そんなときの選択肢の 1 つとして、HAProxyを利用するのがよいかもしれません。

設定してみたので、今回はそちらを紹介します。
 

HAProxyとは

HAProxy-logo

TCP 通信(L4)や HTTP 通信(L7)の負荷分散、プロキシとして利用可能な歴史あるソフトウェアです。豊富な負荷分散方式や ACL 設定が可能など機能面も充実しております。かなりハイパフォーマンスなソフトなので、L4 モードなら同時数百万セッション / 秒とかも捌けるらしいです。

>> HAProxy 公式ページ
 

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サイト制作を支援しています。ご興味のある方は事業ぺージをぜひご覧ください。

Webサイト制作の実績・料金を見る

この記事のシェア数

1983年生まれ。SIerとしてのキャリアをスタートし、JavaやC#を中心に多岐にわたる開発プロジェクトにエンジニアとして参加。その経験を活かし、LIGを創業。バックエンドおよびフロントエンドエンジニアとしての深い知識と経験をもとに、多様なプロジェクトに従事。2023年7月には社長室室長に就任にし、社内の体制やルールの最適化、AI技術の推進など、経営戦略の一翼を担っています。

このメンバーの記事をもっと読む
LIGのインフラ白書 | 4 articles