あるネットゲーマーの日常

プレイしているネットゲームの話題を中心にまったりと

【特別編】なぜMMORPGは重くなるのか(前編)~データベース編~

最近、ワールド倉庫の実装により人が流動し、
ROの特定の鯖・・・Breidablik鯖が急速に重くなり、
いろいろな障害が発生しております(lll゚Д゚)

それ自体はよろしくないものなのですが、どうにも個人的に納得できないのが、
「Gほーさんや重力が無能だから対応できないでいる」という言説です

まあ、ユーザーからすれば技術的な難易度とか関係ないので、
現状に対してそういった不満が出ること自体はわかります

しかし、私のようなエンジニアからすると、
「できる範囲でよくやっている」と見えるので、
そういった批判は仕方ないとはいえ、ちょっとかわいそうかな・・・と(´・ω・`)

そこで今回は、技術的な原理をできるだけわかりやすく説明して、
MMORPGの運用は(一般のWebシステムに比べて)難しい」というのが、
なんとなくわかっていただければな・・・と

私はあくまでエンジニアなので、「サポート」とか「体制」といった、
組織的な側面からは言及しません*1

一度にいろいろ書くと大変なので、大きく前後編に分けます...φ(・ω・`)

  • 前編:なぜ、人が増えるとサーバが重くなり、サーバを簡単に増やせないのか?
  • 後編:なぜ、重くなるとデータロストが発生してしまうのか?

後編については表面上の動作からの推測がかなり含まれますが、
できる範囲で現象を説明してみる予定です

そもそも、これを書いている私は技術的に知識があるのか?

MMORPGの仕組みについて興味を持ったきっかけはこちらの本です(´・ω・)っ

オンラインゲームを支える技術  ??壮大なプレイ空間の舞台裏 (WEB+DB PRESS plus)

オンラインゲームを支える技術  ??壮大なプレイ空間の舞台裏 (WEB+DB PRESS plus)

2011年の本ではありますが、MMORPGの設計や見積もり、
運用コストに至るまで、「プロのノウハウ」が大量に詰め込まれた本であり、
ROの裏側について、この本からかなり推測できるようになりました

その後、ソーシャルゲームの隆盛により、
一般的なWeb技術でゲームを開発する・・・という流れが来たので、
それにあわせて私もゲーム開発の仕事に転職しました(`・ω・´)

私の専門はサーバサイドなので、直接ではないにせよ、
先ほどの本のノウハウというか原理については、とても参考になりました

もちろん、スマホゲーなんかより、MMORPGの方がはるかに難しいのです
スマホゲーのマルチプレイ機能が、24時間動き続けているようなものですからね(lll゚Д゚)

幸か不幸か、私自身もスマホゲーのマルチプレイサーバの開発をやっていたことがあり、
「複数のプレイヤーが同時にアクセスするゲームの難しさ」はわかります
数人でも難しいのに、数百人~数千人となれば、もう想像を絶するレベルです

それを既存の技術の延長線上でどう解決していくのか・・・という、
MMORPGの設計について書かれたのが先ほどの本です
専門書なので、Webの知識がないと難しいと思いますが、興味がある方はぜひ

MMORPGのサーバ構成

というわけで本題にいきましょう...φ(・ω・`)

結論からいえば、現状のB鯖における重さの主原因は、以下の二つに集約されると思います

  • データベース(DB)サーバの過負荷
  • データを保存する通信経路の過負荷

要は、「データを保存するところが詰まっている」ということです(´-ω-)

そもそも、MMORPGのサーバ構成って、どうなっているか想像できますか?
先ほどの本にはこのような概要図が載っております

f:id:parrot_studio:20180912001226j:plain

なにやら難しそうな図ですが、概要だけ書き出してみるとこうなります


<ゲームサーバ>(複数/1ワールド)

クライアントが接続するサーバで、ゲームの状態を管理する

「ゲームの状態」とはプレイヤーキャラはもちろん、
敵のデータ、NPCのデータ、アイテムのデータ、スキルオブジェクトのデータなど、
画面内に存在するあらゆる「もの」のデータと、その衝突判定を司る

一つのゲームサーバが複数のエリアを担当しており、
障害告知で挙げられたMAPのリスト=一つのゲームサーバで管理しているMAP群と考えて良い

