RDS mysqlリードレプリカ作成方法です。
RDSはリードアクセスが極端に多い場合、リードレプリカを複数作成し、マスターRDSの負荷を軽減させます。
以下のような構成を実現します。
WriteはMasterで行い、Readはリードレプリカで行う様にします。
RDSリードレプリカ作成方法
①マネージメントコンソールへログインし、RDSの画面を開きます。
②リードレプリカを作成したいRDSを選択し、[インスタンスの操作]⇒[リードレプリカの作成]を押下します。
③各種設定をする
- DBインスタンスクラスはマスターと同様のものにしています。
- DBインスタンス識別子を入力します。
- アベイラビリティーゾーンはEC2と同じゾーンにした方が、パフォーマンスが上がるので良いです。
約15分程で、利用可能となります。(設定中Masterが使用できなくなるということはありません。)
同様の手順を行うことで、2台のリードレプリカを作成します。
EndPoint名は以下のようなものが生成されます。
testread1.xxxxxxxxx.ap-northeast-1.rds.amazonaws.com
testread2.xxxxxxxxx.ap-northeast-1.rds.amazonaws.com
リードレプリカ作成はこれで終わりです。
【疑問】
ここで、ふと疑問が浮かびます。リードの振り分けはどうするのか?
色々と方法はあるようにですが、今回はとても使いやすいHAProxyを使用しました。
HAProxyのインストール、設定
WEBサーバはCentOS6で構築が前提です。
▼HAProxyの監視用ユーザーを作成
マスターのDBに接続してユーザーを作成します。
mysql -u dbuser -p -h test-sampledb.xxxxxxxxx.ap-northeast-1.rds.amazonaws.com mysql> grant usage on *.* to 'haproxy'@'%';
接続チェックしてみる
mysqld is aliveと出力されれば、OK!
mysqladmin ping -u haproxy -h test-sampledb.xxxxxxxxx.ap-northeast-1.rds.amazonaws.com mysqld is alive
▼HAProxyをyumでインストールします。
yum -y install haproxy =============================================================================================================================================================== Package Arch Version Repository Size =============================================================================================================================================================== Installing: haproxy x86_64 1.5.4-3.el6 base 792 k
設定ファイルバックアップ
cp -p /etc/haproxy/haproxy.cfg /etc/haproxy/haproxy.cfg_org
設定ファイル編集
vim /etc/haproxy/haproxy.cfg
▼変更前(コメント、改行除去した状態)
global log 127.0.0.1 local2 chroot /var/lib/haproxy pidfile /var/run/haproxy.pid maxconn 4000 user haproxy group haproxy daemon stats socket /var/lib/haproxy/stats defaults mode http log global option httplog option dontlognull option http-server-close option forwardfor except 127.0.0.0/8 option redispatch retries 3 timeout http-request 10s timeout queue 1m timeout connect 10s timeout client 1m timeout server 1m timeout http-keep-alive 10s timeout check 10s maxconn 3000 frontend main *:5000 acl url_static path_beg -i /static /images /javascript /stylesheets acl url_static path_end -i .jpg .gif .png .css .js use_backend static if url_static default_backend app backend static balance roundrobin server static 127.0.0.1:4331 check backend app balance roundrobin server app1 127.0.0.1:5001 check server app2 127.0.0.1:5002 check server app3 127.0.0.1:5003 check server app4 127.0.0.1:5004 check
▼変更後
global log 127.0.0.1 local2 chroot /var/lib/haproxy pidfile /var/run/haproxy.pid maxconn 4000 user haproxy group haproxy daemon stats socket /var/lib/haproxy/stats defaults mode tcp log global retries 3 timeout connect 10s timeout client 1m timeout server 1m timeout check 10s maxconn 3000 listen mysql bind 0.0.0.0:3306 mode tcp option mysql-check user haproxy balance leastconn server read1 testread1.xxxxxxxxx.ap-northeast-1.rds.amazonaws.com:3306 check port 3306 inter 10000 fall 2 server read2 testread2.xxxxxxxxx.ap-northeast-1.rds.amazonaws.com:3306 check port 3306 inter 10000 fall 2 server master test-sampledb.xxxxxxxxx.ap-northeast-1.rds.amazonaws.com:3306 check port 3306 backup
※ 補足
balance leastconn
上記を設定することで、もっとも接続数が少ないサーバーに割り振られるように設定しています。
server master test-sampledb.xxxxxxxxx.ap-northeast-1.rds.amazonaws.com:3306 check port 3306 backup
上記を設定することで、リードレプリカ1、リードレプリカ2がダウンした場合は、Masterへアクセスされるようにしています。(その時は当然Writeもできるようになります。)
起動設定をonにする
chkconfig haproxy on chkconfig --list haproxy haproxy 0:off 1:off 2:on 3:on 4:on 5:on 6:off
HAProxyを起動する
/etc/init.d/haproxy start
動作確認
HAProxy経由で、リードレプリカに接続する。
mysql -u dbuser -p -h 127.0.0.1
Read Onlyなので、CREATE、INSERT、UPDATEなどのSQL文は以下のエラーで不可であることを確認。
mysql> CREATE DATABASE test_db DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci; ERROR 1290 (HY000): The MySQL server is running with the --read-only option so it cannot execute this statement
▼注意点
HAProxyからmysqlへのヘルスチェックで、mysqlがHAProxyからの接続をブロックしてしまう問題があります。それを回避のため、以下の設定を行います。
RDSのパラーメータグループに以下を設定しましょう。
max_connect_errors=999999999
RDSレプリカの台数の増減があったら、設定ファイルを変更し、反映しましょう。
vim /etc/haproxy/haproxy.cfg
例えば、リードレプリカ2を破棄した場合は、以下の行を削除します。
server read2 testread2.xxxxxxxxx.ap-northeast-1.rds.amazonaws.com:3306 check port 3306 inter 10000 fall 2
設定反映は以下のコマンドで行います。
/etc/init.d/haproxy reload