AWS ElactiCacheを使用したときの失敗事例




どうも高妻です。Twitterでもプログラミングのことや暗号通貨のことをつぶやいているのでよかったら覗きにきてください。  

ElastiCacheとは

クラウドでMemcachedとRedisが使えるAWSのサービスです。詳しくは下記リンクを参照してください。

https://aws.amazon.com/jp/elasticache/

本番環境でレスポンスの遅延が発生

サービスをリリースしてすぐにAPIのレスポンスが急激に遅くなり、Mysqlへのタイムアウトが頻発するようになってしまいました。一瞬で血の気が引いたのを今でも覚えていますし、思い出しただけでも嫌な気分になります笑

結論から言うと、Redisに対してkeysコマンドを使用していてCPU使用率が100%になってしまっていたのが原因でした。こんなにシンプルな問題なのに何故すぐ気づけなかったんだと今でも悔やまれます。

障害解消まで丸2日

サービスのメンテナンスを繰り返しながら障害の解消に丸2日かかりました。最後も原因がわかったから解決できたのではなく怪しい処理を修正しては反映させてを繰り返すことで解決しました。

なぜ分からなかったのか

そもそもなぜ原因がわからなかったかというと、Cloud Watchから全サーバーのCPU使用率、メモリ使用率等を見てもどのサーバーも余裕があるように見えたため、どこを改修していいか全く検討がつかなかったからです。

しかし、4コアのRedisインスタンスでCPU使用率が25%と表示されていたものが実際は100%使っていたのです。Redisがシングルスレッドで動いていることを把握していませんでした。

他の要因も

他にもRedisの遅延により、MySQLのコネクションがタイムアウトしたり、Redisのキャッシュヒット率が低かったり、処理の不備によるデータ不整合が発生したりと他にも問題が多すぎて何が原因なのか切り分けができないこともありました。

原因がわからないのでとりあえず目の前の解決できる問題をひたすら改修していくということもよくなかったと思います。根本の問題ではなく枝葉の問題ばかりに時間を使ってしまい、根本の問題が全然改善されないからです。

AWSのエンタープライズ版カスタマーサポート

障害が解消する少し前にAWSのサポートセンターに原因の調査を依頼しました。すると1時間程度でElastiCacheのCPUが100%になっていることを教えてくれました。

障害発生時、原因はこっちにあるからAWSのサポートに問い合わせても意味がないなと勝手に思い込んでいたのがよくなかったです。すぐに問い合わせていれば改修まで丸2日間もかからなかったと思います。

それ以降は何か問題が発生した場合はとりあえずすぐにサポートに問い合わせるようにしました。エンタープライズ版だと24時間体制でサポートが受けられますし、的確なアドバイスがもらえるので加入している場合は積極的に活用することをオススメします。

まとめ

  • Redisでkeysコマンドは使用してはいけない
  • 障害が発生したらAWSのサポートにすぐに問い合わせる
  • 闇雲に改修し、時間を浪費しない

この3点は身にしみて体験しているので今後忘れることはないですね。障害を乗り越えて成長するとはこのことですが、もうこんな経験はしたくないのでこの経験を皆さんも参考にしてみてください。以上です。







コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です