18
中嶋 謙互(取締役CTO安田 京人(ミドルウェア事業部部長) 新しくなったモノビットエンジンを使って 10万人規模のサーバを構築するノウハウを公開! モノビットエンジン勉強会 in サイバーコネクトツー様 株式会社モノビット 第二部 MRS/MUN 10 万接続サーバ構成実例 安田)

【モノビットエンジン勉強会inサイバーコネクトツー】 第二部「MRS/MUN 10万接続サーバ構成実例」

Embed Size (px)

Citation preview

Page 1: 【モノビットエンジン勉強会inサイバーコネクトツー】 第二部「MRS/MUN 10万接続サーバ構成実例」

中嶋 謙互(取締役CTO)安田 京人(ミドルウェア事業部部長)

新しくなったモノビットエンジンを使って10万人規模のサーバを構築するノウハウを公開!

モノビットエンジン勉強会in

サイバーコネクトツー様

株式会社モノビット

第二部

MRS/MUN 10万接続サーバ構成実例(安田)

Page 2: 【モノビットエンジン勉強会inサイバーコネクトツー】 第二部「MRS/MUN 10万接続サーバ構成実例」

1

■ MRSゲームサーバ構成例

MRSサーバにおける最小構成・ mrs_room : MRSで提供している最小構成のルーム管理サーバ。

ルーム入退室制御と、ルーム内外でのデータ送信を可能にする。

Global Section

Private Section

MRS Server Machine

MRS Server Process

MRS Server

mrs_room

mrs_room がルームの管理、ルーム内外のデータ送信を一括制御

Internet

・・・

MRSClient

MRSClient

・・・

MRS Client Machine

MRS Client Process

MRS Client

MRSClient

MRSClient

MRSClient

MRSClient

MRSClient

MRSClient

MRSClient

mrs_room

MRS Server

mrs_room ・・・mrs_room

・・・

MRS Server

mrs_room mrs_room ・・・

MRS Server

mrs_room mrs_room ・・・

CネイティブのAPIを用意言語バインディングで多言語対応

Frontend MRS Room Servers

Page 3: 【モノビットエンジン勉強会inサイバーコネクトツー】 第二部「MRS/MUN 10万接続サーバ構成実例」

2

■ MRSゲームサーバ構成例

特徴・リアルタイム処理を必要とされる部分について、簡単なデータ送受信とルーム管理機能を提供・簡単な通信対戦、小規模ネットワークゲームであれば実装可能・サーバ、クライアントともにCネイティブのAPIを用意しており、言語バインディングにより、多種多様な

プログラミング言語に対応可能(弊社サンプルでは C, C++, C#, Java, JavaScript, PHP を用意)・ルームを跨いだ通信ができないので注意が必要

リアルタイムサーバ間、サーバ⇔クライアントとの接続・TCP/UDP/WebSocketによるソケット接続が可能で、完全同期通信を実現。

なぜAPIがCネイティブである必要があるのか・リアルタイム通信を行うゲームでは、サーバサイドで多くの処理を行う必要があるので、サーバプログラムの

実行速度が大変重要・そのため、例えWebブラウザで動かすようなゲームであっても、Web言語よりも数十倍の実行効率を持つ

C++言語でサーバー側の処理を記述する事により、素早い通信を実現し、なおかつサーバー台数を大幅に削減可能

・かつ、C++言語で書かれたライブラリをCネイティブのAPIとしてWrapすることで、より多くの言語バインディングに対応することを可能にしている

Page 4: 【モノビットエンジン勉強会inサイバーコネクトツー】 第二部「MRS/MUN 10万接続サーバ構成実例」

3

■ MRSゲームサーバのコーディング例

簡単な送受信サンプルの実装例・MRSのコードは至ってシンプルで、簡単なECHO送受信のコードをCで記述すると以下のように書けます。

クライアント側 サーバ側

#include <mrs.hpp>bool g_Run = true; // ループフラグ

// 接続後処理void onConnect( MrsConnection _con, void* _data ) {

// ECHO 送信mrs_write_record( _con, MRS_RECORD_OPTION_NONE,

0x01, “Hello, MRS!”, strlen(“Hello, MRS!”) + 1 ); }

