気軽にRDSの負荷分散

RDSの負荷分散にnginxのstream機能を使った話。

やりたいイメージ
f:id:sonedayuya:20170211160017p:plain


前提

  • RDSのマスターとレプリカで負荷分散させたい
  • ELBでやろうとしたけどEC2にしか対応していない
  • HAproxy MySQLproxyちゃんと構築する時間がない


nginx再ビルド

  • nginxの標準で対応しているロードバランサーはhttp通信のみ対応。
  • tcpでも対応させたい場合はstreamモジュールが必要
  • Nginx v1.9.0以上が対応している機能

TCP Load Balancing with NGINX Plus R6 and NGINX 1.9.0

http://nginx.org/download/nginx-1.11.9.tar.gz
./configure --with-stream
make
make install


設定ファイル
nginx.conf

helthcheckの設定とかtimeout設定したい場合は、

色々オプションあるので適当に。

以下最低限

stream {
    error_log /var/log/nginx/mysql_proxy.log;

    upstream mysql {
        zone backends 64k;
        server rds-master:3306 fail_timeout=30s;
        server rds-rep:3306 fail_timeout=30s;
    }

    server {
        listen 3360;
        proxy_pass mysql;
        proxy_timeout 10s;
        proxy_connect_timeout 1s;
    }
}




確認

  • 接続できればOK
mysql -h 127.0.0.1 --port 3360 --protocol tcp -u hoge --pass
  • ちゃんと分散されてるかはMasterとReplicaにそれぞれ接続しコネクション数を確認
 SELECT * FROM information_schema.PROCESSLIST;
  • あとはwightの調整とか分散具合に合わせて調整すればOK
  • writeの場合はmasterに書き込みにいくようApplicatino側を修正。
  • 書き込めたらOK