AWSのRDS(MySQL)→ Aurora MySQLの移行手順・考慮点まとめ
概要
AWSにおいてRDS(MySQL)からAurora MySQLへ変更するにあたって、作業の手順と考慮すべき点をまとめました。
変更する理由
メリット
- DBのことをより気にせずに開発に集中できるようになります。例えばストレージのサイズが自動的に変更可能なため、ディスクサイズを定期的にチェックする必要がなくなります。
- パフォーマンスの向上が見込まれます[1]。
- アクセスに応じて自動的にスケールすることも可能です。リーダーインスタンスはCPU利用率等で数を増やすことができるので、対応しているアプリケーションであれば、負荷に応じて自動的に対応できるようになります。
- Aurora Serverlessを利用することで、ライターインスタンスに対しても動的にスペックを変更できるようになりました。ただし、ServerlessはAuroraと比較しても高価なので、使いどころは選ぶかと思います。
デメリット
- インスタンスの料金としては1割程度増加します。
上記のメリットを享受できるのであれば、大体の場合は許容できるコストではないかと思います。
例:MySQL 東京リージョン 1インスタンスの場合[2][3]
タイプ | インスタンスタイプ | 費用(1時間) |
---|---|---|
RDS | db.t4g.medium | 0.101USD |
Aurora | db.t4g.medium | 0.113USD |
注意点
※ コンソールは結構な頻度で変更が入るので、変わっていた場合は順次読み替えてみてください。
RDS MySQLの構築
今回は1から構築を行って切り替えをします。
構築から実施する場合は参考にしてください。
構築の詳細
移行対象となるRDSをAWSのコンソールより作成します。
RDSのページからデータベースの作成を選択します。
MySQLを選択します。
なお、バージョンを最新にすると、Auroraが対応していないため変更がエラーとなります。
事前にAuroraのバージョンが対応しているか確認してください[4]。
2023年2月2日時点ではAuroraは3.02.2(MySQLの8.0.23互換)が最新だったので、MySQLのバージョンも8.0.23とします。
以下のように選択して、「データベースの作成」をクリックして起動します。
項目 | 変更内容 |
---|---|
テンプレート | 開発/テスト |
可用性と耐久性 | 単一の DB インスタンス |
設定 | パスワードの自動生成に✅ |
インスタンスの設定 | バースト可能クラス (t クラスを含む)を選んで、db.t3.smallにする |
ストレージ | ストレージタイプをgp3、ストレージ割り当を20(GB) |
接続 | - |
データベース認証 | - |
モニタリング | - |
なお、設定内容は費用を抑えることをメインにしているので、用途によって異なるので参考程度にしてください。
バージョンの互換性があれば、Auroraへの変更はできます。
初期作成のパスワードは作成中に表示されている「認証情報の詳細を表示」を選択することで取得できます。
DBを利用する場合は忘れずにメモしてください。
Auroraのパラメータグループの作成
AuroraではDBとクラスターのパラメータグループを持っています。
MySQLで独自のパラメータグループを利用している場合は、先にAuroraのパラメータグループを作成することをお勧めします。
Auroraのリーダーインスタンスを追加
RDSをAuroraにするにはいくつか方法があります。
- Auroraのリーダーインスタンスを用意して昇格させる
- RDSのスナップショットからAuroraを作成する
- Auroraのインスタンスを構築後、何らかの手段を用いてRDSと同期しておき、切り替える
- AWS Database Migration Serviceなど
今回はAuroraのリーダーインスタンスを構築して、昇格させる手段を使います。
対象となるデータベースを選択した状態で「アクション」 - 「Auroraリードレプリカの作成」を選択します。
設定を以下のように変更します。
カテゴリ | タイトル | 値 |
---|---|---|
インスタンスの仕様 | DB エンジンのバージョン | Aurora MySQL 3.02.2(compatible with MySQL 8.0.23) |
インスタンスの仕様 | DB インスタンスのクラス | db.t4g.medium |
インスタンスの仕様 | マルチ AZ 配置 | いいえ |
設定 | DB インスタンス識別子 | database-aurora |
ネットワーク & セキュリティ | パブリックアクセシビリティ | いいえ |
データベースの設定 | DB パラメータグループ | 必要に応じて |
データベースの設定 | DB クラスターのパラメータグループ | 必要に応じて |
作成画面のキャプチャ
なお、DBエンジンに「Aurora - MySQL 5.7.12 との互換性あり」と書いてありますが、MySQLの2系を選ぶと作成時にエラーになります。
一通り設定できたら、「リードレプリカの作成」を選択します。
作成が完了すると画像のような表示になります。
プライマリとしてRDS、レプリカとしてAuroraのクラスターが存在しています。
空のDBでも約40分近くかかったので、データがある場合は数時間かかるかと思います。
事前に多めの時間を見越しておくことをお勧めします。
切り替えの懸念点
リードレプリカとして作成したクラスターはロールが「レプリカクラスター」となっています。
プライマリのDBに変更があった場合に非同期でレプリカクラスターに反映がされています[5]。
切り替え自体は簡単なのですが、切り替えの時には以下のような点を気にする必要があります。
- プライマリのRDSと完全に同期している状態で切り替える
- アプリケーションの接続先を変更する
プライマリのRDSと完全に同期している状態で切り替える
ほぼリアルタイムで同期しているとは思いますが、RDSからAuroraへのデータの同期にはラグ(遅延)がかかります。
クラスターを昇格して即時切り替えてしまうと、切り替え時の同期が完了していない可能性があります。つまり、ラグの分だけデータが不整合になってしまう恐れがあります。
そのため、切り替えをする際はアプリケーションを停止することが確実です。
その場合はアプリケーションを停止後、同期ができていることを確認してから切り替え作業をすることになります。
無停止で実施する場合は以下のような手順になると思います。
- その時間に同期する可能性のあるテーブルの一覧を洗い出す
- 切り替え後に整合性チェックして、不正になっている部分は修正する
ただし、AUTO_INCREMENTを使ている場合はうまく整合性をとる方法を考える必要があるので大変な作業となります。
アプリケーションの接続先を変更する
切り替えを行うと、RDSとAuroraの2つのDBが独立したような形になります。
切り替え後にアプリケーションの設定を変更しないとRDS側に書き込みをすることになってしまいます。
そうなってしまうとAurora側はある時点の断面でしかなく、切り替えができていないことになります。
また、一部のアプリケーションのみ切り替えていない場合、一部のテーブルで整合性が取れなくなってしまう可能性があるので、エンドポイントは確実に変更しないといけません。
そのため、この場合もアプリケーションの停止が必要となります。
おすすめの対策方法としては、Route53でプライベートホストゾーン経由でRDSへアクセスするようにすることです。
RDSへのエンドポイントを抽象化することによってアプリケーション側の設定やソースコードを変更することなくエンドポイントを変更できます。
さらに、変更点を1点に集約することで、一部のアプリケーションのみDBのエンドポイントを修正するのが漏れていた、のようなことも防げます。
Route53を経由することで、数ドル程度料金が増える場合がありますが、複数のアプリケーションを管理している場合は許容できる範囲ではないかと思います。
Auroraへの切り替え
クラスターを選択した状態で、「アクション」 - 「昇格」を選択します。
「リードレプリカの昇格」を選択することで、Auroraが別のクラスターとなります。
データベースの一覧でも、階層が一つ減っているのがわかるかと思います。
空のDBの場合、昇格は数分で完了ました。
エンドポイントの変更
Auroraクラスターのエンドポイントの取得
対象のクラスターを選択して、「接続とセキュリティ」のタブにある「エンドポイント」からタイプがライターのものを利用してください。
アプリケーションの設定(Route53やSSMのパラメータストア、各種設定ファイル等)を変更してアプリケーションを起動することで、エンドポイントがAuroraに変更されます。
参考
最後に
ここまでお読みいただきありがとうございました。
Team DELTAでは2023年より毎週記事を更新しています。
Zennやnoteで記事を書いているので他の記事もぜひ見てみて下さい!
-
https://aws.amazon.com/jp/rds/aurora/features/#High_Performance_and_Scalability ↩︎
-
https://docs.aws.amazon.com/AmazonRDS/latest/AuroraMySQLReleaseNotes/AuroraMySQL.Updates.30Updates.html ↩︎
-
https://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/AuroraUserGuide/AuroraMySQL.Migrating.RDSMySQL.Replica.html ↩︎
Discussion