[アップデート] RDS Proxy でリーダーエンドポイントが利用可能になりました
本日のアップデートで RDS プロキシ に Amazon Aurora レプリカ向けのリーダーエンドポイントが利用可能になりました。
想いが届いたのでしょうか、、
リーダーエンドポイント対応
従来、RDS プロキシエンドポイントが作成できるのはプライマリーエンドポイントのみが対象でしたが、今回のアップデートでリーダーエンドポイントも対象に追加することが可能になりました。
これにより、例えば Lambda などから多重にリーダーエンドポイントへの接続が発生するような仕組みも RDS プロキシを利用することで接続数問題を回避することができます。
RDS プロキシについての詳細は岩田の記事を一読いただくのが良いかと思います。
料金
価格表がまだ更新されていないので不明ですが、RDS プロキシ作成画面のコメントを見るかぎりでは、追加で課金が必要になるようです。
If your proxy is associated with a single-writer Aurora cluster, you can enable a second endpoint that's read-only. This endpoint points to the reader instances in your cluster. Using this endpoint for your query-intensive applications helps you to take advantage of the read scalability of an Aurora cluster through your proxy connections. You incur additional charges for every additional proxy endpoint that you add, as described in RDS Proxy pricing.
前提条件
- RDS プロキシのリーダーエンドポイントは Aurora クラスターが対象です。RDS のインスタンスには利用できません
- Aurora マルチライタークラスターでは使用できません
やってみる
今回は以下の環境で検証しています。
- 東京リージョン
- Aurora クラスター
- エンジンバージョン: 5.7.mysql_aurora.2.07.2
- インスタンス: db.t3.small
- プライマリーおよびレプリカを 1 インスタンスずつ
RDS プロキシの作成
RDS 管理コンソールから Aurora クラスターの「接続とセキュリティ」タブを開き、「プロキシを作成」をクリックします。
プロキシ識別子、エンジンの互換性などを選択し、ターゲットグループの設定に [Include reader endpoint] が追加されています。 Add reader endpoint
にチェックを入れプロキシを作成します。
設定画面を見るかぎりリーダーエンドポイントは「追加する・しない」の設定のみ。リーダーエンドポイントのみを作成するということは出来ないようですね。
「利用可能」のステータスになるまで 30 分程度でかかりました。以下のとおり Target role
が Read-only
のプロキシエンドポイントが追加されました。
フェイルオーバーテスト
スクリプト
今回も以下のようなスクリプトを準備しました。
#! /bin/bash while true do DATETIME=$(date "+%Y-%m-%d %T.%N") (echo "select '${DATETIME}', now(3), @@hostname, @@innodb_read_only;" | mysql -uユーザー名 -pパスワード -h エンドポイント -s) & sleep 0.5 done
接続しているインスタンス(ip-10-7-1-239
)の次のカラムが 1
の場合はレプリカで、0
の場合はプライマリです。test.sh
実行中に aws rds failover-db-cluster
コマンドでフェイルオーバーを発生さて切り替わりの動作状況を確認します。
2021-03-17 02:19:25.866809017 2021-03-17 02:19:25.909 ip-10-7-1-239 1
フェイルオーバーの実行
02:19:25 UTC
に Aurora クラスターのフェイルオーバーを実行
$ date; aws rds failover-db-cluster --db-cluster-id database-1 Wed Mar 17 02:19:25 UTC 2021
ダウンタイムは 02:19:47.463 UTC
から 02:19:59.258 UTC
のおよそ 12 秒でした(計測は 1 回のみですので、あくまで参考値です)
通常、フェイルオーバーが発生すると ERROR 2003 (HY000): Can't connect to MySQL server on
といったメッセージが出力されますが特にエラーメッセージがなく切り替わっていることからも、アプリケーション側から透過的にフェイルオーバーが完了していることが判ります。(タイムアウトまでの時間は、RDS プロキシのタイムアウト設定で調整できます)
$ ./test.sh 2021-03-17 02:19:25.866809017 2021-03-17 02:19:25.909 ip-10-7-1-239 1 2021-03-17 02:19:26.368773604 2021-03-17 02:19:26.387 ip-10-7-1-239 1 (snip) 2021-03-17 02:19:46.949841751 2021-03-17 02:19:46.977 ip-10-7-1-239 1 2021-03-17 02:19:47.451769241 2021-03-17 02:19:47.463 ip-10-7-1-239 1 2021-03-17 02:19:54.479397239 2021-03-17 02:19:59.258 ip-10-7-2-28 1 2021-03-17 02:19:51.467591984 2021-03-17 02:19:59.259 ip-10-7-2-28 1
前回、Aurora クラスターのリーダーエンドポイントで検証した際は、フェイルオーバーからの復旧直後はプライマリーインスタンスへ接続したり、レプリカインスタンスへ接続したりとフラフラする場面があり、数十秒後に接続が安定するといった動作でしたが、RDS プロキシの場合、復旧直後から安定してレプリカ側に接続できていますね。
検証は以上です!
さいごに
これまでクラスターリードエンドポイントに接続が集中するようなシステムでは RDS プロキシを活かすことが出来ませんでしたが、これからは読み取りがメインのサーバーレスアーキテクチャでも RDS プロキシを利用できそうですね!
AWS はユーザーのフィードバックをもとに機能追加・改善のアップデートが検討されていますので、これからもどんどんフィードバックをあげていきましょう!
以上!大阪オフィスの丸毛(@marumo1981)でした!