Skip to content
On this page

📆 2024-03-14

Aurora MySQL を v2 から v3 へアップデートした

#AWS #Aurora #MySQL

Aurora MySQL を、v2(MySQL 5.7 互換)から v3 (MySQL 8.0 互換) へアップデートした記録。

私が開発に携わっている SaaS はデータストアとして Aurora MySQL を利用している。 Aurora MySQL v2 の EOL が 2024年10月に迫っているので、アップデートを行った。

タスクの洗い出し

まずはアップデートに必要なタスクを洗い出した。

ざっくり以下のようなタスクがあるだろうということになった。

アップデート手順の確立

  • アップデート手法の検証(AWS Blue/Green Deploy の検証)
  • 切り戻しの計画の検討
  • アップデート手順書の作成と試験実施

アップデートによる影響の検証

  • 調査

    • MySQL バージョン間の動作の違いの洗い出し
    • アプリケーションへの影響調査
  • 動作確認

    • 全SQLの動作確認
    • アプリケーションの動作確認と修正
    • AWS Lambda などアプリケーション以外の動作確認と修正
  • パフォーマンス検証

    • 各 SQL ごとのパフォーマンス検証
    • サービス全体のパフォーマンス検証

その他

  • ローカル開発環境の MySQL アップデート更新

アップデートの実施

  • アップデートの計画・スケジュール作成
  • SaaS 利用ユーザへのメンテナンスの告知
  • 全環境のアップデート実施
  • 片付け作業

アップデート手法の確立

AWS Blue/Green Deploy によるアップデート手法の検証

アップデートによるダウンタイムをできるだけ短くしたいため、AWS Blue/Green Deploy によるアップデート手法を検証した。

事前に、binlog_format を ROW に変更するなど準備しておく必要がある。

Blue/Green 環境は AWS コンソールから画面ですぐに作成することができる。 作成すると、

  • Blue 環境が既存の v2 の RDSクラスター
  • Green 環境が新しい v3 の RDSクラスター

となり、Blue - Green 間で binlog によるレプリケーションが貼られる。

Blue 環境を Green 環境へ切り替えることで、アップデートが完了する。

検証環境では、1分未満のダウンタイムで切り替えることができることがわかった。

実際に本番環境でもこの程度の時間で切り替えが可能だった。

ダウンタイムはリーダーインスタンスでもライターインスタンスでも発生する。

切り戻しの計画の検討

Blue 環境と Green 環境を切り替えた後、Green 環境(新ver)をソースDB、Blue 環境(旧ver)をターゲットDBとして、binlog によるレプリケーションを貼ることで、切り戻しを行うことができる。

ただし、MySQL では、8.0 のデータベースから 5.7 のデータベースへのレプリケーションは可能であるが、動作保証はされていない。

このため、切り戻しはほぼ不可能と考え、できるだけ事前の検証に時間をかけて、切り戻す必要がないところまで検証することにした。

アップデート手順書の作成と試験実施

AWS Blue/Green Deploy によるアップデートで要件を満たせることがわかったので、開発環境のデータベースをアップデートする手順書を作成し、試験実施した。

いくつか細かい手順の見直しが必要であったが、問題なく実施ができた。

アップデートによる影響の検証

調査

まずは AWS や MySQL の公式ドキュメントをあさって、MySQL バージョン間の動作の差分の洗い出しを行った。

など。

その後、該当の差分がアプリケーションに影響を及ぼす可能性がある場所を洗い出した。

いくつか影響があった差分があった。

  • GROUP BYの暗黙的な並び替えの廃止

    暗黙的な GROUP BY の並び替えが廃止されたため、GROUP BY 後に明示的に並び替えが必要になった。SQL に ORDER BY を明示することで解決した。

  • クエリキャッシュが削除される

    Aurora MySQL v3 では、クエリキャッシュが削除された。これにより、クエリのパフォーマンスが低下する可能性があるため、MySQL v3 の RDS クラスターを使って、クエリのパフォーマンスを検証した。

    検証した結果、パフォーマンスの低下はあったが、アプリケーションの動作に致命的な影響がでほどではなかった。

  • db.t3.small クラスのインスタンスが使えなくなった

    Aurora MySQL v3 では、開発環境のDBで使っていた db.t3.small クラスのインスタンスが使えなくなった。db.t3.medium に変更した。

全SQLの動作確認

アプリケーションのリポジトリ層の SQL のテストとして、オンメモリのDBへ接続し SQL を実行する結合テストがすでにあった。

これを Aurora MySQL v3 の RDS クラスターに対して実行し、全ての SQL が正常に動作することを確認した。

なお、全ての SQL に対してテストがあるか不明だったので、テストカバレッジを調べて、足りないところは新たにテストを追加した。

アプリケーションの動作確認と修正

開発環境の RDS はすでに Aurora MySQL v3 にアップデートしていたので、そこでアプリケーションの e2e テストを実行して、アプリケーションが正常に動作することを確認した。

AWS Lambda などアプリケーション以外の動作確認と修正

他に影響があるところを洗い出して、動作確認を行った。以下が影響した。

  • GitHub Actions から実行する DB マイグレーション処理
  • AWS Lambda から実行する MySQL パーティションの作成処理

パフォーマンス検証

  • 各 SQL ごとのパフォーマンス検証

    複雑なクエリを洗い出して、一個ずつ実行して、パフォーマンスが低下していないことを確認した。

  • サービス全体のパフォーマンス検証

    Locust を使って負荷試験を実施し、パフォーマンスが低下していないことを確認した。

アップデートの実施

ここまでで、実際にアップデートできる状態が整ったので、アップデートの計画・スケジュールを作成し、SaaS 利用ユーザへのメンテナンスの告知を行い、全環境のアップデートを実施した。

アップデートは深夜帯に行った。

AWS Blue/Green Deploy により、1分未満のダウンタイムで実施することができた。

振り返り

検証に時間をかけた

アップデートによる影響の検証に時間がかかったが、アップデート自体は AWS Blue/Green Deploy によりスムーズに実施することができた。

検証に時間をかけたことで、特に問題なくアップデートを実施することができた。

テストがあったことが大きかった

SQLのテストカバレッジが高かったことと、e2e テストがあったことが、アップデートによる影響の検証をスムーズに進めることができた。テストが通ったことで、問題なくアップデートできることの自信にもつながった。

テスト大事。

かかった時間

だいたい 4ヶ月くらいはかかった。

  • 2023 / 10 : 検証
  • 2023 / 11 : 試験環境でのアップデート, パフォーマンス検証
  • 2024 / 01 : ステージング環境のアップデート
  • 2024 / 02 : 本番環境のアップデート

Released under the MIT License.