基本的にはメモリ空間で全ての状態を管理している
(そうでないと、莫大な状態データの書き換えに対応できない)
ゆえに、サーバの電源が切れれば全部消える
なので、定期的にデータを外に書き出す必要がある


<データベースサーバ>(1つ/1ワールド)

ゲームサーバから依頼を受けて、どんどんとユーザーデータを保存するサーバ*2

複数のサーバにバラバラに書き込んでしまうと、
サーバ間での整合性が取れなくなるため、
(ゲームに限らず)「書き込むサーバ」は一つでなければならない


<その他のサーバ>

  • メッセージサーバ:チャットの入力を受け取って、他に送り出したりする(重くなるとチャットが遅くなる原因)
  • ログインサーバ:ID/PASSからアカウント情報を特定し、アカウント情報に紐付くキャラデータを返す(他人のキャラでログインできてしまったりする原因)
  • ログサーバ:各サーバから様々なログデータを集めて保存する(以前に比べてかなり強化されたと推測されるサーバ)
  • その他、ワールド間で共通するデータを扱うサーバなど(ワールド倉庫とか)

ROもだいたいこのような構造をしていると思われます...φ(・ω・`)

ちなみに、スマホゲーの場合はまたちょっと構造が違いますが、
MMORPGと違い、ユーザーは自分のデータにしかアクセスしないため、
もうちょっと簡略化された構成で運用できます
(少なくとも、私が知っているサービスの範囲では)

なぜ、人が増えると重くなるのか?

よく見かけた言説が、「ゲームサーバを増やせば重さを解消できる」というものです

人が増えるほど、一つのゲームサーバで管理する「状態」は加速度的に増えるため、
特定のMAPに人が集中してしまう状況・・・イベントエリアとか・・・を、
複数の並列エリア・・・「朝」「昼」「夕暮れ」等・・・に分割するのは意味があります

画面内に存在する人の数が減れば、クライアント側とやり取りするデータ量や、
クライアントがPCで描画する負荷が下がるため、
「画面がかくかくすること」は改善が見込めます(`・ω・´)

Gvのように、一つのMAPで大量のオブジェクトが飛び交う場合にも、
その当たり判定処理だけで相当な計算量になるので、
これもゲームサーバを分ける対象としては妥当でしょう

しかし、現状のB鯖における問題は、「ワールド単位で人が急激に増えたこと」なのです
たとえ、露店が集中する街を並列化したとしても、
データの書き込み先は一つなので、問題の解決にはならないと予測しています

ゲームサーバは定期的にデータベースサーバに更新データを送る必要があり、
このデータの書き込み頻度は、ログインしているユーザー数に依存しており、
ゲームサーバがいくつあっても、基本的には変わらないからです

データベースにとって「書き込み」処理は「読み込み」に比べてはるかに重い処理です
単純なCPU速度だけでなく、大量のメモリ領域の確保はもちろん、
ストレージ*3への書き込みスピードも相当速くないと耐えられません(lll゚Д゚)

しかも、通常のWebサービスであれば、
ほとんどが読み込みで、書き込みはほんのちょっとですが、
ゲームの場合はほとんどが書き込みデータです

例えば、Blogシステムであれば、
更新するユーザーの数はせいぜいBlogの数程度ですが、
読む側はその何百倍、何千倍といるのはすぐに想像できるでしょう

それに比べると、ゲームのデータは「あらゆるデータの更新」を
「定期的に」書き出さないといけません
(なぜ「更新された都度」ではないのかは後編に回します)

しかも、「ログインしたときに復元される全情報」が「更新対象」です
キャラのパラメータはもちろん、「アイテム」や「キャラがいる座標」すらも対象です
極端な話、一歩歩くだけでもデータを保存しないといけないわけですΣ(゚Д゚;≡;゚д゚)
(ログインしたら必ずセーブポイントから・・・だったら不要ですが)

100人が歩き回るデータを保存するのと、数千人が歩き回るデータを保存するのとでは、
更新の量・頻度ともに桁違いであることは、なんとなく想像できますよね?

また、書き込みを依頼することで、ネットワークをデータが飛び交うことも問題になります
サーバのスペックはみんな気にするのですが、意外と通信帯域の見積もりは甘かったりします

