RDSリードレプリカ環境を構築してみる

RDS mysqlリードレプリカ作成方法です。
RDSはリードアクセスが極端に多い場合、リードレプリカを複数作成し、マスターRDSの負荷を軽減させます。
以下のような構成を実現します。
WriteはMasterで行い、Readはリードレプリカで行う様にします。
rds_readreplica

RDSリードレプリカ作成方法

①マネージメントコンソールへログインし、RDSの画面を開きます。

②リードレプリカを作成したいRDSを選択し、[インスタンスの操作]⇒[リードレプリカの作成]を押下します。
readreplica設定1

③各種設定をする
  • DBインスタンスクラスはマスターと同様のものにしています。
  • DBインスタンス識別子を入力します。
  • アベイラビリティーゾーンはEC2と同じゾーンにした方が、パフォーマンスが上がるので良いです。

readreplica設定2

約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