Architecture

Storia の仕組み

Storia は、連携して動く 4 つのソフトでできています。Storia サーバー 1 台だけでも完全な Minecraft サーバーです。Storia Proxy を足せばネットワークに、Storia Worker と Storia Relay を足せば 1 つのワールドを複数のマシンで動かせます。このページでは、それぞれの役割、動かす場所、やり取りする内容を説明します。

Storia Cluster の構成図プレイヤーは、Storia Proxy(ポート 25565 で待ち受け)に接続します。 Storia Proxy は、modern フォワーディングを使って、プレイヤーのいる場所を動かしている Storia Worker に送ります。 各ワーカーは共有するワールドの一部を動かします。プレイヤーが別のワーカーの場所に入ると、Storia Proxy が読み込み画面なしで移します。 ワーカーとプロキシは Storia Relay(ポート 25590 で待ち受け)に接続します。Relay はワールドを保管し、どこを誰が動かすかを決めます。通信はすべて暗号化されます。 NetworkWorkersCoordinator PlayersMC Storia Proxy:25565modern forwarding Worker Apart of the worldWorker Bpart of the worldWorker Cpart of the worldencrypted Storia Relaythe world · :25590 Storia Cluster の構成図プレイヤーは、Storia Proxy(ポート 25565 で待ち受け)に接続します。 Storia Proxy は、modern フォワーディングを使って、プレイヤーのいる場所を動かしている Storia Worker に送ります。 各ワーカーは共有するワールドの一部を動かします。プレイヤーが別のワーカーの場所に入ると、Storia Proxy が読み込み画面なしで移します。 ワーカーとプロキシは Storia Relay(ポート 25590 で待ち受け)に接続します。Relay はワールドを保管し、どこを誰が動かすかを決めます。通信はすべて暗号化されます。 PlayersMC Storia Proxy:25565modern forwarding Worker AWorker BWorker Cencrypted Storia Relaythe world · :25590
  1. プレイヤーは、Storia Proxy(ポート 25565 で待ち受け)に接続します。
  2. Storia Proxy は、modern フォワーディングを使って、プレイヤーのいる場所を動かしている Storia Worker に送ります。
  3. 各ワーカーは共有するワールドの一部を動かします。プレイヤーが別のワーカーの場所に入ると、Storia Proxy が読み込み画面なしで移します。
  4. ワーカーとプロキシは Storia Relay(ポート 25590 で待ち受け)に接続します。Relay はワールドを保管し、どこを誰が動かすかを決めます。通信はすべて暗号化されます。

4 つのソフト

それぞれに 1 つの役割があります。組み合わせると、1 つのワールドを、プレイヤーの数に合わせて何台ものマシンで動かせます。

Storia

ゲームサーバー

役割
ワールドを動かします。プレイヤー、モブ、回路、トラップ、チャンクのすべてです。Folia ベースなので、ワールドの場所ごとに別々の CPU コアで処理します。
しないこと
ほかの 3 つは必要ありません。単体で完全な Minecraft サーバーです。
動かす場所
メインのマシン(プロキシを使うなら、ゲームモードごとに 1 台ずつ)。
必要なもの
Java 25。RAM ワールドのためのワールド分の RAM と、ヒープ。
ポート
プレイヤー用の 25565(プロキシの裏に置くなら非公開のポート)。
設定
storia.yml と、いつもの Paper・Folia の設定ファイル。
ドキュメントを読む

Storia Proxy

玄関

役割
すべてのプレイヤーを 1 つのアドレスで受け付け、適切なサーバーやワーカーに送ります。Cluster では、読み込み画面なしでワーカー間を移します。サーバーリストの MOTD、自動更新のタブリスト、ネットワーク全体のメッセージを、50 個のプレースホルダーで表示します。
しないこと
ワールドを動かさないので、CPU はほとんど使いません。プラグインは Velocity 用のものを使います。
動かす場所
小さなマシンで十分。サーバーと同じ場所に置くことが多いです。
必要なもの
Java 21 以上。RAM 512 MB ほど。
ポート
プレイヤー用の 25565。
設定
velocity.toml、storia-proxy.toml。
ドキュメントを読む

Storia Worker

Cluster のサーバー 1 台

役割
共有するワールドのうち、自分のプレイヤーがいる場所(チャンク・モブ・回路・プレイヤー)を動かします。プレイヤーが 1 台に収まらなくなったら、ワーカーを足します。
しないこと
単体の Storia サーバーには足せません(Storia Relay が必要)。自分のワールドは持たず、チャンク・プレイヤーデータ・共有データは Relay から読み書きします。
動かす場所
Storia サーバーを動かせるマシンならどれでも。
必要なもの
Java 25。普通の Storia サーバーと同じくらいの CPU と RAM。ワールドのコピーは不要(Relay から設定を取り寄せます)。
ポート
プロキシ用の 25565(非公開に)。
設定
storia.yml(cluster.*)。
ドキュメントを読む

Storia Relay

まとめ役

役割
ワールドを保管し、場所ごとに動かすワーカーを 1 台ずつ決め、近づいたプレイヤーを同じワーカーにまとめ、忙しいワーカーの仕事を分け、プレイヤーを移すタイミングをプロキシに伝えます。
しないこと
ワールドのどこも自分では動かさず、Minecraft サーバーも要りません。
動かす場所
ワールド分のディスクがある、届く場所のマシン 1 台。プロキシと同じマシンでも構いません。
必要なもの
Java 21 以上。RAM 512 MB ほどと、ワールド分のディスク。
ポート
ワーカーとプロキシ用の 25590。
設定
relay.properties。
ドキュメントを読む