Amazon等で「クラウドサーバ」が提供されていますが、
大規模なシステムを運用していくと、実はサーバの稼働料金より、
ネットワークの料金の方が重くなってきたりしますΣ(・ω・ノ)ノ

それゆえに、大きなWebサービスや大手のゲーム会社は、
自社のデータセンターか、データセンター内に自分達の専用領域を確保していたりしますが、
それは置いておいて・・・

たとえ、データベースサーバのスペックが十分であったとしても、
データの更新頻度・量が大量だと、ネットワーク帯域を圧迫するため、
ゲームサーバから見ると「遅い」という状況になり得ます(´-ω-)


まあ、これらはB鯖で発生している現象・・・主にアイテムロストから推測したもので、
実際にはゲームサーバを増やすことで解決する可能性もあるのですが、
Gほーさんの緊急対応を見ていると、おそらくデータ側だろうなと

ragnarokonline.gungho.jp

ブースターチケットを使った方はわかると思いますが、
NPCと会話すると、大量にレベルアップエフェクトが出ると思います
ざっくりいえば、あのエフェクト分だけ「データの書き込み」が発生しているわけです(lll゚Д゚)

もちろん、それを一括で行えるように、
クライアントとサーバの間で実装を考えるのがベストで、たとえば先日のY鯖だと、
名前にコードをつけることで、自動的にキャラをセットアップしていました

あれはまさに、レベルアップ時のデータ書き込み頻度を最小限に抑える手だと思いますが、
テスト的な状況だから許された手であって、既存ゲームサーバの仕様の範囲だと、
ああいったブースターチケットの動作にするしかなかったんだろうな・・・と
(新キャラだけでなく、既存のキャラも使えるので、その状況にあわせて処理を変えないといけない)

なぜ、データベースサーバは簡単に強化できないのか?

データベースに限らないのですが、サーバを強化する方向性は大きく二つです
つまり、「サーバの数を増やす」か、「サーバ自体のスペックを上げる」か、です

これは一般的な話になりますが、データベースサーバの場合、
このどちらも難しいのです(´-ω-)

まず、「サーバの数を増やす」方向性ですが、
先ほども書いたように、データの書き込み先は一つでないと、
それぞれのサーバで保持データが変わってしまいます

なので、書き込みサーバは一つで、読み出すサーバを並列化するのが一つの手なのですが、
残念ながら、MMORPGの場合は圧倒的に書き込みが多いので、
あまり意味がありません(´・ω・`)

ならば、全体を一つのデータベースで管理するのではなく、
何らかの基準で分割すればいいのでは・・・と思うかもしれませんが、
それがまさに「ワールド」の概念でございます

逆に言えば、MMORPGにおけるデータベース分割の最小単位が「ワールド」なので、
一つのワールドに大量のデータが存在しても、
それ以上データを分散できないことになります*4

だとすると、次の方向性は「スペックの強化」になるのですが・・・

ちょっと踏み込んだ話をすると、最近のサーバは「仮想化」という技術により、
物理的なサーバ一つに、論理的に複数のサーバを入れているケースが多いです
Gほーさんの技術資料にも、そのような記述があります

この場合、設定を変えて再起動することにより、
CPUのコア数やメモリ量を変えることができるのですが、
いずれにせよ、サーバを止める必要があるので、メンテナンスは必要になります(´-ω-)

しかし、データベースサーバはその特性から、
仮想化によるオーバーヘッド・・・処理の無駄を許容できないので、
物理的なサーバを使っている可能性があります

その場合、移行先の新しいサーバを用意する必要があり、
そこに莫大なデータを移行して・・・と、かなり面倒なメンテナンスが必要になります

以前、ワールド統合で長時間メンテナンスに入りましたが、
そこまでではないにせよ、相応の長いメンテナンスが必要と推測されます
(データの書き込みには時間がかかる・・・ということを思い出してください)

そもそも、今のB鯖の状況が恒常的なものなのか、
一時的なものなのか、まだ判断できない状況です
そういった状況で、コストのかかるサーバ移行は難しいだろうな・・・と(´-ω-)

「いや、ユーザーのためにやれよщ(゚Д゚щ)」というのはわかるのですが、
現状は「ユーザーが移動した」のであって、「ユーザーが増えた」わけではないので、
Gほーさんから見た利益は増えてないわけです

このあたりは今回の話から逸脱するのでこの辺にしますが、
ゲームに限らず、データベースの移行はとにかく面倒・・・と覚えておいてください

「昔」と「今」の違い

最後に、「昔のユーザー数に戻っただけなのに、サーバが耐えられないのは、
サーバをケチっているからだ」という言説に反論して終わりにしましょう...φ(・ω・`)

