[アップデート] RDS Proxy でリーダーエンドポイントが利用可能になりました

フィードバックだいじ
2021.03.17

本日のアップデートで 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 roleRead-only のプロキシエンドポイントが追加されました。

フェイルオーバーテスト

スクリプト

今回も以下のようなスクリプトを準備しました。

test.sh

#! /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)でした!