tapscrollWIKI

Cross-Server

Ein gemeinsamer Markt über ein ganzes Netzwerk — MySQL als Speicher, Redis Pub/Sub für sofortige Invalidierung.

Gavel v1.0.0Paper · Folia supported1.21 – 1.21.x

Gavels Cross-Server-Modus ist ein echter gemeinsamer Markt: Ein Angebot, das auf survival-1 entsteht, erscheint sofort auf skyblock-2, und ein Verkauf wird einmal abgerechnet, nicht zweimal.

Zwei Bausteine machen das möglich — eine gemeinsame Datenbank und ein Live-Invalidierungskanal.

Speicher

plugins/Gavel/config.yml
storage:  type: SQLITE  sqlite:    file: "gavel.db"

SQLite braucht kein Setup und ist für einen einzelnen Server richtig. Ein paar hunderttausend Zeilen verkraftet es problemlos.

MySQL (oder MariaDB) ist für ein Netzwerk erforderlich:

YAML
storage:  type: MYSQL  mysql:    host: "127.0.0.1"    port: 3306    database: "gavel"    username: "root"    password: ""    table-prefix: "gavel_"    properties:      useSSL: false      allowPublicKeyRetrieval: true      characterEncoding: "utf8"    pool:      maximum-pool-size: 8      minimum-idle: 2      connection-timeout-ms: 8000      idle-timeout-ms: 300000      max-lifetime-ms: 1200000

table-prefix entscheidet, wer einen Markt teilt

Server mit gleichem Prefix teilen einen Markt. Server mit unterschiedlichen Prefixen haben getrennte Märkte in derselben Datenbank. Beides ist gültig — eine Survival- und eine Skyblock-Wirtschaft sollte man meist nicht zusammenlegen — aber die beiden versehentlich zu verwechseln, ist der Fehler, der sich schwer rückgängig machen lässt.

Die Pool-Standardwerte passen zu einem Netzwerk aus wenigen Servern. Erhöhe maximum-pool-size nur, wenn du tatsächlich Connection-Timeout-Warnungen siehst; ein größerer Pool gegen einen kleinen Datenbankserver macht es schlimmer, nicht besser.

Live-Sync

YAML
sync:  enabled: true  redis:    host: "127.0.0.1"    port: 6379    username: ""    password: ""    database: 0    ssl: false    channel: "gavel:sync"

Ohne Redis sieht ein zweiter Server neue Angebote erst, wenn sein eigener Cache abläuft — bis zu performance.listing-cache-seconds (30) später. Mit Redis veröffentlicht jeder Schreibvorgang eine Invalidierung, und alle Server aktualisieren gleichzeitig.

Wichtiger noch: Es verhindert das Zeitfenster, in dem zwei Server ein Angebot beide für verfügbar halten. Gavels Kaufablauf ist ohnehin rennsicher (erst Geld, dann Compare-and-Set auf die Zeile, mit Rückzahlung falls das CAS verliert) — niemand verliert also je Geld. Aber ohne Sync sehen Spieler „dieses Angebot ist weg"-Meldungen, die sie nie hätten sehen sollen.

Einrichtung

  1. Datenbank anlegen

    BASH
    mysql -u root -p -e "CREATE DATABASE gavel CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;"
  2. Alle Server identisch konfigurieren

    Gleicher host, database, username und gleicher table-prefix auf jedem Server, der den Markt teilen soll.

    Der eine Wert, der sich pro Server unterscheidet:

    YAML
    general:  server-name: "survival-1"
  3. Auf einen Redis-Kanal zeigen lassen

    YAML
    sync:  enabled: true  redis:    host: "10.0.0.5"    channel: "gavel:sync"

    Alle Server eines gemeinsamen Markts brauchen denselben channel. Betreibst du zwei getrennte Märkte in einer Redis-Instanz, gib jedem einen eigenen Kanalnamen.

  4. Neu starten und prüfen

    BASH
    /aha info

    Zeigt Speicher-Backend, Sync-Verbindung, Economy-Provider und die Angebotszahlen. Führe es auf zwei verschiedenen Servern aus und vergleiche die Zahlen.

Die Wirtschaft muss ebenfalls geteilt sein

Gavel teilt den Markt. Es teilt nicht deine Wirtschaft — das ist Vaults Aufgabe.

Haben survival-1 und skyblock-2 getrennte Guthaben, können Spieler über ein gemeinsames Auktionshaus Vermögen zwischen ihnen verschieben, indem sie sich selbst etwas verkaufen. Entweder du teilst die Economy-Datenbank, oder du gibst den beiden Servern verschiedene table-prefix-Werte und damit getrennte Märkte.

Das ist der Punkt, an dem es Leute erwischt

Gemeinsamer Markt + getrennte Wirtschaften = ein Währungs-Exploit, kein Feature. Entscheide dich, welches der beiden du betreibst, bevor Spieler anfangen zu listen.

Migration von SQLite

Es gibt keinen automatischen Import. Wenn du mit SQLite gestartet bist und jetzt MySQL brauchst, ist der risikoarme Weg:

  1. Einen Listing-Stopp ankündigen und bestehende Angebote auslaufen lassen (oder per /aha remove entfernen, was die Items an ihre Besitzer zurückschickt).
  2. Prüfen, dass die Postfächer leer sind.
  3. storage.type auf MYSQL stellen und neu starten.

Niemand verliert ein Item, weil alles Entfernte zuerst ins Postfach geht.

Folia

Gavel deklariert folia-supported: true und läuft auf Folia. Das Scheduling ist regionsbasiert statt über einen einzelnen Main-Thread; an der Konfiguration ändert sich nichts.