2023年 ConoHa AdventCalendar 9日目

大規模企画とConoHaとMinecraftサーバーの話

2023-12-09

やぁ

Qiitaに書くほどの技術系の記事でもないなぁと思ったので, 昔サクッと作ったこのブログページに書くことにします!!

何をしたのか

ゲーム実況者さんの視聴者参加型の花火大会企画のサーバー管理をしていました。
元々は全員参加できる企画...の予定だったのですが、 Minecraftのサーバーの仕様上100人ちょいが同時に同一のサーバーに接続しようとすると、とんでもない負荷になりさらに愉快犯でDosも飛んでくるなど... ConoHaさんを借りている以上ご迷惑をおかけするわけにはいかず...

最終的な対応

結局、最後にはNodeBalancer用いて複数サーバーに分散させ、オリジンのIPアドレスの秘匿化、Dos攻撃が来た際はサーバーの切り替えという対応を取りました... (結局これが一番早い)

負荷やらDos攻撃やらConoHaさんにはその節はご迷惑をおかけしました🙇‍♀️🙇‍♀️🙇‍♀️

最終的に初日の開催は途中で切り上げ、その後上の対応を取ったのち
3日間の抽選参加に切り替え、各日ごとにサーバーとIPアドレスを変更
という対応も取りました。
(急遽抽選システムを作ったのもいい思い出です...)

当初の環境

Minecraft 1.15.1
サーバーソフトウェアはPaperを使用
※当時のサーバー環境に最適化するためにPaperは独自に若干改造したものです。

苦悩とあれこれ

ここからは完全に当時の苦悩を書き綴ったものです。
面白いのはここまでなので、興味ない方はブラウザバックしちゃっても大丈夫です。
どうしても読みたい暇な方はぜひお付き合いください。

時は2020年8月某日...
企画の初日...ここまで制作するのにおよそ1,2ヶ月、
作ってる時は全く問題がなかったのです。
本当に全く問題なく順調だったのですが...
いざ公開すると... 問題が起こりました。

1. エンティティの問題

はい、これは盲点でした。
花火大会ということで花火を打ち上げるポイントを全てアーマースタンド、
つまりエンティティで設定していたのですが、これが参加数が増えるにつれてとんでもない負荷に...
あっという間にCPU使用率は100%(Minecraftサーバーはシングルスレッドで動作するので1コア分)に...
さらにプレイヤーも当然エンティティなのでどんどんTPS(Tick Per Second, 1秒間に行われるサーバーの処理の回数の単位 通常時は20)も下がっていくなど最悪な状況でした。
十分なメモリを用意していた...はずだったのですが、あそこまで一気に人が入ってくるのは想定外でした...
これは大きな反省点です。

解決策

花火の打ち上げポイントの指定方法をアーマースタンドからプラグイン制御に変更。
プレイヤーを複数のサーバーへ分散(のちの項目で詳しく)

2. DoS DoS, とにかくDoS

もうこれはなんとも言えないです。
明らかに企画と知ってDoS宣言をしてきてまでDoS攻撃をしてくるのが1名、他にも流れ弾なのか他からもDoS, DDoS

これはこれまでの参加型企画でも多少来ていたには来ていたのですが、ここまでしっかりと攻撃がくるのは想定外でした。
実況者さん...有名すぎて妬まれてたんですかね!! ですよね!! きっと!!
(本当に映像編集技術などとんでもなくすごい方です)

解決策

オリジンサーバーのIPの秘匿化を強化
サーバーを分散、切り替え可能に(のちの項目で詳しく)

サーバーとプレイヤーの分散

さて最終的にどうなったかというと...

プレイヤー ----> NodeBalancer -----> BungeeCord1 ----> サーバー1 / サーバー2(BungeeCordにより振り分け)

プレイヤー ----> NodeBalancer(上と同一) -----> BungeeCord2(NodeBalancerにより振り分け) ----> サーバー3 / サーバー4(BungeeCordにより振り分け)

運営チーム -----> BungeeCord3 -----> サーバー1 / サーバー2 / サーバー3 / サーバー4

NodeBalancerとは

わかりにくいですが、こういう構成になりました。

問題はこうすると各サーバーごとにプレイヤーデータの不整合が起きます...
そこで、プレイヤーデータを各サーバー間で非同期に同期(?)することにしました(語彙力)

早い話、Minecraftサーバーはシングルスレッドで動作する...とはいえSpigotプラグイン上で別スレッド上で非同期に処理することができない、というわけではないのです。
そこでサーバーから退出時にプレイヤーのインベントリ(持ち物)や座標などの情報をデータベースに保存、参加時に読み込みとすることで各サーバー間の不整合を極力なくすようにしました。

まとめ

3年前の出来事を記事にしようと思った時、想像以上に記憶が飛んでいて驚きました。
私も歳を取ったんですね...
当時より安くてすぐに始められるVPSというのは随分と増えたものですが、ConoHaの知名度というものはすごいもので、実況者さん他あまりこういうVPSなどの事情に詳しくない方に提案する際に他のサービスだと、どうも怪しまれることが少々あるのですが、
ConoHaだと、「あぁConoHaね」」と事がスムーズに進むので、今でもConoHaを企画の開発のサーバーとして提案することが多々あります。
こういう意味でもConoHaさんには本当にお世話になってるなぁと常々感じています。

こんな感じで語彙力文章力のない駄文ですが、
以上で! (ここでmdファイルは100行目)