こんにちは。テクニカルサポート課の森本です。
先日、待望の新機能(!?)である、RDS Blue/Green Deployments を使用して DB インスタンスのストレージサイズ縮小機能がリリースされました。 今回はこちらの機能について確認、検証してみました。
Amazon RDS Blue/Green Deployments support storage volume shrink - AWS
これまで
従来、プロビジョニング済みの RDS DB インスタンスのストレージは、拡張はできても縮小がサポートされていませんでした。 そのため、ストレージサイズを縮小してコストを削減するためにはより小さいサイズのストレージを含む DB インスタンスを作成し、データベースエンジンネイティブのダンプ/リストアおよびレプリケーションを用いるか、DMS を使用するかといった論理的な移行により実現する必要がありました。
After you create an Amazon RDS DB instance, you can't modify the allocated storage size of the DB instance to decrease the total storage space it uses. To decrease the storage size of your DB instance, create a new DB instance that has less provisioned storage size. Then, migrate your data into the new DB instance using one of the following methods:
Use the database engine's native dump and restore method. This method causes some downtime.
Use AWS Database Migration Service (AWS DMS) for minimal downtime.
Decrease the storage size of an Amazon RDS DB Instance | AWS re:Post
新機能の概要
今回の新機能では、RDS の Blue/Green Deployments 機能によりGreen 環境を作成する際に、明示的にストレージサイズを指定できるようになりました。
その一環として、一定の条件の元、Blue 環境よりも小さいサイズのストレージサイズを指定することが可能となりました。
Previously, to shrink a storage volume, you had to manually create a new database instance with a smaller volume size, manually migrate the data from your current database to the newly created database instance, and switch database endpoints, often resulting in extended downtime. Blue/Green Deployments create a fully managed staging environment, or Green databases, with your specified storage size, and keep the Blue and Green databases in sync. With a few clicks, you can promote the Green databases to be the new production system in as fast as a minute, with no data loss and no changes to you're application to switch database endpoints.
Amazon RDS Blue/Green Deployments support storage volume shrink - AWS
ここでいう一定の条件とは、以下のドキュメントの内容です。直訳すると、移行先のストレージサイズが現在のストレージ使用量よりも20%以上大きい場合のみ、ストレージサイズの縮小が可能であるといった内容です。
You can also choose to increase or decrease allocated storage in the green environment. However, a storage reduction only occurs if the target allocated storage is at least 20% more than the current storage usage.
Creating a blue/green deployment - Amazon Relational Database Service
ここの計算方法について社内で多少議論がありましたが、少なくとも小さすぎる値を設定してまたすぐに拡張が必要になるよりは、少し余裕を持った値を設定しておくほうが無難と考えられました。
(議論の内容) 現在のストレージ使用量を 30 GiB とすると、、、
現在のストレージ使用量を基準に20%以上と考えるなら 30 GiB x (1 + 0.2) で 36 GiB 以上?
ターゲットでプロビジョニングするストレージに対して 20% の余裕を持つ必要があると考えるなら 30 GiB / (1-0.2) で 37.5 GiB 以上?
なお、現在のストレージ使用量を直接示すメトリクスはなく、DB インスタンスの FreeStorageSpace メトリクスから間接的に見積もる方法が有効と考えられます。
おおよそのストレージ使用量
= ストレージに割り当てたサイズ - FreeStorageSpace メトリクスによるストレージ空き容量
対象のデータベースエンジン
- RDS for PostgreSQL 12 以上
- RDS for MySQL 5.7 以上
- RDS for MariaDB 10.4 以上
注意点として、PostgreSQL の一定のマイナーバージョン以下ではそもそも Blue/Green Deployments そのものがサポートされていません。そのため、PostgreSQLを利用する際は 12 以上のバージョンを使用していたとしても利用できない場合があります。
For RDS for PostgreSQL, blue/green deployments are supported for the following versions:
RDS for PostgreSQL 17 (All available versions)
RDS for PostgreSQL 16 (All available versions)
RDS for PostgreSQL 15.4 and higher 15 versions
RDS for PostgreSQL 14.9 and higher 14 versions
RDS for PostgreSQL 13.12 and higher 13 versions
RDS for PostgreSQL 12.16 and higher 12 versions
また、RDS Blue/Green Deployments がサポートされていない RDS for Db2、RDS for SQL Server、RDS for Oracle に関しては本機能の対象外となります。
なお、Aurora に関してもプロビジョニング時にストレージサイズを指定する必要がなく、またデータの増加に伴い拡張したストレージ容量もデータが減少すると自動的に縮小することから本機能の対象外となります。
Aurora cluster volumes automatically grow as the amount of data in your database increases. (中略) When Aurora data is removed, the space allocated for that data is freed. Examples of removing data include dropping or truncating a table. This automatic reduction in storage usage helps you to minimize storage charges.
Amazon Aurora storage - Amazon Aurora
やってみた
ひとまず触ってみないことには動作がわからないので、本当にストレージが縮小するか試してみました。
RDS for MySQL 8.0.39
Blue 環境の割り当て済みストレージ: 100 GiB
Blue 環境の使用済みストレージ: 約 30 GiB 弱
Green 環境に割り当てするストレージ: 50 GiB
コンソール上では、Blue/Green Deployments の環境を作成する際にGreen環境のストレージサイズが指定可能となっています。
また、AWS CLI では、バージョン 1.36.7/ 2.22.2 以上で利用可能です。
Blue/Green Deployments を作成すると、Green 環境のプロビジョニングの最終盤で以下のようなイベントが出力されます。
イベント時間 | システムノート |
---|---|
November 21, 2024, 17:01 (UTC+09:00) | Finished applying modification to allocated storage |
November 21, 2024, 17:01 (UTC+09:00) | Storage configuration upgrade started. |
November 21, 2024, 17:02 (UTC+09:00) | DB instance shutdown |
November 21, 2024, 18:39 (UTC+09:00) | DB instance restarted |
November 21, 2024, 18:40 (UTC+09:00) | Storage configuration upgrade completed. |
こちらの Storage configuration が完了すると、Green 環境でストレージの縮小が完了します。
当該時間帯前後の FreeStorageSpace メトリクスを確認すると、完了前に約70GiBだったものが、約22GiBまで減少していることがわかります。
ファーストタッチペナルティの懸念点の解消
通常、DB スナップショットから DB インスタンスを復元する際、復元直後には I/O 性能が劣化するファーストタッチペナルティがあることが知られています。こちらの回避のために、従来であれば全てのテーブルを手動で SELECT を行う必要がありました。
Blue/Green Deployments の Green側を作成する際にも、Blue 環境で作成された DB スナップショットから Green 環境を作成します。 Blue/Green Deployments の場合はこのファーストタッチペナルティを解消するための機能も合わせてリリースされました。 特に料金が発生するわけでもなく、条件を満たせば自動で適用されると認識しておいて良いかと思います。
Amazon RDS Blue/Green Deployments Green storage fully performant prior to switchover - AWS
余談
上述の検証の前に、興味本位で Green 環境に現在のストレージ使用量よりも小さい値(20 GiB,DBインスタンスの最小指定可能容量)を指定するとエラーになるのかを検証してみました。
結果として CreateBlueGreenDeploymet API の実行時点ではエラーとはなりませんでしたが、Green 環境作成時に Storage configuration upgrade のイベントが発生せず、Blue 環境と同じストレージ容量(=100 GiB) でプロビジョニングが完了してしまいました。
今となっては上述の一定の条件に合致しないためと納得がいくのですが、現時点ではプロビジョニングが完了するまで実際にストレージが縮小されるかされないかを知る術がありません。縮小に失敗した場合、コストを削減するために行ったことで余計なコストがかかってしまいます。
こちらは今後の機能改善に期待しつつ、余裕を持って Green 環境のストレージ容量を指定されることをお勧めします。
まとめ
今回は、RDS Blue/Green Deployments を使用して DB インスタンスのストレージサイズを縮小する新機能についてまとめました。
ある程度のデータの増加を期待して大きめにプロビジョニングしたけど、実際そこまで使わなくてコストが無駄になっているものの、わざわざダンプしたりリストアするのは面倒だし時間もかかるし、、、のように悩んでいる方には刺さる機能だと思います。これを機にストレージコストの削減につながればいいなと思います。
この記事がどなたかのお役に立てば幸いです。