⚒️

AWS Amazon RDS Aurora MySQL をブルーグリーンデプロイを使用してAurora Serverless v2に移行する

2023/09/14に公開

概要

Amazon Aurora Serverless v2は、負荷状況に応じてオートスケーリングされます。
データベースの容量を調節するメンテナンス作業から開放されます。
本記事では既存のAurora MySQLインスタンスをServerless v2に移行する方法について触れています。

3行まとめ

・AWS「Aurora Serverless v2」の概要を紹介している。
・負荷状況に応じてオートスケーリングされ、リソースが確保される。
・設定したACUの最大値、最大コネクション数が決まる(MySQL)

前提

・現在Amazon RDS Aurora MySQLを利用している
・PostgreSQLについては取り扱っておりません

経緯

・Amazon RDS Auroraでは、高負荷のバッチ処理をさせた時に、CPU使用率が張り付き精神衛生上よくなかった。
・インスタンスサイズを調整する時は再起動が必要だった
・サーバーの負荷状況に応じて、オートスケーリングされる機能が魅力的だった

ACU(Aurora Capacity Unit)について

ACUはAurora 容量単位 (Aurora Capacity Unit)の略です。
Aurora Serverless v2 の容量は、1ACUあたり、2GiBとなっています。
現在使用しているインスタンスクラスに対応する容量に合わせて最小0.5ACU、最大128ACUを設定します。
※ACUに対応するvCPU値は非公開となっています。

最小ACUの変更は再起動なしで反映されます。
最大ACUの変更は最大接続数の反映をするには再起動が必要です。10秒弱

料金

Amazon Aurora の料金 -例 1: Aurora Standard での Aurora Serverless v2 の料金設定

使用状況 計算 コスト
0.5 ACU から 5 ACU に瞬時にスケール
5 ACU で 30 分間稼働 5 ACU × ACU 時間あたり 0.12 USD × 30/60 時間 0.30 USD
3 分で 5 ACU から 0.5 ACU にスケールダウン 5 ACU × ACU 時間あたり 0.12 USD × 3/60 時間 0.03 USD
Aurora Serverless v2 (Aurora Standard) でのコンピューティングコスト 0.33 USD

AWS料金計算ツール


ACU 2
Storage 100GB
Proxy OFF
Region Tokyo
の例

1時間あたりの利用したACU値、ストレージ、IOPSによって料金が変動する

Total Monthly cost: 306.93 USD

データベースインスタンス別の料金設定

従来のインスタンスの例

メモリ最適化インスタンス – 現行世代 Aurora Standard (時間あたりの料金) Aurora I/O 最適化 (時間あたりの料金)
db.r5.large 0.35USD 0.455USD
db.r5.xlarge 0.70USD 0.91USD
db.r5.2xlarge 1.40USD 1.82USD
db.r5.4xlarge 2.80USD 3.64USD
db.r5.8xlarge 5.60USD 7.28USD
db.r5.12xlarge 8.40USD 10.92USD
db.r5.16xlarge 11.20USD 14.56USD
db.r5.24xlarge 16.80USD 21.84USD

v1 v2比較

Aurora Serverless v2 と Aurora Serverless v1 の比較
Serverless v1、Serverless 2について比較します。
※現在は新規で作成する際はv2になります。

Serverless v2では一時停止されず、状況に応じたACU値で稼働し続けます。(停止は可能)

項目 v1 v2
ACU 最小:1
最大:128
最小:0.5
最大:128
料金 1ACUあたり0.10USD/時間 1ACUあたり0.20USD/時間
特徴 一定時間アクセスがない場合は自動停止される ・0.5ACU単位で自動的にオートスケーリングされる
・クエリ実行中でも自動スケーリングされる
・マルチAZ対応
問題点 ・初回起動が遅く、利用可能になるまでに時間がかかる
・クエリ実行中やテーブルロックされている場合は自動スケーリングがされない
・マルチAZ機能がない
・1ACUのあたり費用が2倍
・v1のように一時停止されない(設定された最小で稼働する)

ACU対応表

メモリ最適化クラスを例にみてみます。
Serverless v2では、最大のACUサイズが128となっているため、db.r5.12xlarge以上に対応するためには、インスタンス数を増やす必要があります。
ライターx1、リーダーx1が推奨
※vCPUが一緒とは限りません

ACU0.5 = Memory 1GB
ACU1 = Memory 2GB

インスタンスクラス vCPU ECU メモリ (GiB) ローカルストレージの最大帯域幅 (Mbps) ネットワークパフォーマンス (Gbps) 対応するACU
db.r5.24xlarge 96 347 768 19,000 25 -
db.r5.16xlarge 64 264 512 13,600 20 -
db.r5.12xlarge 48 173 384 9,500 12 -
db.r5.8xlarge 32 132 256 6,800 10 128
db.r5.4xlarge 16 71 128 4,750 最大10 64
db.r5.2xlarge 8 38 64 最大4,750 最大10 32
db.r5.xlarge 4 19 32 最大4,750 最大10 16
db.r5.large 2 10 16 最大4,750 最大10 8

セッション数の計算

Aurora Serverless v2 の最大接続数
Serverless v2では、ACUの最大設定値により最大コネクション数が決まります。

例えば最大接続数を1000にしたい場合は、最大ACUを8に設定します。

最大 ACU Aurora MySQL のデフォルトの最大接続値
1 90
4 135
8 1,000
16 2,000
32 3,000
64 4,000
128 5,000