// ECHO受信後処理void onRead( MrsConnection _con, void* _data, uint32 _seq, int16 _option,

uint16 _type, const void* _payload, uint32 _len ) {// 受信結果表示printf(“data=%s, datalen=%d”, (const char *)_payload, _len); // ループ終了g_Run = false;

}

//メイン処理int main() {

// 初期化mrs_initialize();// 接続処理MrsConnection client = mrs_connect(MRS_CONNECTION_TYPE_TCP,

“192.168.1.253”, 3456, 10000 );// コールバック設定mrs_set_connect_callback( client, OnConnect );mrs_set_read_record_callback( client, OnRead );// ループ処理while(g_Run) {

mrs_update();mrs_sleep(1);

}// 終了処理mrs_close(client);mrs_finalize();return 0;

}

#include <mrs.hpp>

// 接続後処理void onConnect( MrsServer _server, void* _data, MrsConnection _client ) {

// コールバック設定mrs_set_read_record_callback( _client, OnRead );

}

// ECHO受信後処理void onRead( MrsConnection _con, void* _data, uint32 _seq, int16 _option,

uint16 _type, const void* _payload, uint32 _len ) {// ECHO返信mrs_write_record( _con, _option, _type, _payload, _len);

}

//メイン処理int main() {

// 初期化mrs_initialize();// リスニング開始処理MrsConnection server = mrs_server_create(MRS_CONNECTION_TYPE_TCP,

“192.168.1.253”, 3456, 2000 );// コールバック設定mrs_set_new_connection_callback( server, OnConnect );// ループ処理while(true) {

mrs_update();mrs_sleep(1);

}// 終了処理mrs_close(server);mrs_finalize();return 0;

}

Page 5: 【モノビットエンジン勉強会inサイバーコネクトツー】 第二部「MRS/MUN 10万接続サーバ構成実例」

4

■ 10万人規模のサーバ構成

まず性能分析から・サーバプロセス1つにつき、MRS単体で以下のレコード処理性能(ECHO送受信性能)を持ちます

TCP では 54万レコード/秒(約60Mbps)

UDP では 35万レコード/秒(約22.4Mbps)

・原則として、上記を基準にプロセス内の処理性能を考慮してサーバ構成を検討すれば問題ありません。

耐用しうる同時接続数について・接続数の限界は、理論上「2の64乗」までは可能です。・上記の通信処理性能と合わせて考えれば、例えばMMOなど「同時接続10万接続」が要求される場合でも

余裕で捌けます。・なお、公式の無料頒布版では「同時接続者数制限 100CCU まで」の制約がありますが、弊社との契約により

この上限を段階的に開放することができますので、別途ご相談ください。

Page 6: 【モノビットエンジン勉強会inサイバーコネクトツー】 第二部「MRS/MUN 10万接続サーバ構成実例」

5

■ 10万人規模のサーバ構成

サーバインスタンスの役割構成を設定する場合・MRS自体はサーバ構成情報を持っていないため、別途データベースサーバなどを設けて、サーバの役割構成の

情報を付与する必要があります。・付与されたインスタンス情報はWebサーバ(mrs_pusher)を介してクライアントに通知します。・手順は以下の通りです

1. あらかじめKVSやデータベース等のデータストアに接続サーバのアドレス情報を退避しておく2. MRS クライアントから「最初に接続するサーバ」のアドレス情報を、下図 a → b → c の順に取得3. 取得した情報により、「最初に接続するサーバ」との情報の送受信(下図 d)4. MRS クライアントから「次に接続するサーバ」 のアドレス情報を、下図 a → b → c の順に取得5. 取得した情報により、「次に接続するサーバ」との情報の送受信(下図 e)

Web Server

mrs_pusher

Database

database

First Server

mrs_room

Second Server

mrs_room

MRS Client

MRS Client

a

cd e

b

Page 7: 【モノビットエンジン勉強会inサイバーコネクトツー】 第二部「MRS/MUN 10万接続サーバ構成実例」

6

■ 10万人規模のサーバ構成

