概要
RDSの機能の1つにある、リードレプリカを利用して参照用LBを作成します。
今回はHAProxyを利用して、参照用のLBを実現させます。
レプリカサーバの編集はできないので、注意してください。
リードレプリカの作成
RDSでリードレプリカ(レプリケーションサーバ)を作成することは非常に簡単です。
「Create Read Replica」から各種設定を行うだけです。
この際、リージョンやゾーンについては、運用内容によって変わると思いますので、運用内容に合わせて選択しましょう。
レプリカの作成はこれで完了です。
テストとして、MasterのDBに新規DatabaseまたはTableを作成しリードレプリカに反映されるか確認してみましょう。
Master側でDatabase(またはTable)を作成します。
mysql -h [MasterEndpoint] -u [username] -p
create databases reptestdb;
Master側で作成したDatabaseがリードレプリカに反映されていれば、動作上問題ありません。
mysql -h [SlaveEndpoint] -u [username] -p
show databases;
HAProxyのインストールをする前に、DBユーザを作成しておきましょう。
DBユーザがない場合、HAProxyのヘルスチェックが正常に行えないので、必ず作成しておいてください。
mysql -h [MasterEndpoint] -u [username] -p
GRANT USAGE ON *.* TO 'test_user'@'%';
HAProxyの導入
それでは、参照用のLBを作成するため、EC2で作成したインスタンスにHAProxyを導入します。
導入は非常に簡単です。yumでインストールを行いconfファイルにバランシングの設定を行うだけです。
yum install haproxy
インストールが完了したらHAProxyの設定ファイルを編集しRDSで作成したインスタンスへバランシングされるように設定しましょう。
vi /etc/haproxy/haproxy.cfg
listen mysql ##プロセス名になります。
bind 0.0.0.0:3306 ##LISTENするポートを指定します。
mode tcp ##通信タイプの選択です。TCPで問題ないでしょう。
option mysql-check user test_user
##オプション設定です。リードレプリカ作成時に作成したDBユーザをuserの後に記載します。
balance leastconn ##バランシングのタイプ設定です。
server slave1 RDSEndpoint:3306 check port 3306 inter 10000 fall 2
##リードレプリカのEndpointを記載してください。
server slave2 RDSEndpoint:3306 check port 3306 inter 10000 fall 2
##リードレプリカが複数ある場合はこちらも記載してください。
server master RDSEndpoint:3306 check port 3306 backup
##MasterインスタンスのEndpointを記載してください。
設定が完了したらログインできるか試してみましょう!
SlaveのStatusが表示されたら問題ないでしょう。
mysql -h 127.0.0.1 -u root -p
show slave status;
SlaveからMastarに切り替わるかどうかを確認するために、リードレプリカ(Slave)を削除して成功するか試してみましょう。
RDSの管理画面からリードレプリカインスタンスを削除します。
その後、ログインを試みMasterのStatusが表示されれば成功です。
mysql -h 127.0.0.1 -u root -p
show slave status;
show master status;
おまけ
optionの設定を「option mysql-check」と設定すると時間を空けて再ログインした場合、接続エラーが出力されてしまいます。
ERROR 1129 (HY000): Host 'XXX.XXX.XXX.XXX' is blocked because of many connection errors; unblock with 'mysqladmin flush-hosts
このエラーを解消するために、optionにHAProxyインストール前に作成したDBユーザのuser設定をいれています。
option mysql-check user test_user
更新予定は、8月中旬頃です。