【備忘録】コネクションタイムアウト設定忘れて二次障害起こしちゃった話
タイトルの通り。
今回はタイムアウト設定ミスによる想定外の二次障害をやらかしたのでメモ程度に残しておこうかなと。
(自分がやらかしたわけではないですが忘れないようにするため)
問題が起きた環境
- AWS LAMP環境(EC2複数, ELB, ElastiCache)
- Laravel製APIアプリケーション
本題
ここで発生した問題点は、ElastiCache(Redis)の一時的なアクセス不可障害。このタイミングでEC2の急激な高負荷、DBへの高負荷が検知され、アラートの嵐になった。
APIのレスポンスも遅くなり、エラー件数も増えて自分は??????状態
ElastiCacheのアクセス不可状態が2分程度で解消し自動的に収束となりました。🤔
原因はコネクションタイムアウト時間
直接の原因は、キャッシュのコネクションタイムアウトまでの時間設定がデフォルト値の30秒だったことでした。
アクセス不可とはいえコネクションは張っていたために、応答がかえってくるまですべての処理が止まるという状態が発生。
プロセスが溜まりEC2の負荷が上昇、同時にDBのコネクションもLaravelの仕様上、リクエスト受取時から張ったままなのでDB側も負荷上昇と言う事態になりました。
以下の図のようなイメージです
結論
外部との接続部分はタイムアウト時間を検討して設定をしておきましょう😊
クラウドサービスは基本的に稼働率非常に高いですが、100%ではありません。瞬断程度ならよくあるような話なので各アプリケーション毎に止まらないような工夫をしておかないとですね。(自分に言い聞かせる)
以上!