何が起きたか
2018年2月3~4日、『フォートナイト バトルロイヤル』は同時接続プレイヤー数が340万人のピークに達した——わずか数か月前のピークだった6万人からの急増であり、その週末は断続的な障害の連続となった。2018年2月8日に公開されたEpic自身のポストモーテムは、部分的なものと全停止を含む6件の別個のインシデントを数えている。
最も深刻だったのはMCPプロファイルサービスで、9つのMongoDBシャードが支え、毎秒31万8000回の読み取りと13万2000回の書き込みを処理していた。マッチメイキング用シャードが書き込みをキューイングし始め、単一操作が4万ミリ秒超に急騰してすべてのMCPスレッドをブロックした。自己復旧することはなく、運用担当者は1時間に数回、手動でプライマリのフェイルオーバーを実行した。第二の傷は、パッケージ変更によりサービスのスレッド数が意図された安全値より暗黙に制限されていたことだった。最近の「修正」——それを元に戻すこと——は、本番ピーク時にのみデータベース接続プールを枯渇させ、ロールバックを余儀なくした。
日曜日、アカウントサービスはUTC18時30分から20時20分まで停止した。Memcachedの不安定さによりNginxが100ミリ秒のタイムアウトでブロックされ、ワーカースレッドが尽き、ヘルスチェックが機能しなくなり、ロードバランサーが全ノードを切り離した——世界中でサインインがブロックされた。その夜、XMPPソーシャルレイヤーは緊急のブルー/グリーン・フェイルオーバー中に失敗した。再接続の殺到がFriendsサービスのロードバランサーを圧倒したが、そのサブネットに空きIPがなくなっていたため代替を用意できなかった。プレイヤーは接続できたものの、すべてのフレンドがオフラインと表示された——「暗い部屋」状態である。
クラウドの上限が事態を悪化させた。数千台のc4.8xlargeインスタンスがリージョンのインスタンス上限に近づき、251個の使用可能IPを提供する/24サブネットが枯渇していたため、ロードバランサーの復旧が長引いた。EpicはMongoDBの専門家を現地に派遣し、メッセージングスタックとMCPの再設計を約束し、ポストモーテムを採用募集の訴えで締めくくった——少数のベテランオンライン開発者チームが、世界最大のPC/コンソールゲームを、その数字が彼らを追い越すまでオンラインに保っていたのだ。
何を犠牲にしたか
2018年2月3~4日の6件の部分的・全体的な障害:サインインのブロック、マッチメイキングの停止、フレンドのオフライン表示。手動フェイルオーバーは1時間ごとに実行された。
なぜ起きたか
マッチメイキングの状態は1つの共有シャード上にあり、そのライターがキューイングするとすべてのMCP操作がブロックされ、唯一の復旧手段は手動のプライマリフェイルオーバーだった。
パッケージ変更によりMCPサービスのスレッド数が安全なデフォルト値未満に制限されていた。その修正自体が本番のみのピーク時にデータベース接続プールを枯渇させ、ロールバックが必要になった。
アカウントサービスのすべてのトラフィックはNginxプロキシを経由し、そのワーカーは100ミリ秒のMemcachedタイムアウトでブロックされた。飽和したワーカーはヘルスチェックに失敗し、ロードバランサーが全ノードを切り離した。
Friendsサービスのフェイルオーバーパスには/24サブネット(251アドレス)内の空きIPが必要だったが、再接続の殺到がインシデントの最中にそれを枯渇させた。
XMPPはフルメッシュクラスタ(101ノード、クラスタリンクだけで各約1,000ソケット)をハードなノード上限付きで運用していたため、ソーシャルレイヤーの容量を単純に追加することはできなかった。
教訓
成長は採用が追いつくより速くアーキテクチャを追い越す。50倍の規模では、未検証のスレッド設定、251IPのサブネット、1つのホットシャードがそれぞれ障害となる。
その後
ポストモーテムの修正リストは再設計プログラムのように読める。現地の専門家とともにMongoDBの書き込みキューを根本原因分析し、マッチメイキングセッションをインメモリ・ストレージへ移し、検証以外のトラフィックをNginx/Memcachedのペアを迂回させ、サブネット容量を修正し、コアサービスをリージョンやクラウドに分散して影響範囲を縮小する。Epicはゲームが成長し続ける中で『フォートナイト』のサービス更新を公開し続け、このポストモーテムは、バイラルな成長がいかに潜在的な設定ミスのすべてを障害へと変えるかを示す標準的な引用例となった。
出典をたどる
出典
- Postmortem of Service Outage at 3.4M CCU Epic Games (Fortnite news) · epicgames.com ·
- Postmortem of Service Outage at 3.4M CCU (archived copy) Internet Archive Wayback Machine · web.archive.org ·
- Postmortem of Service Outage at 3.4M Concurrent Users (discussion) Hacker News · news.ycombinator.com