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

