9/26(水)に発生した障害の詳細報告とその後の取り組みについて

9/26(水)に発生した障害の詳細報告とその後の取り組みについてお知らせいたします。

発生時間

  • 発生時間: 2018/09/26 10:51-15:20 (JST)
  • 発生事象: Mackerelシステム全体の不調と死活監視の停止

当日のタイムライン(いずれも日本時間)

10:51 Redisのフェイルオーバーと障害発生

監視データの保存に利用しているRedisのメモリ増の傾向が見られたため、Redisのスケールアップのために、レプリケーションを構築するオペレーションを実施しました。その際、レプリケーションの構築に時間がかかり、Redisが応答しない時間が発生した結果、クラスタリングソフトウェア(keepalived)がノードの故障として検知し、意図しないフェイルオーバーが発生しました。

それにより、アプリケーションサーバーからRedisへの接続がおこなえず、正しく応答を返せない状況となりました。

10:55 復旧作業と障害継続

適切なRedisへの切り替え作業を改めておこない、アプリケーションの復帰を一旦確認しました。

しかし、その後アプリケーションの動作が安定せず、障害以前から発生していたネットワーク不調、Redisメモリ増などとの複合的な要因もあり、アプリケーションサーバーのレイテンシ悪化、及びタイムアウトなどの事象が発生しました。アプリケーションサーバーの再起動を順次実施したものの、症状は改善されませんでした。

これが障害が長引いた要因です。詳細な原因に関しては現在も判明しておりませんが、原因究明も打ち切った状況です。

11:00-14:50 障害対応

具体的に以下の対応をおこないました。

  • 不適切なメトリック投稿をしているオーガニゼーションの検知とそのリクエストの遮断
  • アプリケーションサーバーのタイムアウト間隔の調整
  • Diamond(TSDB)の一時的な増強
    • Kinesisシャード数・Redis Clusterシャード数の増強
  • API用のアプリケーションサーバーのスケールアウト

その後、一時的にメンテナンスモードに切り替え、社内での確認をおこなった後、外部からのリクエストを徐々に戻す対応を実施しました。

15:20 復旧確認

アプリケーションサーバーのレスポンスの安定、mackerel-agentからのメトリック再送の収束、TSDBへの反映遅延の解消を確認し、復旧を宣言しました。

障害発生の原因について

障害の起因は、Redisへのオペレーション実施にともなう意図しないフェイルオーバーの発生です。ただ、その後の復旧が長引いた原因に関しては正確には特定できておりません。障害の振り返り時に以下のような仮説が挙げられました。

  • 特定のアクセスパターンが継続したときに、Scalaアプリケーションにおいて、スレッドプールまたはコネクションプールの同期待ちまたはロック競合などの要因により、レイテンシが悪化する

仮説検証について

上記の仮説を確認するために、隔離環境にて障害時の状況の再現を試みましたが、同様の状況の再現することはできませんでした。

今後の対応

上記の通り、詳細な原因は特定できておりませんが、以下の対応を実施することで、今回のような長時間の障害は防げると考えています。

Redisフェイルオーバー挙動の見直し(実施済)

そもそも障害の起因となったフェイルオーバーの誤作動に対応するため、僅かな時間の負荷増大でフェイルオーバーさせないようにRedisのkeepalivedヘルスチェック回数を増やす対応をおこないました。

アプリケーションの増強(実施済)

アプリケーションの性能にこれまで以上にバッファを設けます。具体的には以下の対応をおこないました。

  • Redisのスケールアップ作業
  • アプリケーションサーバーの台数の増強

Redisへ保存する監視データの効率化(実施済)

Redisのメモリ利用量増への根本対応として、アプリケーションの改修をおこない、必要な監視データのみをRedisに保存する効率化をおこない、Redisのメモリ利用量を削減しました。

不適切なリクエストへの対応(実施済)

  • 不適切なAPIリクエストをすばやく検知する仕組みの構築
    • ダッシュボードにて可視化できるように
  • 不適切なリクエストをしているオーガニゼーションをすばやく遮断する機能の作成

また、不適切なリクエストの検知に感しては、今後もより精度を上げるほか、API Limitなどの機能増強も検討しています。

アプリケーションモニタリングの増強(恒常対応)

アプリケーションサーバーの内部処理のモニタリングを強化し、障害が発生する前に対応をおこなえる体制を整えていきます。

まとめ

今回の障害では、これまでになく長時間にわたりご迷惑をおかけして申し訳ありませんでした。再発防止に務めると共に、たとえ障害が発生しても問題を局所化できるような取り組みを引続きおこなってまいります。

今後ともMackerelをよろしくお願いいたします。