複数サーバーで 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 に報告してください。