『ディアブロ II リザレクテッド』で起こっている不具合の原因説明/今後の恒久的な解決計画に関しまして
はじめにプレイヤーの皆様にはご不便をおかけしており大変申し訳ございません。
皆様からお問い合わせを頂いております、現在起こっている複数の不具合に関しましての原因説明とこれまで実施した対処法に関しまして、そして今後どのように進めていくかの解決計画に関しましてご説明をさせていただきます。
一部キャラクターの巻き戻り不具合の対応に関して
サーバーの停止は単体での問題により発生しているものではないため、都度不具合が発生した際、緩和策の調査及び長期的な構造の組み換えの両面での問題解決に取り組んでいるのが現状でございます。一部のキャラクターに関しましてデータの巻き戻りが起こる現象が発生しておりましたが、今後はサーバークラッシュにより巻き戻りが起こってしまった場合、巻き戻りは数分程度分にとどまる予定でございます。
ただこちらは根本的な解決策になっていないこと、開発チームの方でも重々理解しておりますので引き続き恒久的な解決に取り組んでおります。
ここからは技術的な話となってしまいますが、プレイヤーの皆様への現状の透明性を確保するため、不具合・障害が発生している理由/それぞれの事例に対処するために開発チームで行った対処内容/そして現時点で実施している根本的な原因を調査する方法について少し詳しくご説明させていただければと思います。
サーバーの障害に関しまして
問題の説明の前に、『ディアブロ II リザレクテッド』のサーバーデータベースがどのように機能しているかをご説明させていただければと思います。
『ディアブロ II リザレクテッド』の内部構造として、グローバルデータベースと地域データベースの2タイプが存在しております。
グローバルデータベースは全てのキャラクター情報/進捗状況を把握するための唯一の情報源として存在しております。ただ、こちらは1つのデータベースでは対応できない大きなタスクとなるため、不可と遅延を軽減するためにNA/EU/アジアの各地域に地域データベースが存在しています。こちらの地域データベースで各地域のプレイヤー様のキャラクター/進捗情報を保存し、地域データベースからグローバルデータベースに定期的に書込を行っている構造となっております。よってゲーム内のほとんどのアクションはこちらの各地域データベースで実行されています。
また、個々のキャラクターの記録の整合性を担保するために、日本のプレイヤー様のキャラクターはアジアのデータベースにロックされています。
その上でグローバルデータベースは、メインデータベースが故障した場合に備えてバックアップも取っています。
こちらの内部構造の仕組みをベースに、10月9日(土)から現在までで発生している“一定の時間になるとサーバーがダウンする障害”に焦点を当ててご説明致します。
10月9日(土)夜
- 同接数がロンチを超える過去最大のものだった
- 10月8日(金)に配信したゲーム作成時のパフォーマンスを向上させるアップデートが、グローバルデータベースに常時より負荷をかけてしまった
10月10日(日)
土曜の対応策だけでは十分でなかったため、再度サーバーダウンが不安定な状態となりました。
また、これによりログイン待ちのプレイヤー様の待機がさらに増加したため新たな巻き戻りの不具合が発生する結果となりました。
ゲームサーバーがデータベースからの切断を監視し、すぐに再接続を試みる、という接続試行の処理に追われ、データベースが完了した作業を保存するのに追いつく時間がなかったことが原因となります。開発チームの方では、サーバーを通常の状態に戻すために必要なデータベースのイベントログ設定を改善しました。
しかし数十分のうちに何十万人の同時接続が行われるピークタイムにオンラインに戻してしまったため、またしてもサーバー障害を引き起こす結果となってしまいました。
そこで設定やコード改善を含む複数の修正を行いバックアップのグローバルデータベースに切り替える対応を行いました。
10月11日(月)
グローバルデータベースに切り替えが行われました。
こちらはバックアップデータベースが本来ならばサーバーからのリクエストに対応すべきところを、メインデータベースからのコピーに処理リソースを費やしていたことが原因となります。
加えて更なる問題が発見され、そちらの対応も随時行いました。
- 廃止された後残り続けていた負荷が高いクエリー(データベースへの検索要求)を削除
- プレイヤーがゲームに参加する際のログインチェック最適化
これにより負荷の軽減に成功し、また10月12日(火)には問題となるデータベースの切り替え動作が確認されなかったことから、データベースの再接続の問題については解決したと考えています。
10月12日(火)
再度ピークタイムにおいて1地域で数十万の同時接続を記録し、これによりデータベースのパフォーマンスが一時的に低下しました。こちらの背景にはこれまで発生してきたものとは違う要因が関係していると予想しており、現在データベースエンジニアが調査中です。
また、Blizzard社内の別チームのエンジニアにも依頼をし、できる限りの総動員で原因究明を行っております。
なぜ問題を未然に予測して防げなかったのか
オリジナルのゲームを忠実に再現するために、あえて多くのレガシーコードが内部的に存在している状態にキープしています。しかしある特定のレガシーサービスは現代のプレイヤーの行動に対応できるよう組まれておりませんでした。
ただこちらのサービスは、ゲーム機能の重要部分を処理している幹となっております。
具体的にはゲームの作成/参加、ゲームリストの更新/読み取り/フィルタリング、ゲームサーバーの健全性の確認、データベースからのキャラクターの読み取りなどが挙げられます。
一番肝となったのは、こちらのサービスがSingleton(シングルトン)パターンであったことです。
全てのプレイヤーが常に最新の適切なゲームリストを見られるようにするために、このサービスのインスタンスは1つしか実行ができません。勿論オリジナルから最新の技術に合わせてこちらのサービスの最適化は行っている状態でしたが、問題の多くがこのゲームの作成に起因しています。
現代のプレイヤーの行動と過去のプレイヤーの行動の違いに関して言及致しますと、2001年はインターネット上にディアブロⅡを正しくプレイする攻略サイト(経験値を得るためのBaalの討伐、アイテム探しのためのレアモンスター周回方法Etc)はそれほど多く周知しておりませんでした。しかし昨今では新規プレイヤーに向けて効率よくゲームをプレイする様々な方法が溢れている状況になっております。
そしてその攻略方法のほとんどは、ゲームの作成/ロード/破壊を連続して行うことが多く、この動作によりデータベースへの負荷が大きく重なっていくものです。
プレイヤーの皆様が新しいサーバーでキャラクターを作り、魔法のアイテムを手に入れるために努力するということは予想していましたが、我々がベータテストで得られた情報をもとに想定していた範囲を大幅に超えておりました。
また、グローバルデータベースへの保存頻度を必要以上に高くしていた内部構造も要因です。本来であれば、地域別のデータベースに保存し、アンロックが必要な時だけグローバルデータベースに保存する動作で十分だと判断したため、現在ではその軽減策が導入されている状況となります。
また、こちらの処理方法を全面的に変更するためのコードも作成中です。
これにより、グローバルデータベースへの保存頻度を大幅に下げることで、サーバー負荷が大幅に軽減される予定です。
進行状況の無効化/巻き戻し不具合に関しての注意事項
先にご説明させていただきました通り、一部のプレイヤー様に発生しているこちらの不具合は地域データベースとグローバルデータベース両方でキャラクター進捗情報が保存されている内部構造に起因しています。
サーバー停止中にデータベースも落ちてしまった場合、多くのキャラクターが地域データベースに閉じ込められてしまい、グローバルデータベースにデータを保存する方法がなかったことが原因となります。
こちらの問題が発生した際、解消するために開発チームの方では10月9日(土)時点で以下2点の対処策を検討しておりました。
- グローバルデータベースに保存されていない変更を全てアンロックし、グローバルデータベースで発生する上書きによって進捗状況を無効化
- ある一定時間、ゲームを完全停止させて地域データベースのデータをグローバルデータベースに書き込むスクリプトを実行すること
9日時点で開発チームとしては1の考えに基づいて対応策を遂行しておりました。
巻き戻りデータの復元のため長期間ゲームを完全停止するよりも、皆様がプレイできるようゲームを維持する事が優先と考えたためです。
こちらの判断により進捗状況や貴重なアイテムを失ったプレイヤーの皆様には、大変申し訳なく思っており、深くお詫び申し上げます。本当に申し訳ございませんでした。
現時点の対処と致しまして、サーバーがクラッシュした場合、データが巻き戻る不具合が万が一起こったとしても巻き戻りは数分程度にとどめる処理が入っております。
もちろんこちらの対応は十分ではないと重々理解しております。根本的な解決処置のために現在私たちで取り組んでいることに関してもご説明をさせていただきます。
現在取り組んでいる調査/対応に関しまして
レートの制限
ゲーム作成/参加する際のデータベースの操作回数を制限しております。
一部プレイヤー様が行われている「Pindleskin Run」など(ハイペースで周回できるレアモンスター討伐)を目的として、ゲーム参加と作成を短時間で繰り返しているプレイヤー様はある時点でレート制限がかかります。これはゲームサーバーがダウンしたことを示すものではなく、ゲームを継続するためにデータベースの負荷を一時的に軽減するための処理としてレート制限を受けたことを意味します。
こちらは一時的な緩和措置となり、長期的な解決方法に取り組んでおります。
ログインキューの作成
プレイヤーベースが活性化していること、複数のプラットフォームが追加されたこと、スケールアップに伴い発生するであろう不具合など、現時点でも将来的に新しい問題が発生する可能性があると考えております。それらを迅速に診断/対応するためには、大量のプレイヤーが同時にログインする過密を確実に止める必要がございます。
この問題に対処するため、World of Warcraftで処置したようなログインキューを制作中です。これにより、安全なレベルの同時接続数を担保することができ、システムの不具合の予兆を監視して、サーバーが完全にダウンする前に対処を行うことができるためです。
人口の上限は起こっている問題を対処する毎に緩和していく予定でございます。
こちらのログインキューはバックエンドでは既に部分的に実装されており(プレイヤー様からはログイン認証に失敗した、という通知が出る形)、PCでは近日中に、家庭用ゲーム機もそのあとに展開される予定となっております。
重要なサービス機能を細かく分割する
こちらの作業は既に進行中となっており、完了している部分もございます。
大規模な修正計画(例えば、プレイヤーにゲームリストを提供する部分だけに分割されたサービス機能等)も遂行中です。重要な機能が分解された後は、ゲーム管理サービスのスケールアップを検討することで、負荷の軽減を図ることができると考えています。
現在、事例をリアルタイムで管理し問題を診断、修正までを最速で実施するために弊社ディアブロⅡチームだけでなく、ブリザードチーム全体の力を借り、多くのスタッフが取り組んでおります。
ディアブロⅡリザレクテッドは私たち社員全員にとっても非常に大切なものです。
チームの中には2000年当時からプレイし続けている人や、MoDコミュニティに参加している人など、生涯を通じてディアブロⅡをプレイしている人がたくさんいます。
私たちは開発者としてだけではなく、プレイヤーやコミュニティのメンバーとしても皆様に満足いただけるゲーム体験が得られるようになるまで、全力で作業を遂行致します事を、ここでお約束致します。