サーバインスタンスの役割構成の実装例・MRSクライアントから、一般的なゲームサーバのサービス(ロビーサーバ, マッチングサーバ, バトルサーバ)

などに接続する場合の構成例は以下の通りです。

Page 8: 【モノビットエンジン勉強会inサイバーコネクトツー】 第二部「MRS/MUN 10万接続サーバ構成実例」

7

■ 最小限のMUNゲームサーバ構成例

MUNサーバにおける最小構成・ mun_resolver : 接続する mun_proxy への接続アドレス通知・ mun_proxy : ルーム外における一連の通信制御(ルーム入退室, ルーム/プレイヤー検索, etc...)・ mun_room : ルーム内における一連の通信制御(RPC, オブジェクト同期, etc...)・ mun_master : mun_proxy, mun_room の情報を統制管理する、オンメモリ上のデータベース制御

Page 9: 【モノビットエンジン勉強会inサイバーコネクトツー】 第二部「MRS/MUN 10万接続サーバ構成実例」

8

■ 最小限のMUNゲームサーバ構成例

特徴・リアルタイム処理を必要とされる部分について、マッチング処理からゲームシーンの完全同期までを提供

簡単な小規模ネットワークゲーム、MOレベルのネットワークゲームなど運用可能・MUNを利用することにより、サーバサイドを一切コードを書かずに、クライアントサイドのみ実現可能・MRS同様、ルームを跨いだ通信ができないので注意が必要

リアルタイムサーバ間、サーバ⇔クライアントとの接続・内部エンジンで MRS を利用しているので、特性は MRS に準じる・MUN では MRS-API を Unity 向けに C# でバインディングして、TCP/UDPによるソケット接続が可能

MUN ルームサーバの制限・1ルームに入室できるプレイヤー人数は 255 人まで、1サーバプロセスで十分に捌ける人数は3万クライアント程度・提供するゲームの規模に応じて、mun_room サーバのスケールアウトが必要

Page 10: 【モノビットエンジン勉強会inサイバーコネクトツー】 第二部「MRS/MUN 10万接続サーバ構成実例」

9

■ MUNのコーディング例

簡単な送受信サンプルの実装例・MUNのコードも至ってシンプルで、簡単なECHO送受信のコードを記述すると以下のように書けます。

クライアント側

using System;using MonobitEngine;

namespace MUN_EchoSample {class EchoSample : MonobitEngine.MonoBehaviour {

void Start() {MonobitNetwork.ConnectServer(“EchoSample”); // サーバ接続

}

void Update() {if( !MonobitNetwork.isConnect ) return;if( !MonobitNetwork.inRoom ) {

MonobitNetwork.JoinOrCreateRoom(“MyRoom”, new RoomSettings(), null); // ルーム入室}

}

// ルーム入室時の処理void OnJoinedRoom() {

if( !MonobitNetwork.isHost ) {monobitView.RPC(“SendMsg”, MonobitTarget.Others, MonobitNetwork.player, “Hello, MUN!” ); // ECHO送信

}}

// ECHO送信の受信[MunRPC]void SendMsg(MonobitPlayer sender, string msg) {

UnityEngine.Debug.Log(“SendMsg : “ + msg ); // 受信結果表示monobitView.RPC(“EchoMsg”, sender, msg ); // ECHO返信

}

// ECHO返信の受信[MunRPC]void EchoMsg(string msg) {

UnityEngine.Debug.Log(“EchoMsg : “ + msg ); // 返信結果表示MonobitNetwork.DisconnectServer(); // サーバ切断

} }

}

Page 11: 【モノビットエンジン勉強会inサイバーコネクトツー】 第二部「MRS/MUN 10万接続サーバ構成実例」

10

■ MUNによる10万人大規模サービスの構成

MUNサーバで「同時接続者数10万」を実現するには・MUNは原則として、以下の用途におけるネットワークゲームに適しています。

a) オンライン対戦型のターン制カードゲーム、パズルゲームなどb) MO(中小規模の、参加人数限定型マルチプレイヤーオンラインゲーム)c) MOBA(参加人数限定型の戦略対戦型オンラインゲーム)

