【RDS】複数のレプリカへアクセスを分散させる
はじめに
おてつたび の川尻(@tomoki_kawajiri)です。
先日開催された AWS Startup Community Conference 2022 に登壇させていただきまました。
今回は登壇の中で触れた複数の RDS レプリカインスタンスへアクセスを分散させる方法についてご紹介します。
プロダクトの数が増えたり、サービスが大きくなると、DB への負荷を分散させるためにリードレプリカを導入することになります。
ただ、レプリカインスタンスが 1 台だとスケールができないので、 2 台以上の冗長構成が必要になります。
レプリカごとにエンドポイントがありますが、アプリケーションで接続するエンドポイントを変更することは現実的ではないですよね。。
Route 53 を利用すると、1 エンドポイントで複数のインスタンスへ分散させることができます。
構成イメージは以下の通りで、read.db
で 2 台のレプリカインスタンスへアクセスを分散させるようにルーティングを設定します。
アプリケーション側は接続先を read.db
だけにできるので管理が非常に楽になります。
ホスト名も xxx.yyyy.ap-northeast-1.rds.amazonaws.com
から read.db
に短くできる(レコード名なので自由に変更できます)ので嬉しいですよね。
設定手順
手順は以下の通りになります。
加重レコードを登録することで、各レプリカへアクセスを転送するようにします。
- RDS リードレプリカを作成する
- Route 53 にプライベートホストゾーンを作成する
- Route 53 で加重レコードを作成する
1. RDS リードレプリカを作成する
Primary インスタンスからリードレプリカを作成します。
レプリカの Availability Zone(AZ)はインスタンスで変えることをおすすめします。
ある AZ で障害が発生した場合でも影響を受けずに、他の AZ のインスタンスでプロダクトを運用することができるので可用性が上がります。
staging-rrdb01
と staging-rrdb02
の 2 台を作成しています。
2. Route 53 にプライベートホストゾーンを作成する
次は Route 53 でプライベートホストゾーンを作成します。
プライベートにすることで、アクセスを特定の VPC からに制限することができます。
ドメイン名を db.staging
で登録しています。
3. Route 53 で加重レコードを作成する
2 で作成したホストゾーンに CNAME でレコードを追加します。
転送先の Value には、1 で作成したリードレプリカのエンドポイントを 1 つ入力します。
エンドポイントごとにレコードを作成するので、今回は 2 レコード追加します。
- TTL は切り替えの秒数(10 なら 10 秒ごとに他のレプリカのレコードへ切り替わる)
- Weight はレプリカに対する負荷の割合
read.db.staging
が 2 レコードの作成できれば OK です。
以上で設定が完了になります。
これで同じ VPC のインスタンスから read.db.staging
のホスト名で 2 台のレプリカへアクセスを分散させることができます。
接続確認
同じ VPC のインスタンスから接続先を確認することができます。
今回は TTL を 10 にしたので、10 秒ごとに dig コマンドで接続先のレプリカが変わっていることを確認できます。
staging-rrdb01
のレプリカへ転送される。
✗ dig read.db.staging
...
;; QUESTION SECTION:
;read.db.staging. IN A
;; ANSWER SECTION:
read.db.staging. 10 IN CNAME staging-rrdb01.xxxx.ap-northeast-1.rds.amazonaws.com.
staging-rrdb01.xxxx.ap-northeast-1.rds.amazonaws.com. 5 IN A 172.30.0.227
...
10 秒経過後に実行すると、staging-rrdb02
への転送へ切り替わる。
✗ dig read.db.staging
...
;; QUESTION SECTION:
;read.db.staging. IN A
;; ANSWER SECTION:
read.db.staging. 10 IN CNAME staging-rrdb02.xxxx.ap-northeast-1.rds.amazonaws.com.
staging-rrdb02.xxxx.ap-northeast-1.rds.amazonaws.com. 5 IN A 172.30.1.160
...
参考
今回の設定手順を解説している動画です。とてもわかりやすいので是非ご覧ください。
今回の設定に加えて、CloudWatch アラームの作成と CNAME のヘルスチェックに CloudWatch アラームの割り当てを行うことで、正常なレプリカインスタンスのみアクセスを受け付けるようにすることができます。
例えば、CPU 使用率 80% 以上でアラームを設定すると、80% 未満の正常なレプリカインスタンスで分散されるので、効率良く負荷分散を行うことができます。
設定方法は以下の記事が参考になります。
終わりに
株式会社おてつたびでは、一緒に働く仲間を募集しています!
自分の経験を活かして様々な事にチャレンジすることが出来る土壌があると思います。
Web と iOS エンジニアを積極募集しております。
ご応募お待ちしております。
カジュアルに話したい方は、Meety からご応募お待ちしております!
Discussion