Aurora MySQL と Aurora PostgreSQL の両方に対して、Aurora Serverless v2 DB インスタンスでは、max_connections パラメータを一定に維持し、DB インスタンスのスケールダウン時に接続が切断されないようにします。このパラメータのデフォルト値は、DB インスタンスのメモリサイズに基づいた数式から算出されます。プロビジョン済み DB インスタンスクラスの計算式とデフォルト値の詳細については、「Aurora MySQL DB インスタンスへの最大接続数」および「Aurora PostgreSQL DB インスタンスへの最大接続数」を参照してください。

計算式は、パラメータグループに記載があります。

GREATEST({log(DBInstanceClassMemory/805306368)*45},{log(DBInstanceClassMemory/8187281408)*1000})

移行手順

1.現在のRDS Auroraの設定でbinlog_formatを有効にします。
2.ブルーグリーンデプロイの作成を行います。
3.GreenのエンジンバージョンをServerless v2対応のものに変更します
4.GreenをServerless化します。
5.Brueとの切り替えを実行します。

binlog_formatの設定をMIXEDにする

ブルーグリーンデプロイを作成するにはbinlogを有効化する必要があります。
パラメータグループを新規で作成するか、既存の設定を変更します。
binlogが有効化されていないと次のようなエラーが発生します。

また、設定を反映させるにはインスタンスの再起動が必要です。

ブルーグリーン デプロイ

ブルー/グリーンデプロイの作成

対象のクラスタを選択し、右上のアクションから「ブルーグリーンデプロイの作成-新規」をクリックします。

エンジンバージョンの変更

Aurora MySQL 3.01.0(MySQL 8.0.23)は、Serverless v2に対応していないため
3.02.x以上にします。

Serverless化

Greenのエンジンバージョンアップの設定が完了したら、Serverless切り替えが可能な状態です。

GreenのServerless v2にチェックをして設定を保存します。

監視

Aurora Serverless v2 の重要な Amazon CloudWatch メトリクス

Serverless v2化が完了したら、主要なめメトリクスの監視を行います。

・ServerlessDatabaseCapacity
→現在の DB インスタンスの容量で表される ACU値
・ACUUtilization
→メトリクスの値を DB クラスターの最大 ACU 値で割った値
・CPUUtilization
→現在の CPU の使用量を DB クラスターの最大 ACU 値で使用可能な CPU 容量で割った割合
100%に近いと最大ACUの見直しの目安になります。
・FreeableMemory
→Aurora Serverless v2 DB インスタンスを最大容量にスケーリングしたときに利用できる未使用のメモリ量
現在利用できないが、設定しているmaxACUになった場合に利用できるメモリ量がわかります。
0に近づくと、使用可能なメモリ量に近づいているためACU値の見直しが必要です。

RDS>Performance Insights
より、インスタンスのメトリクスを確認します。
カスタムダッシュボードに変更し、ウィジェットを追加から必要なメトリクスを追加するとみやすくなります。

Terraform対応

手動でリソースを作成・変更したものをTerraformの設定ファイルとして記録します。

resource "aws_rds_cluster" "serverless-test" {
  #cluster_identifier                  = "${local.prefix}-serverless-test"
  cluster_identifier                  = "serverless-test-dev"
  engine                              = "aurora-mysql"
  engine_version                      = "3.02.3"
  engine_mode                         = "provisioned"
  master_username                     = "username"
  master_password                     = "password"
  port                                = 3306
  vpc_security_group_ids              = [module.sg_rds.security_group_id]
  db_subnet_group_name                = aws_db_subnet_group.serverless.name
  db_cluster_parameter_group_name     = aws_rds_cluster_parameter_group.serverless.name
  iam_database_authentication_enabled = false

  serverlessv2_scaling_configuration {
    min_capacity = 0.5
    max_capacity = 64.0
  }

  skip_final_snapshot = true
  apply_immediately   = true
}

Serverless v2の容量の最小、最大を設定する。
engine_modeはprovisionedである必要があります。

  engine_mode                         = "provisioned"
  
  serverlessv2_scaling_configuration {
    min_capacity = 0.5
    max_capacity = 64.0
  }
resource "aws_rds_cluster_instance" "serverless-test-cluster" {
  cluster_identifier = aws_rds_cluster.serverless-test.id
  identifier         = "serverless-test-dev-instance-1"

  engine               = aws_rds_cluster.serverless-test.engine
  engine_version       = aws_rds_cluster.serverless-test.engine_version
  instance_class       = "db.serverless"
  db_subnet_group_name = aws_db_subnet_group.serverless.name

  monitoring_role_arn = "monitoring-role"
  monitoring_interval = 60

  publicly_accessible = true
}

クラスターパラメータグループの設定にbinlog_formatの記述を追記します。

resource "aws_rds_cluster_parameter_group" "serverless" {
  parameter {
    name         = "binlog_format"
    value        = "MIXED"
    apply_method = "pending-reboot"
  }
}

Aurora Serverless v2に移行することにより、サーバの負荷状況に応じて適切にACU値が変動しリソースが確保されます。
従来のRDS Auroraではあらかじめインスタンスサイズを決めておく必要があり、手動でスケールアップの対応が必要でした。インフラコストについてはサービスによっては高くなる場合もありますが、総合的にみれば運用コストが抑えられると思います。

参考
Aurora Serverless v2 の開始方法
Amazon Aurora の料金
Aurora Serverless v2 と Aurora Serverless v1 の比較
Aurora Serverless v2 の最大接続数
Aurora Serverless v2 の管理
Terraform Resource: aws_rds_cluster
Terraform Module: aurora

株式会社マインディア テックブログ

Discussion