SRE Group Managerをしている前田です。今回の記事は当社で遭遇したAmazon Aurora MySQLの不具合の話になります。
事象発生と解決までを時系列で記載。
社内メンバーよりBIツールからAurora MySQLに対してのクエリがエラーになるとのことで、クエリにlimit 100 を付けると実行出来、limit 1000だと
Error writing file '/rdsdbdata/tmp/MYpt7CKC' (Errcode: 28 - No space left on device)
が表示され結果が返ってこず、上記エラーメッセージで検索すると、Aurora MySQLのローカルストレージが枯渇している際に発生するとのこと。
幸いにもこの時点ではサービスで利用しているクエリには影響が出ておらず、BIツールで実行する結果が大きいクエリのみ事象が発生。
公式ドキュメントから抜粋
インスタンスクラスに基づく、クラスター内の各 Aurora インスタンスのローカルストレージ。このストレージタイプとサイズはインスタンスクラスにバインドされており、より大きな DB インスタンスクラスに移動することによってのみ変更できます。Aurora for MySQL は、エラーログ、一般ログ、スロークエリログ、監査ログ、および InnoDB 以外の一時テーブルの保存にローカルストレージを使用します。
ローカルストレージはインスタンスサイズにより決まっていて、おおむね搭載メモリ量の2倍のサイズのローカルストレージがインスタンスに割り当てられている。
発生しているエラー内容からAWSのドキュメントに辿りつき、max_heap_table_size とtmp_table_size を調整することで、ローカルディスクへの書き込みを抑制出来るとのことだったのでひとまずこちらを調整し、あわせてインスタンスサイズもr4.largeからr4.xlargeに変更しローカルストレージを32GB => 80GBにすることで対応。こちらの対応で一旦ローカルディスクの消費が収まり、BIツールから発行するクエリも実行出来るよう復旧。
再発防止のためDatadogにローカルストレージの容量監視を追加。
半年前にローカルストレージを80GBに増やしたインスタンスで再度、ローカルストレージの枯渇が発生が再発。今回はDatadogの監視にてサービスやBIツールに影響が出る前に、事前にローカルディスクの残容量の低下を検知。
検知した時点で1日に200〜300MBほどローカルストレージを消費しており、あと2〜3週間程度で枯渇する見込み。
再度max_heap_table_size とtmp_table_size の調整を試みるも消費スピードが変わらず、原因となっているクエリなども見当たらないため、同様の事例がないかAWSのサポートに問い合わせ。

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.
今回はクエリが打てなくなる前に検知出来ており、ローカルストレージの消費速度的に2〜3週間は猶予があったのと、DBエンジンのバージョンアップと言うことで、バージョンアップ検証とサービスへの影響が少ない時間帯でのサービスメンテナンスの日程を調整し、翌月にAWSサポートの回答の通り、DB エンジンバージョンのアップデートを実施。
DBエンジンのバージョンアップ後はローカルストレージの減少自体が解消。今回は実行しているクエリやDBパラメータの問題ではなく、AWSサポートの方から回答があったとおり、利用していたDB エンジンバージョン Aurora MySQL 2.10.0 が原因であった。

DB エンジンバージョンを更新後はローカルストレージが減少する問題もなく安定稼働中。1回目の事象のあとにRIを1年分購入してしまったため、r4.xlargeを利用していますが、元々のサイズであるr4.largeに戻してもパフォーマンス的には問題がないので、RI更新のタイミングでインスタンスサイズも元に戻す予定です。
引用をストックしました
引用するにはまずログインしてください
引用をストックできませんでした。再度お試しください
限定公開記事のため引用できません。