こんにちは! STORES 決済 のバックエンドエンジニアをしているしまだ(mii)です。
先々週はバックエンドのみんなで JJUG CCC*1 に参加してきました。お祭りのようでとても楽しかったです。
気付いたらアドベントカレンダーの時期になっていたので、9月に実施したMySQLのバージョンアップの話をしたいと思います。
STORES 決済 では一部のデータベースで AWS Amazon RDS MySQL 5.7 を使用していましたが、2023年12月のサポート終了*2に向けて MySQL 8.0系へのバージョンアップを行いました。
前準備
事前調査
主に MySQL および Amazon RDS のバージョンアップガイドを参考にしました。
- MySQL :: MySQL 8.0 Reference Manual :: 2.10.4 Changes in MySQL 8.0
- MySQL DB エンジンのアップグレード - Amazon Relational Database Service
アップグレード手順の検討
バージョンアップには 5.7系でのマイナーバージョンアップで実績があったため Amazon RDS Blue/Greenデプロイ を使用しました。
切り替えのタイミングで一時的にデータベースへの接続ができなくなりますが、今回対象となるデータベースがユーザー影響の少ない箇所だったので、アプリケーションを停止せずバージョンアップを行っています。
Blue/Greenデプロイでバージョンアップを行う場合、Greenデータベースへ切り替え後の切り戻しができないので、事前に関係者とバージョンアップのスケジュールや障害発生時の対応体制の認識を合わせておきました。
開発環境での検証
開発環境での検証は下記の流れで実施しました。
- バージョンアップ手順の作成
- パラメータグループの作成
- Blue/Greenデプロイの作成
- Greenデータベースの検証
- Blue/Greenデータベースの切り替え
- 切り替え後のデータベースで1〜2週間程度稼働させて様子を見る
- Blueデータベースの削除
パラメータグループの作成
MySQL 5.7系での設定内容をベースに、MySQL 8.0系で使用するパラメータグループを作成します。
MySQL 8.0ではデフォルトの認証プラグイン default_authentication_plugin
が caching_sha2_password
に変更*3になっていますが、Amazon RDS MySQL 8.0 の default_authentication_plugin
のデフォルト値は mysql_native_password
のままなので、特に対応は必要はありませんでした。
カスタムパラメータグループ側では項目が変更不可になっています。
Blue/Greenデプロイの作成
バージョンアップ対象のデータベースのアクションから ブルー/グリーンデプロイの作成 - 新規
を実行します。
Blue/Greenデプロイの作成時にデータベースのエンジンバージョンが選択できるので、MySQL 8.0の最新パッチバージョンを選択しています。
Blue/Greenデプロイを作成すると、まずバージョンアップ前の MySQL 5.7 でGreenデータベースが作成され、データベースの作成後に MySQL 8.0 へのバージョンアップが実行されます。
Greenデータベースの作成完了まで数十分程度かかりました。
MySQL 5.7から8.0へのバージョンアップの実行時、Amazon RDS が自動的に事前チェックを実行してくれるので、PrePatchCompatibility.log
にエラーや警告が出ていないことを確認しておきます。
Executing Compatibility Checks for the MySQL server at localhost:3306. Source Version: 5.7.38 - Source distribution, Target Version: 8.0.34. 1) Usage of old temporal type No issues found. 2) Usage of db objects with names conflicting with new reserved keywords No issues found. 3) Usage of utf8mb3 charset The following objects use the utf8mb3 character set. It is recommended to convert them to use utf8mb4 instead, for improved Unicode support. More Information: https://dev.mysql.com/doc/refman/8.0/en/charset-unicode-utf8mb3.html mysql - schema's default character set: utf8 4) Table names in the mysql schema conflicting with new tables in 8.0 No issues found. 5) Partitioned tables using engines with non native partitioning No issues found. 6) Foreign key constraint names longer than 64 characters No issues found. 7) Usage of obsolete MAXDB sql_mode flag No issues found. 8) Usage of obsolete sql_mode flags No issues found. 9) ENUM/SET column definitions containing elements longer than 255 characters No issues found. 10) Usage of partitioned tables in shared tablespaces No issues found. 11) Circular directory references in tablespace data file paths No issues found. 12) Usage of removed functions No issues found. 13) Usage of removed GROUP BY ASC/DESC syntax No issues found. 14) Removed system variables for error logging to the system log configuration No issues found. 15) Removed system variables No issues found. 16) System variables with new default values No issues found. 17) Schema inconsistencies resulting from file removal or corruption No issues found. 18) Issues reported by 'check table x for upgrade' command No issues found. 19) The definer column for mysql.events cannot be null or blank. No issues found. 20) Tables with dangling FULLTEXT index reference No issues found. 21) Routines with deprecated keywords in definition No issues found. 22) DB instance must have enough free disk space No issues found. 23) MySQL preupgrade check to catch users created with MYSQL_NATIVE_PASSWORD plugin No issues found. 24) Creating indexes larger than 767 bytes on tables with redundant row format might cause the tables to be inaccessible. No issues found. 25) The tables with redundant row format can't have an index larger than 767 bytes. No issues found. 26) Column definition mismatch between InnoDB Data Dictionary and actual table definition. No issues found. Errors: 0 Warnings: 0 Database Objects Affected: 0
Greenデータベースの検証
作成が完了するとGreenデータベースに接続するためのエンドポイントが提供されるので、開発環境のアプリケーションをGreenデータベースに向けて動作確認をしました。
認証プラグイン周りに変更が入っているので、念のためアプリケーションから接続ができることを確認してからBlue/Greenの切り替えを行いました。
Blue/Greenデータベースの切り替え
アプリケーションから接続確認をして問題なかったので、Blue/Greenのアクションから切り替え
を実行します。切り替えの実行時にタイムアウト時間が設定できます。
プライマリインスタンスの切り替えは1分程度で完了しました。
本番バージョンアップ
開発環境での検証で特に問題がなかったので、本番のバージョンアップもBlue/Greenデプロイを使用して同様の手順で実行しました。
振り返り
今回バージョンアップを行うにあたって、
- ユーザー影響の少ないデータベースなのでなるべくコストをかけずに実施する
- (当初のサポート期限だった)2023年10月までに完了する
- 事故を起こさない
ということを目標にしていましたが、Amazon RDS の機能を活用することで短期間で安全にバージョンアップが完了できました。
事前にマイナーバージョンアップで Blue/Greenデプロイの検証ができていたことが大きかったです。
8月後半から調査、9月前半に開発環境のバージョンアップ検証、9月後半に本番環境のバージョンアップ実施、というスケジュール感でした。
おわりに
本記事は STORES Advent Calendar 2023 7日目の記事でした。明日は えんじぇる さんです!