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
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:
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: 1200000table-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
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
Datenbank anlegen
BASH mysql -u root -p -e "CREATE DATABASE gavel CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;"Alle Server identisch konfigurieren
Gleicher
host,database,usernameund gleichertable-prefixauf jedem Server, der den Markt teilen soll.Der eine Wert, der sich pro Server unterscheidet:
YAML general: server-name: "survival-1"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.Neu starten und prüfen
BASH /aha infoZeigt 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:
- Einen Listing-Stopp ankündigen und bestehende Angebote auslaufen lassen (oder per
/aha removeentfernen, was die Items an ihre Besitzer zurückschickt). - Prüfen, dass die Postfächer leer sind.
storage.typeaufMYSQLstellen 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.