ワーカー間を移動するまで

ワーカー B にいる Bob が、ワーカー A にいる Alice の方へ飛んでいったときに起きること。

  1. Storia Worker

    各ワーカーは毎秒、プレイヤーに見えている場所を Relay に報告します。

  2. Storia Relay

    Bob の見える範囲が Alice のエリアに触れそうになります。Relay は 2 人を同じワーカーにまとめると決めます。その場所のプレイヤーが多い A です。

  3. Storia Relay

    Relay はワーカー B に Bob の引き渡しを頼みます。B はインベントリ・進捗・統計・位置を保存し、準備完了を伝えます。

  4. Storia Proxy

    Storia Proxy は裏で Bob を同じエンティティ ID のままワーカー A につなぎ、接続を切り替えます。ログインし直しも、再スポーンも、読み込み画面もありません。

  5. Storia Worker

    ワーカー A は Bob のデータを Relay から読み込みます。B が動かしていたセルは解放され、A が保存された状態から引き継ぎます。

  6. Storia Worker

    Bob はそのまま飛び続けます。クライアントは、裏のサーバーが変わったことに気づきません。

プレイヤーが遊ぶまで

  1. サーバーリスト

    プレイヤーのクライアントがプロキシのアドレスに ping します。Storia Proxy は、storia-proxy.toml の MOTD に {online} などのプレースホルダーを埋めて返します。

  2. ログイン

    プロキシが Mojang でプレイヤーを認証します。Cluster では、ログアウトした場所を動かしているワーカーを Relay に聞き、そこにつなぎます。

  3. フォワーディング

    modern フォワーディングが、プレイヤーの UUID とスキンを、フォワーディング用の秘密鍵で署名してサーバーに渡します。サーバーはこれを信頼できます。

  4. プレイ中

    タブリストは毎秒、プレイヤーとネットワークのプレースホルダーで更新されます。参加・退出・移動のメッセージは全員に届きます。

  5. 移動

    別のワーカーの場所に入ると、読み込み画面なしで移ります。ネットワーク内の別のサーバー(ロビーやミニゲーム)への移動は、普通のサーバー移動です。

それぞれの接続で流れるもの

接続流れるもの保護
プレイヤー ↔ Storia ProxyMinecraft のプロトコル。移動、チャット、チャンクなど、ゲームに必要なものすべて。Minecraft 自体の暗号化(オンラインモード)。
Storia Proxy ↔ Storia サーバー・ワーカー同じ Minecraft の通信と、引き継いだプレイヤーの身元。フォワーディング用の秘密鍵で署名。サーバーとワーカーはインターネットに直接公開しないでください。
Storia Worker ↔ Storia Relayチャンク、エンティティ、プレイヤーデータ、進捗、統計、地図、スコアボード、そしてどこを誰が動かすか。合言葉から作った鍵で AES-256-GCM。合言葉そのものは送られません。
Storia Proxy ↔ Storia Relayプレイヤーをどのワーカーに入れるか、いつ移すか。同じ暗号化。接続ごとに別の鍵を使います。

何かが止まったとき

止まったものどうなるか
ワーカー(/stop)先にプレイヤーをほかのワーカーへ移してから、保存して止まります。キックされる人はいません。
落ちたワーカープロキシがそのプレイヤーを別のワーカーへ送ります。15 秒以内に、Relay がその場所を最後に保存された状態から別のワーカーに任せます。
Relayワーカーは動き続け、戻るまで書き込みをディスクで待たせます。その間、新しいプレイヤーは入れず、移動も起きません。
プロキシ戻るまで、プロキシ経由では入れません。サーバー・ワーカーとワールドは動き続け、何も失われません。
単体サーバーのマシンRAM ワールドでは、最後の同期(初期設定で 5 分ごと)以降の変更が失われます。サーバーのプロセスだけが落ちた場合は、次の起動時に RAM 上のコピーから復旧します。

よくある 3 つの構成

まずは 1 つ目から始めて、サーバーの成長に合わせてソフトを足していけます。

1

単体のサーバー

ほとんどのサーバーはこれで十分です。すべて 1 台のマシンで動かします。

PlayersStoria

Storia のみ

2

ネットワーク

複数のゲームモードを 1 つのアドレスで。タブリストとメッセージは共通です。

PlayersProxyStoria ×2

Storia Proxy + Storia

3

Cluster

1 つの大きなワールドを複数のマシンで。プレイヤーが増えたらワーカーを足します。

PlayersProxyWorker ×NRelay

Storia Proxy + Storia Worker + Storia Relay

必要なもの一覧

ソフトJavaメモリポート必要なファイル
Storia25ヒープ + RAM 上のワールド25565ワールド
Storia Proxy21 以上512 MB ほど25565なし
Storia Worker25Storia サーバーと同じくらい25565(非公開)なし(Relay からワールドの設定を取り寄せる)
Storia Relay21 以上512 MB ほど + ディスク25590ワールド

ポートはすべて変更できます。4 つのソフトは、ダウンロードページのすべてのリリースに入っています。

4 つともダウンロード