👻

【供養】Amazon RDS の MariaDB のバージョン上げたら、アプリケーションが立ち上がらなかった時の話をしよう

2023/12/19に公開

こんにちはー。
BABY JOB 株式会社の @mackey0225 です!

忘年会シーズンですねー!
今年やってしまった失敗を忘れ去りたいので、記事にしちゃいました。[1]

結論

「RDS のエンジンバージョンを上げる際はパラメータグループの差分もちゃんと見とけよ!」

背景

弊社のプロダクトである『手ぶら登園』は、アプリケーションフレームワークに Spring Boot を使用し、DB に Amazon RDS for MariaDB を使用しています。

当時は、MariaDB の 10.3 系を使用していましたが、
この 10.3 系は、コミュニティサポート終了日が 2023年5月25日 で、
RDS の標準サポート終了日も 2023年10月23日 となっており、バージョンアップは不可避でした。[2]

https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/MariaDB.Concepts.VersionMgmt.html#MariaDB.Concepts.VersionMgmt.EndOfLife103

もし、ほったらかしにすると、AWS さんが勝手にバージョンアップしてくる可能性があり、予期しないサービス停止が発生しかねません。

やったこと

10.3 系から 10.6 系へのバージョンアップ。ただそれだけ。
(´・ω・`)ソレダケー

どうなったか

非本番環境で稼働しているアプリケーションの一部が立ち上がらない。。。
(´;ω;`)タスケテー

なぜ起こったのか(原因)

アプリケーション起動時に DB コネクション数が確保できず、起動に失敗していました。。。
(´;Д;`)ドウシテー

なぜそうなったのか(真因)

詳細は後述しますが、
RDS のパラメータグループの特定の値が、バージョンアップに伴いデフォルト値の定義が異なっていたためでした。。。
(´;;;Д;;;`)キイテナイヨー

もうちょい詳しく

バージョンアップに際して事前に確認していたこと

RDS のパラメータグループは、Maria DB のエンジンバージョンごとに定義が分かれるため、
もともとの 10.3 とは別に、バージョンアップ後の 10.6 用のパラメータグループを定義し直す必要がありました。

なので、バージョンアップ前の調査において、
現行のパラメータグループ(10.3)でデフォルト値を上書きして独自定義していたパラメータを確認し、
その内容を踏襲する形で 10.6 用のパラメータグループを新規作成しました。

また、バージョンアップ前の調査では、バージョンアップに伴う仕様差分の把握も行いました。
MariaDB の公式が提供している下記のサイトを確認し、どのような機能追加がなされているか、非推奨・削除や変更がないか、などを確認しました。

参考:MariaDB が提供している各バージョン間の差分

https://mariadb.com/kb/en/upgrading-from-mariadb-103-to-mariadb-104
https://mariadb.com/kb/en/upgrading-from-mariadb-104-to-mariadb-105
https://mariadb.com/kb/en/upgrading-from-mariadb-10-5-to-mariadb-10-6

確認での盲点

ただ、上記の確認だけだと、冒頭の結論に書いたパラメータグループの間の差分については確認が漏れてしまいます

今回の原因は、差分があったパラメータの中で max_connections のデフォルト値が {DBInstanceClassMemory/12582880} から LEAST({DBInstanceClassMemory/25165760},12000) に変更されていたことでした。

この変更は、大きなメモリを積んだインスタンス[3]でない限り、 max_connections の値が半分になるため、
10.3 系では問題なかったコネクション数が 10.6 系に上げたことで、アプリケーション側で確保したいコネクションが足りず、起動できませんでした。

ちなみに DBInstanceClassMemory とは?

この DBInstanceClassMemory については、AWS の公式ドキュメントで以下のように説明されています。
https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/USER_ParamValuesRef.html#USER_ParamFormulas

DBInstanceClassMemory

Returns an integer for the number of bytes of memory available to the database process. This number is internally calculated by starting with the total amount of memory for the DB instance class. From this, the calculation subtracts memory reserved for the operating system and the RDS processes that manage the instance. Therefore, the number is always somewhat lower than the memory figures shown in the instance class tables in DB instance classes. The exact value depends on a combination of factors. These include instance class, DB engine, and whether it applies to an RDS instance or an instance that's part of an Aurora cluster.

つまり、単純に DB インスタンスのメモリサイズ(バイト)ではなく、その値から OS や RDS プロセスで使用するバイト数を引いたものになるので、インスタンスのメモリサイズから小さい値になるようです。

さいごに:後日談

本番環境だとインスタンスサイズを大きく設定しているので、インスタンスサイズが小さい非本番環境だけ発生するものでした。
とはいえ、バージョンアップ用に検証環境を用意し、あらかじめ影響がない手順で本番のバージョンアップができたことは良かったです。

加えて、今後もバージョンアップすることは必要なので、
パラメータグループの比較もしておくべきということを身を持って学びました。
( `・∀・´)イイマナビダナー

さらに余談

今回のデフォルト値が変更になっていることは、AWS の公式にしれっと書いていたりします。

https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/CHAP_Limits.html#RDS_Limits.MaxConnections

Default for all MariaDB and MySQL versions except for MariaDB version 10.5 and 10.6: {DBInstanceClassMemory/12582880}
Default for MariaDB version 10.5 and 10.6: LEAST({DBInstanceClassMemory/25165760},12000)

いやー、これは見つけられんわーー(´・ω・`)

脚注
  1. コラ、そこ!!「記事にしたら忘れられへんやろ〜」とかツッコまない!! ↩︎

  2. 以下、AWS のドキュメントはすべて英語のリンクを載せていますが、理由は和訳の誤植があるためです。例えば、MariaDB の 10.3 の廃止スケジュールも日本語の方は「2024 年 1 月 23 日」とすべきところを「2023 年 1 月 23 日」となっていたりしています。 ↩︎

  3. メモリサイズが 256 GB を超えるようなインスタンス。 ↩︎

BABY JOB  テックブログ

Discussion