Hinter den Kulissen Teil 1: Minecraftserver

RiotSeb

Senior
30 Dez 2014
454
Hallo zusammen!

Ich würde heute gerne mit euch ein bisschen über einen Teil der Infrastruktur von UW sprechen. Es gibt bei uns nämlich noch deutlich mehr als das, was ihr sehen könnt.

Anfangen werde ich erstmal mit dem Minecraft-Server. Oder eher: Den Minecraft-Servern. Es gibt nämlich eigentlich gar nicht DEN einen Minecraft-Server, sondern nur DIE Server, weil die Welt(en) auf mehrere Server aufgeteilt sind. Jetzt könnte man sich denken: Moment mal, ich wechsel den Server doch gar nicht bei einem Weltenwechsel? Doch. Das tut ihr. Ihr müsst es nur nicht manuell machen, sondern wir übernehmen das für euch. Unsere Server sind alle in einem Netzwerk ('Bungeecord') zusammengeschlossen, welches dann für euch die Aufgabe des Serverwechsels (und noch viel mehr!) übernimmt. Ein besonderes Beispiel hierfür ist unsere Hauptwelt, welche inzwischen tatsächlich auf ganze sechs Server aufgeteilt ist. Serverwechsel sind immer durch "Niemandsländer" erkennbar.

Aber warum das Ganze?
Kurz gesagt: Egal wie stark die Rechenleistung hinter einem Server ist, auf einem Minecraft-Server können nicht mehr als ca. 60 Spieler gleichzeitig online sein, ohne dass mit Leistungseinbußen zu rechnen ist. Seit der 1.13 sind selbst 60 Spieler schon sehr optimistisch. Dies ist auf das Grundgerüst Minecrafts von Mojang zurückzuführen. (Achtung an die Profis: Jetzt kommt eine stark vereinfachte Erklärung) Dieses Grundgerüst sieht vor, dass ein Großteil aller Berechnungen auf einem Prozessorkern (noch genauer sogar nur auf einem Thread) laufen muss. Computerprozessoren haben heutzutage normalerweise so 4 bis 6 Prozessorkerne, welche gleichzeitig arbeiten können. Daraus folgt, dass Minecraft für einen Großteil der Berechnungen (z. B. das Rendern der Welt) nur 25% bzw 16,67% der maximalen Rechenleistung nutzt.
Da die gesamte Spiellogik auf diesem Prinzip basiert, müsste man Minecraft quasi von Grund auf neu schreiben, damit man dieses Problem beheben kann. (Dass Minecraft durchaus performant laufen kann, zeigt die "Minecraft Bedrock Edition", welche nicht in Java, sondern in C++ geschreiben ist.)
Wir haben serverseitig sehr viele Optimierungen vorgenommen, um den Server vor Laggs zu schützen. Leider sind wir durch die Vorgaben sehr eingeschränkt in der Möglichkeiten, den Server zu optimieren.


Kommunikation zwischen den Servern?


Da die Server jederzeit untereinander Informationen austauschen müssen, ist die Kommunikation zwischen ihnen enorm wichtig und muss vor allem extrem schnell vonstatten gehen.

Um sich besser vorstellen zu können, wie das Ganze funktioniert, nehmen wir erstmal ein Beispiel aus dem echten Leben und übertragen es anschließend auf das Servernetzwerk.

Stellt euch vor, ihr heißt Lisa und macht eine Weltreise. Eure Eltern würden jedoch gerne jederzeit wissen, wo ihr gerade seid. Was macht man dann also in Zeiten von WhatsApp und Co.? Richtig! Pakete nach Hause schicken ;). Ihr kauft euch nun also regelmäßig Pakete, füllt sie mit tollen Sachen, verschließt sie und schickt sie nach Hause. Eine Postfirma kümmert sich dann darum, dass das Paket dort ankommt, wo es soll. Ist das Paket dann endlich nach 10 Stunden Flug und drei Bahnausfällen zuhause angekommen, können es eure Eltern wieder öffnen, sich den Inhalt anschauen und damit machen, was sie wollen.

