ドキュメント › Storia Cluster

複数サーバーで 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 が必要です。

  1. Relay:relay.properties に secret を設定し、ワールドを cluster-world/ に置きます。Storia Relay を参照。
  2. ワーカー:各ワーカーの storia.yml に cluster.coordinator、ワーカーごとに違う cluster.node-name、Relay と 同じ cluster.secret を設定します。新しいワーカーは初回起動時に Relay からワールドの設定を取り寄せるので、 ワールドをコピーする必要はありません。ワーカーは Velocity のバックエンドです(config/paper-global.yml の proxies.velocity)。Storia Worker を参照。
  3. 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 に報告してください。