SRE Group Managerをしている前田です。今回の記事は当社で遭遇したAmazon Aurora MySQLの不具合の話になります。
3行まとめ
- Amazon Aurora MySQLのローカルストレージが異常な速度で消費、枯渇しクエリを実行するとエラーが発生するようになった
- 原因調査とAWSサポートへの問い合わせの結果、Aurora MySQL 2.10.0 の不具合と判明し、2.10.2へバージョンアップで解消
- Auroraのローカルストレージは自動拡張されないので、残容量の監視をしましょう
事象発生と解決までを時系列で記載。
2021年10月、Auroraに対してクエリが実行出来なくなる
社内メンバーよりBIツールからAurora MySQLに対してのクエリがエラーになるとのことで、クエリに limit 100
を付けると実行出来、 limit 1000
だと
Error writing file '/rdsdbdata/tmp/MYpt7CKC' (Errcode: 28 - No space left on device)
が表示され結果が返ってこず、上記エラーメッセージで検索すると、Aurora MySQLのローカルストレージが枯渇している際に発生するとのこと。
幸いにもこの時点ではサービスで利用しているクエリには影響が出ておらず、BIツールで実行する結果が大きいクエリのみ事象が発生。
Aurora MySQLのローカルストレージとは
公式ドキュメントから抜粋
インスタンスクラスに基づく、クラスター内の各 Aurora インスタンスのローカルストレージ。このストレージタイプとサイズはインスタンスクラスにバインドされており、より大きな DB インスタンスクラスに移動することによってのみ変更できます。Aurora for MySQL は、エラーログ、一般ログ、スロークエリログ、監査ログ、および InnoDB 以外の一時テーブルの保存にローカルストレージを使用します。
- クラスタボリュームと違い、ローカルストレージは自動拡張しない。
ローカルストレージはインスタンスサイズにより決まっていて、おおむね搭載メモリ量の2倍のサイズのローカルストレージがインスタンスに割り当てられている。
- インスタンスクラスごとのローカルストレージ量に関するドキュメント
2021年10月 原因調査と暫定対応
発生しているエラー内容からAWSのドキュメントに辿りつき、max_heap_table_size
と tmp_table_size
を調整することで、ローカルディスクへの書き込みを抑制出来るとのことだったのでひとまずこちらを調整し、あわせてインスタンスサイズもr4.largeからr4.xlargeに変更しローカルストレージを32GB => 80GBにすることで対応。
こちらの対応で一旦ローカルディスクの消費が収まり、BIツールから発行するクエリも実行出来るよう復旧。
再発防止のためDatadogにローカルストレージの容量監視を追加。
2022年04月 再度ローカルストレージの枯渇のアラート
半年前にローカルストレージを80GBに増やしたインスタンスで再度、ローカルストレージの枯渇が発生が再発。 今回はDatadogの監視にてサービスやBIツールに影響が出る前に、事前にローカルディスクの残容量の低下を検知。
検知した時点で1日に200〜300MBほどローカルストレージを消費しており、あと2〜3週間程度で枯渇する見込み。
再度 max_heap_table_size
と tmp_table_size
の調整を試みるも消費スピードが変わらず、
原因となっているクエリなども見当たらないため、同様の事例がないかAWSのサポートに問い合わせ。
2022年04月 Auroraの不具合によるローカルストレージの消費
AWSサポートへ同様の事例がないか問い合わせをしたところ、Auroraの不具合による可能性が高いので、DB エンジンバージョン Aurora MySQL 2.10.2を上げて欲しいとの回答
該当アップデート内容
Fixed an issue which can cause excessive internal logging when attempting zero downtime patching and restart causing local storage to fill up.
2022年05月 Aurora DB エンジンバージョンアップと事象の解消
今回はクエリが打てなくなる前に検知出来ており、ローカルストレージの消費速度的に2〜3週間は猶予があったのと、 DBエンジンのバージョンアップと言うことで、バージョンアップ検証とサービスへの影響が少ない時間帯でのサービスメンテナンスの日程を調整し、 翌月にAWSサポートの回答の通り、DB エンジンバージョンのアップデートを実施。
DBエンジンのバージョンアップ後はローカルストレージの減少自体が解消。 今回は実行しているクエリやDBパラメータの問題ではなく、AWSサポートの方から回答があったとおり、 利用していたDB エンジンバージョン Aurora MySQL 2.10.0 が原因であった。
2022年07月 現在
DB エンジンバージョンを更新後はローカルストレージが減少する問題もなく安定稼働中。 1回目の事象のあとにRIを1年分購入してしまったため、r4.xlargeを利用していますが、 元々のサイズであるr4.largeに戻してもパフォーマンス的には問題がないので、 RI更新のタイミングでインスタンスサイズも元に戻す予定です。
教訓
- Aurora ローカルストレージは自動拡張されないので残容量の監視をしよう
- 社内調査と平行して、同様の事例がないか早めにAWSサポートへの問い合わせをしよう