Übertragen wir das ganze jetzt auf unser Servernetzwerk, werden die fettgedruckten Aktivitäten auch vom Server ausgeführt. "Lisa" wird zu Server A und "Lisas Eltern" werden zu Server B. Das Paket wird zu einem Datenpaket ('Packet') und die Postfirma wird zu einem Teil der Serversoftware ('Netty'), welche sich um die Datenpakete kümmert. Nehmen wir als Beispiel mal ein Wetterpaket, welches der Spawnserver (die Spawnzone ist ein eigener Server) zu allen anderen Servern der Hauptwelt schickt. Der Spawnserver kümmert sich um das Wetter auf der gesamten Hauptwelt. Er schickt regelmäßig Datenpakete an die anderen Server, in welchen er sie über das aktuelle Wetter informiert. Empfangen die anderen Server ein solches Paket, überprüfen sie, ob das aktuelle Wetter auf dem Server mit dem aus dem Datenpaket übereinstimmt und korrigieren es notfalls. Der Spawnserver muss also ein neues Paket erstellen, in dieses die Wetterinformationen eintragen, es 'verschließen' (für die Profis: In ein Bytearray serialisieren) und dann noch verschicken. Auf diese Art und Weise werden sämtliche Daten zwischen den Servern ausgetauscht. Die Kommunikation zwischen Spielerclient und Server funktioniert auch mit Netty und einem ähnlichen Paketsystem. Wir benutzen jedoch eine eigene Implementierung von Netty für die Kommunikation zwischen den einzelnen Servern.

Eine visuelle Darstellung des ganzen würde in etwa so aussehen (Netty ist ein Framework, welches sich um das Versenden und Verarbeiten von Datenpaketen kümmert. Jede Sekunde werden mehrere Tausend Pakete von Netty verarbeitet. Die Grafik ist nicht ganz aktuell, was die Server angeht):

CXUxogZ.png

Es gibt mehrer Arten von Paketen, welche wir verschicken. Das normale Paket hat einen klaren Adressaten und wird auch nur an ihn verschickt. Doch verschicken wir auch Pakete, welche man als "Rundschreiben" ansehen könnte. Diese Pakete haben keinen klaren Adressaten, sondern werden an alle Server verschickt. Desweiteren haben wir die Möglichkeit eine Empfangsbestätigung von anderen Servern zu verlangen, wenn das Paket erfolgreich verarbeitet wurde. Dies geschieht z.B bei Vote-Paketen.

Wo wir gerade schon bei Vote-Paketen sind: Diese werden von unserem selbstgeschrieben Back-End-Server "Boson" an die Minecraftserver verschickt. Neben dieser Aufgabe ist Boson mittlerweile unerlässlich für den Betrieb unseres Servernetzwerkes geworden. @SteuerungC wird euch in den kommenden Tagen in einem eigenen Devblogbeitrag darüber aufklären, was genau ihr euch unter Boson vorstellen könnt.


Wie lange dauert das Verschicken von Packets?

Ich kann euch hier mal reale Werte aus dem Serverbetrieb zeigen. Links stehen die Server, rechts die Datenpaketgeschwindigkeiten ("UP" heißt, der Server kann Pakete empfangen).

Na4RHPw.png

Wie man sieht, geht das Ganze wirklich verdammt schnell. Das Erstellen, Befüllen, Verschließen, Verschicken, Empfangen, Öffnen und Verarbeiten dauert normalerweise eine Millisekunde (das ist ein Tausendstel einer Sekunde oder auch 0,001 Sekunden).

Das war es erstmal von mir. Danke fürs Lesen!
 
Eine Postfirma kümmert sich dann darum, dass das Paket dort ankommt, wo es soll. Ist das Paket dann endlich nach 10 Stunden Flug und drei Bahnausfällen zuhause angekommen,...

Das ist ja mal sowas von Realitätsfern, jeder weiß, dass international verschickte Pakete niemals ankommen. Aber ansonsten super schön erklärt. Lese das gerne und freue mich auf mehr Texte dieser Art. Kann mich Riku nur anschließen, weiter so!
 