これは単純に「1キャラに対応するデータが大量になったから」です

先ほども書いたように、「ログインしたときに復元される情報」は、
全てデータベースに保存しなければなりません

  • ブレスやIA等、バフ・デバフの状態と効果時間(昔はサーバ移動で切れていた)
  • 各種課金アイテムの状態と効果時間
  • スキル取得状況(3次職になってスキル数が増えている)
  • スキルショートカット(以前はPCに保存していたが、今はキャラ単位で持っている)
  • エストウィンドウ(進行できるクエストの数が増え、キルカウントなどの概念が追加)
  • アイテムの属性(今は「衣装」「武器」等で別管理されている)
  • 「衣装」という概念(キャラに紐付く装備情報が増えている)
  • 称号
  • メール

思いつくだけでも、これだけの情報が変わっているわけで、
当然保存するデータも大量になっているわけです(lll゚Д゚)

逆に言えば、重力がこれだけ「改善」を続けている・・・ということでもあります
古いシステムを改修するのは大変なことですが、
それでもなんとか新しい機能を追加しようとしているのは評価して良いかと

まとめと次回予告

ということで今回は、MMORPG特有のサーバ事情について書いてきました...φ(・ω・`)

もちろん、「だから仕方ないんだ」といいたいのではなく、
「限られたリソースの中でいろいろ手を打っているはずなので、
あまり中の人をいじめないであげて」
とお願いしたいのです

私もエンジニアなので、ユーザーからのこういった不満は恐怖でしかありません
プロとしていろいろ手を考えてはみても、
突発的な環境の変化に耐えられない・・・というのはどうしてもあります*5
(TVで紹介されたサイトがダウンするとか・・・)

ROが古いシステムなのは事実ですが、
開発が放棄されているわけではありません

プレイヤー側でできる範囲で、協力してあげられるといいかな・・・と
個人的には思ってますし、今回の記事はそういった協力の一つになればと思っています

強いていえば、ワールド倉庫の実装で、
人が集中することはある程度予見できていたはずなので、
ワールドの接続数や登録数を制限するって手はあったと思います

FF14アズールレーンはワールド単位で人を絞っており、
それでうまく分散できているのですが、
ROのシステムは古いため、それができないのかもしれません(´・ω・`)


ということで、「重くなる原因」については以上ですが、
これをふまえて後編は「アイテムがロストする原因」を考えてみます...φ(・ω・`)


<2018/9/14追記>
後編を追加しました(´・ω・)っ

netgamer.hateblo.jp



<おまけ>

先ほどの技術書を書いた方が、まさに今月新しい本を出すようですΣ(・ω・ノ)ノ

クラウドゲームをつくる技術 ──マルチプレイゲーム開発の新戦力

クラウドゲームをつくる技術 ──マルチプレイゲーム開発の新戦力

早速ポチります...φ(・ω・`)

*1: できなくはないですが、そういった「外からの推測による言及」は無意味だと思うので・・・(´-ω-) なにが「正しい」のかは、会社の事情や環境、考え方によって違うもので、「正論は正しいかもしれないが、正論で殴りつけることが正しいとは限らない」のです

*2: エンジニア向けに厳密にいえば、データの更新通知を受け取るAPIサーバ層と、本来的な意味でのDBサーバ・・・MySQLとかOracleとか・・・の組み合わせ

*3: HDDだと遅すぎるので、最近はたぶんSSD

*4: 厳密にいえば、さらに分割する方法はあって、ワールドの概念がないスマホゲーはそのような仕組みを採用していたりするのですが、それはそれで別な設計上の問題が発生するので、ROで採用しているかはわかりません いずれにせよ、「ゲームサーバから見たデータベースサーバが論理的に一つ」であることは変わりません

*5: まさに最近、災害が頻発してインフラに問題が起きていますが、インフラもサーバも「動いているのが当たり前で、動かないと猛烈に叩かれる」ものです 中の人は必死に戦っていたとしても、それが現実です・・・c(・ω・`c )っ