・1つの MUN サーバセットあたりで、同時接続、およびルーム内各種メッセージを捌けるのはおおよそ3万人程度です(弊社調べ:1ルームあたり、秒間平均200メッセージの送受信を想定)。

・10万人規模の同時接続者数を捌くためには、MUNサーバの横展開(スケール)が必要になりますが、MUN のサーバセットは密結合のサーバプロセスで構成されているため、スケールする場合、このサーバセットを1組として複数のサーバセットを並列配置することになります。

・サーバセットをスケールすることにより、実質的に無限数のMUN クライアントに対し、同時接続処理を捌けます。・次ページで、具体的なサーバ構成例を示します。

MUN Room

MUN Proxy

mun_proxy ・・・mun_resolver

MUN Master

mun_master

MUNResolver

mun_proxy mun_room ・・・mun_room

「MUN サーバセット」のこの1組を単位として、複数サーバセットを並列配置する

Page 12: 【モノビットエンジン勉強会inサイバーコネクトツー】 第二部「MRS/MUN 10万接続サーバ構成実例」

11

■ MUNによる10万人大規模サービスの構成

複数の MUN サーバセットによる 10万人同時接続の実現(概略)・複数の MUN サーバセットによる、 10万人同時接続を実現するためのサーバ構成例として、以下に示します。・1つの MUN サーバセットに対して同時に捌くことのできるクライアント数は3万クライアントまでですが、若干

余裕を持たせて、サーバセットを5セット程度用意します。・どの MUN サーバセットに接続するかを管理し、クライアントを誘引するための、Webサーバを複数台用意します。

Global Section

MUN Server Machine

MUN Server Process

Internet

MUNClient

MUNClient

・・・

MUN Client Machine

MUN Client Process

Web Server

mrs_pusherdatabase

MUNClient

MUNClient

MUNClient

MUNClient

MUNClient

MUNClient

MUNClient

MUNClient

MUNResolver

mun_resolver

MUN Master

mun_master

MUN Proxy

・・・

mun_proxy mun_room

MUN Room

・・・

・・・

mun_proxy mun_room ・・・

MUNResolver

mun_resolver

MUN Master

mun_master

MUN Proxy

・・・

mun_proxy mun_room

mun_proxy mun_room ・・・

MUN Room

Private Section

MUN Server Set 1 MUN Server Set 2

・・・

Page 13: 【モノビットエンジン勉強会inサイバーコネクトツー】 第二部「MRS/MUN 10万接続サーバ構成実例」

12

■ MUNによる10万人大規模サービスの構成

複数の MUN サーバセットによる 10万人同時接続の実現(詳細)・Webサーバでは、複数の MUN サーバセット内に含まれる mun_resolver のクライアント接続アドレス情報を

事前にデータベース情報として、複数台で同一の内容を保持します。かつ、MUNクライアントは mun_resolver に接続する前にこの Web サーバに接続し、MUN サーバセットのうち「最も既存クライアントの接続数の少ない」 mun_resolver のアドレス情報を mrs_pusher で返します。

※ MUN では MRS が内包されていますので、MRSでの情報のやり取りも可能です。

・MUN サーバセットでは、MO/MOBAをはじめとする、中小規模の人数が参加するゲームルームを設置し、そこでルーム内プレイヤー同士で、RPCによるデータの送受信、キャラクタなどのオブジェクト位置情報の同期などを行います。

MUN Resolver に接続するためのアドレス情報を退避したデータベースを持つWebサーバ。MUNクライアントとのやり取りのためにmrs_pusherを利用し、かつ最もクライアント接続数が少ない、MUNサーバセットへの誘導を行なう

Web Server

mrs_pusherdatabase

MUN サーバセット自体は通常の MUN サーバとして運用するサーバのスケールアウトは、原則このサーバセットを1単位として、全体をスケールする形をとる

接続するクライアントは、適宜必要に応じたルームに入室させ、その中に所属するプレイヤー同士で、メッセージのやり取り、キャラクタの位置情報の同期、各種パラメータの共有などを行なう。