Interesant, wie viel eigentlich dahinter steckt! Und wir sind trotzdem von den Weltenübergängen genervt :D
Nutze diese kurzen Momente der Dunkelheit, um in der Hektik des Alltags innezuhalten und dich zu besinnen, welch unglaublich innovative Leistung unsere Devs hier vollbracht haben: Du läufst gemütlich eine Straße entlang und siehst in der Ferne beispielsweise schon die Bauwerke des Nordens obwohl sie auf einem anderen Server stehen! Du läufst weiter und kannst immer ganz normal bis zum Horizont sehen, obwohl du nur wenige Meter vom Weltrand entfernt bist. Dann wird es kurz dunkel und du denkst, du bist immer noch da, wo du eben warst: Selber Ort, selbe Zeit, selbes Wetter. Aber nein: Du wurdest in eine komplett andere Welt auf einen anderen Server teleportiert, die durch raffinierte Maßnahmen nur so aussieht, als wäre es eine gemeinsame Welt. Bist du woanders? Misstrauisch drehst du dich um und schaust zurück: Alles ist noch da (obwohl es eigentlich auf dem eben verlassenen Server liegt). Zur Illusion trägt die gemeinsame Zonenkarte bei, die die Welten von sechs unterschiedlichen Servern zu einer Karte zusammenfasst, als ob es eine Welt wäre. Eine riesige 8000×8000 große Welt, die auf mehrere Server verteilt ist, so dass auch mit Version 1.13 mehr als 60 Spieler in der gesamten Welt sein können, habe ich auf keinem anderen Bauserver gesehen und halte Unlimitedworld für absolut einmalig.

Und was passiert beim Weltenübergang, wenn du in Boot oder Lore oder auf einem Reittier sitzt? Oder wenn du mit Elytren fliegst? Oder wenn du eine Enderperle "nach drüben" wirfst? Und wenn du Tiere an der Leine hast? Und was passiert mit deinen Haustieren (Hund, Katze, Papagei)? Und was ist mit Farmtieren, die du ohne Leine mit Futter hinter dir herlockst? - Es ist der absolute Wahnsinn, wie diese Weltenübergänge im Detail programmiert sind.
 
Zuletzt bearbeitet:
Früher, als ich noch sehr jung war ( :p ), da schaute man zu den "Göttern in Weiß" (Ärzten) hoch und bewunderte sie wegen ihres Ansehens und Einkommens. Mit der Zeit habe ich mir das abgewöhnt, als ich reifer wurde und mir klarmachte, dass ich auf den Müllfahrer weit öfter angewiesen bin als auf einen Chefarzt.
Jetzt geht es mir mit den Devs und anderen IT Zauberen so wie damals. Darn, wieder muss ein Lernprozess starten? Wielange brauche ich diesmal? Wer mir jetzt wichtiger ist, die Leute, die die Server, auf denen ich zocken will am Laufen halten oder die Müllmänner... das will ich nicht austesten.

Ich finde es großartig, hier einen Einblick zu bekommen! Danke :)
 
@Mintika : Ich find den Vergleich interessant. Ja, an sich hast du Recht: Einen Chefarzt (Dev) brauchst du nicht alle Tage, aber wenn es drauf ankommt, hält er deinen Körper (den Server) am Leben. ^^ Das ist etwas, womit der Müllmann (Spieler) nicht dienen kann. Ich denke dazu eher, dass jeder Beruf (Rang auf UW) seine ganz eigene Daseinsberechtigung hat. Du brauchst, wenn, dann beides, sowohl den Arzt, als auch den Müllmann. ^^
 
Deine Interpretation ist interessant..

Ich hatte aber eher den Dev eines Servers gemeint und meinen RL Müllfahrer und somit Bedenken, dass ich den Dev öfter brauche als den Chefarzt und mir ein klarer Konflikt zwischen Zocken und überquellenden Mülltonnen bevorstehen könnte, wenn man denn wählen müsste - was man glücklicherweise nicht muss! :D
 

Benutzer, die dieses Thema gerade lesen

ONLINE 15 Spieler