STORES Product Blog

こだわりを持ったお商売を支える「STORES」のテクノロジー部門のメンバーによるブログです。

STORES 決済 の MySQL をバージョンアップしました

こんにちは! STORES 決済 のバックエンドエンジニアをしているしまだ(mii)です。

先々週はバックエンドのみんなで JJUG CCC*1 に参加してきました。お祭りのようでとても楽しかったです。
気付いたらアドベントカレンダーの時期になっていたので、9月に実施したMySQLのバージョンアップの話をしたいと思います。

STORES 決済 では一部のデータベースで AWS Amazon RDS MySQL 5.7 を使用していましたが、2023年12月のサポート終了*2に向けて MySQL 8.0系へのバージョンアップを行いました。

前準備

事前調査

主に MySQL および Amazon RDS のバージョンアップガイドを参考にしました。

アップグレード手順の検討

バージョンアップには 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_plugincaching_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日目の記事でした。明日は えんじぇる さんです!