【供養】Amazon RDS の MariaDB のバージョン上げたら、アプリケーションが立ち上がらなかった時の話をしよう
こんにちはー。
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]
もし、ほったらかしにすると、AWS さんが勝手にバージョンアップしてくる可能性があり、予期しないサービス停止が発生しかねません。
やったこと
10.3 系から 10.6 系へのバージョンアップ。ただそれだけ。
(´・ω・`)ソレダケー
どうなったか
非本番環境で稼働しているアプリケーションの一部が立ち上がらない。。。
(´;ω;`)タスケテー
なぜ起こったのか(原因)
アプリケーション起動時に DB コネクション数が確保できず、起動に失敗していました。。。
(´;Д;`)ドウシテー
なぜそうなったのか(真因)
詳細は後述しますが、
RDS のパラメータグループの特定の値が、バージョンアップに伴いデフォルト値の定義が異なっていたためでした。。。
(´;;;Д;;;`)キイテナイヨー
もうちょい詳しく
バージョンアップに際して事前に確認していたこと
RDS のパラメータグループは、Maria DB のエンジンバージョンごとに定義が分かれるため、
もともとの 10.3 とは別に、バージョンアップ後の 10.6 用のパラメータグループを定義し直す必要がありました。
なので、バージョンアップ前の調査において、
現行のパラメータグループ(10.3)でデフォルト値を上書きして独自定義していたパラメータを確認し、
その内容を踏襲する形で 10.6 用のパラメータグループを新規作成しました。
また、バージョンアップ前の調査では、バージョンアップに伴う仕様差分の把握も行いました。
MariaDB の公式が提供している下記のサイトを確認し、どのような機能追加がなされているか、非推奨・削除や変更がないか、などを確認しました。
参考:MariaDB が提供している各バージョン間の差分
確認での盲点
ただ、上記の確認だけだと、冒頭の結論に書いたパラメータグループの間の差分については確認が漏れてしまいます。
今回の原因は、差分があったパラメータの中で max_connections
のデフォルト値が {DBInstanceClassMemory/12582880}
から LEAST({DBInstanceClassMemory/25165760},12000)
に変更されていたことでした。
この変更は、大きなメモリを積んだインスタンス[3]でない限り、 max_connections
の値が半分になるため、
10.3 系では問題なかったコネクション数が 10.6 系に上げたことで、アプリケーション側で確保したいコネクションが足りず、起動できませんでした。
DBInstanceClassMemory
とは?
ちなみに この DBInstanceClassMemory
については、AWS の公式ドキュメントで以下のように説明されています。
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 の公式にしれっと書いていたりします。
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)
いやー、これは見つけられんわーー(´・ω・`)
私たち BABY JOB は、子育てを取り巻く社会のあり方を変え、「すべての人が子育てを楽しいと思える社会」の実現を目指すスタートアップ企業です。圧倒的なぬくもりと当事者意識をもって、こどもと向き合う時間、そして心のゆとりが生まれるサービスを創出します。baby-job.co.jp/
Discussion