ドキュメント › Storia Cluster (Beta)

複数サーバーで 1 つのワールド

ベータ版。複数の Storia サーバーで 1 つのワールドを分担して動かし、プレイヤーは読み込み画面なしでサーバー間を移動します。

Beta

Storia Cluster は 26.2-2-beta で追加された、テスト中の機能です。それより前のリリース(26.2、26.2-1-beta)には 入っていません。試す前にワールドをバックアップし、唯一のコピーでは動かさないでください。

Storia Cluster は、1 つのワールドを複数の Storia サーバー(ノード)で分担します。各ノードは、自分のプレイヤーがいる場所の チャンク・モブ・回路・プレイヤーを動かします。プレイヤー同士が近づくと、お互いのチャンクが見える前にエリアごと同じノードに まとめるので、1 つの場所が 2 台に分かれることはありません。ノード間の移動は Storia Proxy を通して読み込み画面なしで行われ、 インベントリ・進捗・統計もそのまま引き継がれます。

プレイヤー --> Storia Proxy --> ノード alpha --\
                            \-> ノード beta  ---> Storia Relay (cluster=true):ワールドと、どこを誰が動かすか
                             \-> ノード gamma --/

それぞれの役割#

プログラム Cluster での役割
Storia Relay(cluster=true) まとめ役。ワールド(普通の Anvil 形式)、プレイヤーデータ、共有データを保存し、どのノードがどこを動かすかを決め、プレイヤーをノード間で均等にします。
Storia(各ノード) 担当する場所を動かします。自分ではワールドを持たず、チャンクは Relay から読み書きします。
Storia Proxy 入り口。プレイヤーを正しいノードに送り、Relay の指示で別のノードへ切り替えます。

ワールドの分け方#

  • ワールドを 32 × 32 チャンク(リージョンファイル 1 つ分)のセルに分けます。1 つのセルを動かせるのは 1 台だけで、 割り当ては Relay が決めます。
  • 各ノードは毎秒、プレイヤーに見えているセルを報告します。見えている範囲が接するプレイヤー同士は、見えているもの全部と一緒に 必ず同じノードに置かれます。目安として、約 1,000 ブロック以内にいるプレイヤーは同じノードになります。
  • 10 秒ごとに、偏りが減るなら、一番忙しいノードから一番空いているノードへグループごと移します。
  • 回路は分けません。 レッドストーン・ピストン・ホッパー・レールなどが、人が 10 分以上いた場所のセルの境目にあると、 2 つのセルをつなぎ、常に同じノードで動かします。つながりは再起動しても残ります。

ノード間で共有されるもの#

  • 時刻・天気・ゲームルール(1 台が基準になり、どのノードでの変更も全体に届きます)。
  • スコアボード(目的・得点・チーム)、地図の ID と中身、コマンドストレージ。
  • プレイヤーデータ・進捗・統計。同時に持てるのは 1 台だけで、次のノードは前のノードが保存し終えてから読み込みます。

導入#

必要なもの:Storia Relay 1 つ、Storia サーバー(ノード)2 台以上、Storia Proxy 1 つ。すべて同じリリースのものを使います。 各ノードには、普通の Storia サーバーと同じくらいの CPU と RAM が必要です。

1. Relay(まとめ役)#

relay.properties:

port=25590
secret=長い合言葉を決める
cluster=true
cluster-world=cluster-world

cluster-world にワールドを置きます(level.dat、dimensions/、players/ などがある普通のワールドフォルダ)。 これ以降、Cluster が書き込むのはこのコピーだけです。

2. 各ノード#

ワールドを、region・entities・poi フォルダを除いて各ノードにコピーします(level.dat、ワールド生成の設定、 データパックは必要ですが、チャンクは Relay から読みます)。storia.yml に次を追加します。

cluster:
  enabled: true
  coordinator: "relay-host:25590"
  node-name: alpha        # ノードごとに別の名前。velocity.toml のサーバー名と同じにする
  secret: 長い合言葉を決める

ノードは普通の Velocity のバックエンドと同じように設定します。server.properties で online-mode=false、 config/paper-global.yml で proxies.velocity.enabled: true とプロキシのフォワーディング用の秘密鍵を設定します。

3. Storia Proxy#

velocity.toml に、各ノードを cluster.node-name と同じ名前で登録し、modern フォワーディングを使います。

player-info-forwarding-mode = "modern"

[servers]
alpha = "10.0.0.11:25565"
beta = "10.0.0.12:25565"
try = ["alpha", "beta"]

storia-proxy.toml:

[cluster]
enabled = true
coordinator = "relay-host:25590"
secret = "長い合言葉を決める"

Relay、ノード、プロキシの順に起動します。Relay のコンソールの status とノードの /storia cluster でどこを誰が 動かしているかを、/storiaproxy cluster でプロキシから見た状態を確認できます。

停止と再起動#

  • ノードで /stop すると、先にそのノードのプレイヤーをほかのノードへ移してから(キックなし)、保存して止まります。
  • Relay がしばらく止まっても、ノードは動き続け、書き込みをローカルの cluster-spool/ に貯めます。Relay が戻ると 送ります(ノードを再起動した後でも)。
  • すべてのノードが止まると、普通のサーバーと同じくプレイヤーは切断されます。

このベータの制限#

  • 読み込み画面なしの移動は Minecraft 26.1・26.2 のクライアントが対象です。ViaVersion 経由の古いクライアントでは、 普通のサーバー移動(短い読み込み画面)になることがあります。
  • プラグインはノードごとに別々に動きます。プラグイン自身のデータはまだ共有されません。
  • Folia には /scoreboard と /team コマンドがありません。共有スコアボードが変わるのは、deathCount などの自動で 数える目的と、ほかのサーバーから持ってきたスコアボードだけです。
  • ここまでのテストはノード 2 台・少人数です。問題があれば GitHub に報告してください。