複数サーバーで 1 つのワールド
複数の Storia サーバーで 1 つのワールドを分担して動かし、プレイヤーは読み込み画面なしでサーバー間を移動します。
いまは単体のサーバーで動かしていますか?いつ・どうやって移るかは 1 台から Cluster へ を見てください。
Version
Storia Cluster は Storia 26.2-2 以降に入っています。最初の 26.2 には入っていません。ワールドを Cluster に 移す前に、バックアップを取ってください。
Storia Cluster は、1 つのワールドを複数の Storia サーバー(Storia Worker)で分担します。各ワーカーは、自分のプレイヤーがいる場所の チャンク・モブ・回路・プレイヤーを動かします。プレイヤー同士が近づくと、お互いのチャンクが見える前にエリアごと同じワーカーに まとめるので、1 つの場所が 2 台に分かれることはありません。ワーカー間の移動は Storia Proxy を通して読み込み画面なしで行われ、 インベントリ・進捗・統計もそのまま引き継がれます。
プレイヤー --> Storia Proxy --> Storia Worker A --\
\-> Storia Worker B ---> Storia Relay:ワールドと、どこを誰が動かすか
\-> Storia Worker C --/
それぞれの役割#
| プログラム | Cluster での役割 |
|---|---|
| Storia Relay | まとめ役。ワールド(普通の Anvil 形式)、プレイヤーデータ、共有データを保存し、どのワーカーがどこを動かすかを決め、プレイヤーをワーカー間で均等にします。 |
| Storia Worker | 担当する場所を動かします。自分ではワールドを持たず、チャンクは Relay から読み書きします。 |
| Storia Proxy | 入り口。プレイヤーを正しいワーカーに送り、Relay の指示で別のワーカーへ切り替えます。 |
ワールドの分け方#
- ワールドを 32 × 32 チャンク(リージョンファイル 1 つ分)のセルに分けます。1 つのセルを動かせるのは 1 台だけで、 割り当ては Relay が決めます。
- 各ワーカーは毎秒、プレイヤーに見えているセルを報告します。見えている範囲が接するプレイヤー同士は、見えているもの全部と一緒に 必ず同じワーカーに置かれます。目安として、約 1,000 ブロック以内にいるプレイヤーは同じワーカーになります。
- 10 秒ごとに、偏りが減るなら、一番忙しいワーカーから一番空いているワーカーへグループごと移します。
- 回路は分けません。 レッドストーン・ピストン・ホッパー・レールなどが、人が 10 分以上いた場所のセルの境目にあると、 2 つのセルをつなぎ、常に同じワーカーで動かします。つながりは再起動しても残ります。
ワーカー間で共有されるもの#
- 時刻・天気・ゲームルール(1 台が基準になり、どのワーカーでの変更も全体に届きます)。
- スコアボード(目的・得点・チーム)、地図の ID と中身、コマンドストレージ。
- プレイヤーデータ・進捗・統計。同時に持てるのは 1 台だけで、次のワーカーは前のワーカーが保存し終えてから読み込みます。
導入#
必要なもの:Storia Relay 1 つ、Storia Worker 2 台以上、Storia Proxy 1 つ。すべて同じリリースの ものを使います。各ワーカーには、普通の Storia サーバーと同じくらいの CPU と RAM が必要です。
- Relay:
relay.propertiesにsecretを設定し、ワールドをcluster-world/に置きます。Storia Relay を参照。 - ワーカー:各ワーカーの
storia.ymlにcluster.coordinator、ワーカーごとに違うcluster.node-name、Relay と 同じcluster.secretを設定します。新しいワーカーは初回起動時に Relay からワールドの設定を取り寄せるので、 ワールドをコピーする必要はありません。ワーカーは Velocity のバックエンドです(config/paper-global.ymlのproxies.velocity)。Storia Worker を参照。 -
Storia Proxy:
velocity.tomlにワーカーを node-name と同じ名前で登録して modern フォワーディングを使い、storia-proxy.tomlに[cluster]を設定します。[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 経由の古いクライアントでは、 普通のサーバー移動(短い読み込み画面)になることがあります。
- プラグインはワーカーごとに別々に動きます。プラグイン自身のデータ(残高・保護範囲など)は プラグイン API で共有できます。
- Folia には
/scoreboardと/teamコマンドがありません。共有スコアボードが変わるのは、deathCountなどの自動で 数える目的と、ほかのサーバーから持ってきたスコアボードだけです。 - ここまでのテストはワーカー 2 台・少人数です。問題があれば GitHub に報告してください。