比較的セキュリティ性を求められない通信対戦/MOであればクライアントベースで開発し、セキュリティ性の高い通信対戦/MOや、複雑なロジックを必要とするMOBAなどであればサーバサイドでのプログラムを実装し、なるべく保守性・安定性に優れたシステムを構築する

Page 14: 【モノビットエンジン勉強会inサイバーコネクトツー】 第二部「MRS/MUN 10万接続サーバ構成実例」

13

■ MRS&MUN+サーバ監視システム(Mackerel)

MRS&MUNはMackerelに対応しています・MackerelのUI+APIを利用して、統括的なサーバ監視とインフラ構築の自動化が可能・ロードアベレージ、システムリソース、ネットワークリソースの監視、サーバプロセスのモニタリング、

同時利用者数(CCU)の監視などが可能。

Page 15: 【モノビットエンジン勉強会inサイバーコネクトツー】 第二部「MRS/MUN 10万接続サーバ構成実例」

14

■ MUNによるMMOサーバの提供

MUNの制約・MMOのサービス提供を視野に入れる場合、約10万人の同時接続を可能にしなければならない・しかし、MUNには「同時ルーム入室者数255人まで」という制約がある・通常のクライアント接続方法ではワールド間どころかフィールド内の同時接続すら実現できず、

MMO のサービス提供には耐えられないので、システム設計上の工夫が必要

Page 16: 【モノビットエンジン勉強会inサイバーコネクトツー】 第二部「MRS/MUN 10万接続サーバ構成実例」

15

■ MUNによるMMOサーバの提供

MUNでMMOを実現する方法1・ルームホストのクライアントが、ルームゲストのクライアント情報を集約して、「他のルームのホストに転送する」

ための専用ルームを用意する方法

この方法のメリット・デメリット・これだけで、MUNクライアントのみでのMMOのシステム自体の実現はできる・ただし、ネットワークトラフィックは尋常ではない・ネズミ式にユーザーが増えると、ホストクライアントの負荷も尋常ではなくなる

Page 17: 【モノビットエンジン勉強会inサイバーコネクトツー】 第二部「MRS/MUN 10万接続サーバ構成実例」

16

■ MUNによるMMOサーバの提供

MUNでMMOを実現する方法2・サーバ側でワールド情報を別段データベースで保存して、情報を共有する方法

この方法のメリット・デメリット・ネットワークトラフィックや、クライアントの負荷を掛けずに、MMOのシステムを実現可能・MMOのサービスのほぼすべてをサーバ内で補完できるため、安定した動作、安全な運用を可能にする・ただし、サーバサイドの知識は不可欠で、MRS-APIの知識や、mrs_pusher の利用方法など、覚えることは多い・が、総合的には方法1よりもおすすめできる方法

Page 18: 【モノビットエンジン勉強会inサイバーコネクトツー】 第二部「MRS/MUN 10万接続サーバ構成実例」

17

■ まとめ

お手軽に開発するのであれば「MUN」がおすすめです!

・何よりクライアントベースで開発できます。

・ネットワークゲームのモック、プロット開発、小規模なゲームであれば、機能として十分です。

・Unity のクライアント負荷を軽減するために実装した一部のロジックについてサーバサイドに移植したり、アプリ利用者側の操作に依存しないゲームロジックをサーバサイドに記述することも可能です。

・有償プランをお使いの場合、原則1つのサーバセットで捌けるクライアントの上限は3万程度ですが、Webサーバを伴った並列制御が可能で、同時接続者数制限は実質ほぼありません。ぜひご検討ください。

最初から本格的・大規模なネットワークゲームを作るのであれば「MRS」一択です!

・低遅延かつ高レイテンシの、最高級のネットワーク環境でゲームを実装できます。

・CベースのAPIを覚える必要がありますが、数あるネットワークライブラリの中でもかなり平易です。

・加えて、MRSの同梱サンプルや、大規模なものだと「MUNサーバ」など、有効なサンプルは揃っています。

・C/C++ 対応はもちろん、C#, JavaScript のバインディングコードも同梱しています。Cからの言語バインディングを理解しているのであれば、お客様の環境であらゆる言語に対応することもできます。