Hallo an alle.
Seit der Veröffentlichung von Diablo II: Resurrected hatten wir mehrere Serverprobleme, und wir wollten etwas Transparenz darüber schaffen, was diese Probleme verursacht und welche Schritte wir bisher unternommen haben, um sie zu beheben. Wir möchten Ihnen auch einen Einblick geben, wie wir uns weiterentwickeln.
tl;dr: Unsere Serverausfälle wurden nicht durch ein einzelnes Problem verursacht; Wir lösen jedes Problem, wenn es auftritt, sowohl mit mildernden Lösungen als auch mit längerfristigen architektonischen Veränderungen. Eine kleine Anzahl von Spielern hat einen Charakterfortschritt erlebt - in Zukunft sollte jeder Verlust aufgrund eines Serverabsturzes auf mehrere Minuten begrenzt sein. Dies ist für uns keine vollständige Lösung, und wir arbeiten weiter an diesem Problem. Unser Team arbeitet mit hilfe anderer bei Blizzard daran, das Spielerlebnis an einen Ort zu bringen, der sich für alle gut anfühlt.
Wir werden hier mit einigen technischen Besonderheiten ein wenig auf das Unkraut eingehen, aber wir hoffen, dass dies Ihnen insgesamt hilft zu verstehen, warum diese Ausfälle aufgetreten sind und was wir getan haben, um jede Instanz anzugehen, sowie wie wir die allgemeine Ursache untersuchen. Fangen wir am Anfang an.
Das Problem(e) mit den Servern:
Bevor wir über die Probleme sprechen, geben wir Ihnen kurz einen Überblick darüber, wie unsere Serverdatenbanken funktionieren. Erstens gibt es unsere globale Datenbank, die als einzige Quelle der Wahrheit für alle Deine Charakterinformationen und Fortschritte existiert. Wie Sie sich vorstellen können, ist das eine große Aufgabe für eine Datenbank und würde nicht alleine zurechtkommen. Um die Last und Latenz unserer globalen Datenbank zu verringern, verfügt jede Region – NA, EU und Asien – über individuelle Datenbanken, in denen auch die Informationen und der Fortschritt Ihres Charakters gespeichert sind, und die Datenbank Ihrer Region schreibt regelmäßig in die globale Datenbank. Die meisten deiner Aktionen im Spiel werden für diese regionale Datenbank ausgeführt, da sie schneller ist und dein Charakter dort “gesperrt” ist, um die Integrität des einzelnen Charakterdatensatzes aufrechtzuerhalten. Die globale Datenbank verfügt auch über eine Backup-Datei für den Fall, dass die Hauptdatenbank ausfällt.
In diesem Sinne, um zu erklären, was passiert ist, werden wir uns auf die Ausfallzeiten konzentrieren, die zwischen Samstag, dem 9. Oktober, und jetzt aufgetreten sind.
Am Samstagmorgen pazifischer Zeit erlitten wir einen globalen Ausfall aufgrund eines plötzlichen, erheblichen Anstiegs des Verkehrs. Dies war eine neue Schwelle, die unsere Server überhaupt nicht erlebt hatten, nicht einmal beim Start. Dies wurde durch ein Update verschärft, das wir am Vortag eingeführt hatten, um die Leistung bei der Spieleerstellung zu verbessern - diese beiden Faktoren zusammen überlasteten unsere globale Datenbank, was zu einer Zeitabsetzung führte. Wir haben uns entschieden, das Freitagsupdate, das wir zuvor bereitgestellt hatten, zurückzustellen, in der Hoffnung, dass dies die Last auf den Servern bis Sonntag verringern und uns gleichzeitig den Raum geben würde, die Ursache tiefer zu untersuchen.
Am Sonntag wurde jedoch klar, dass das, was wir am Samstag getan hatten, nicht genug war - wir sahen einen noch höheren Anstieg des Verkehrs, was zu einem weiteren Ausfall führte. Unsere Spielserver beobachteten die Trennung von der Datenbank und versuchten sofort, sich wiederholt wieder zu verbinden, was bedeutete, dass die Datenbank nie Zeit hatte, die arbeit nachzuholen, die wir abgeschlossen hatten, weil sie zu beschäftigt war, einen kontinuierlichen Strom von Verbindungsversuchen von Spielservern zu bewältigen. Während dieser Zeit sahen wir auch, dass wir Konfigurationsverbesserungen an unserer Datenbankereignisprotokollierung vornehmen konnten, die notwendig ist, um im Falle eines Datenbankfehlers einen fehlerfreien Zustand wiederherzustellen, also haben wir diese abgeschlossen und weitere Ursachenanalysen durchgeführt.
Das zweischneidige Schwert des Ausfalls vom Sonntag war, dass wir aufgrund dessen, womit wir uns am Samstag befasst hatten, im Wesentlichen ein Playbook darüber erstellt hatten, wie wir uns schnell davon erholen können. Was gut war.
Aber weil wir in einem Spitzenfenster der Spieleraktivität so schnell wieder online gingen, mit Hunderttausenden von Spielen innerhalb von zehn Minuten, fielen wir wieder um. Was schlimm war.
Daher mussten wir viele Korrekturen bereitstellen, einschließlich Konfigurations- und Codeverbesserungen, die wir in der globalen Sicherungsdatenbank bereitgestellt haben. Dies führt uns in den Montag, den 11. Oktober, als wir zwischen den globalen Datenbanken gewechselt haben. Dies führte zu einem weiteren Ausfall, als unsere Sicherungsdatenbank fälschlicherweise ihren Sicherungsprozess weiterführte, was bedeutete, dass sie die meiste Zeit damit verbrachte, aus der anderen Datenbank zu kopieren, wenn sie Anforderungen von Servern hätte bearbeiten sollen. Während dieser Zeit entdeckten wir weitere Probleme und nahmen weitere Verbesserungen vor – wir fanden eine seither veraltete, aber anstrengende Abfrage, die wir vollständig aus der Datenbank entfernen konnten, wir optimierten die Berechtigungsprüfungen für Spieler, wenn sie einem Spiel beitreten, was die Last weiter lindert, und wir haben weitere Leistungsverbesserungen beim Testen, während wir sprechen. Wir glauben auch, dass wir die Stürme bei der Datenbank-Wiederverbindung behoben haben, die wir gesehen haben, weil wir sie am Dienstag nicht gesehen haben.
Am Dienstag haben wir dann ein weiteres gleichzeitiges Spielerhoch erreicht, mit ein paar Hunderttausenden von Spielern allein in einer Region. Dies hat uns zu einem weiteren Vorfall mit eingeschränkter Datenbankleistung gemacht, an dessen Ursache derzeit von unseren Datenbankingenieuren gearbeitet wird. Wir haben uns auch an andere Ingenieure rund um Blizzard gewandt, um an kleineren Korrekturen zu arbeiten, da sich unser eigenes Team auf Kernserverprobleme konzentrierte, und wir haben uns auch an unsere Drittanbieter gewandt, um Unterstützung zu erhalten.
Warum das passiert:
Um dem Originalspiel treu zu bleiben, haben wir viel Legacy-Code beibehalten. Insbesondere ein Legacy-Dienst hat jedoch Schwierigkeiten, mit dem modernen Spielerverhalten Schritt zu halten.
Dieser Dienst, mit einigen Upgrades gegenüber dem Original, behandelt wichtige Teile der Spielfunktionalität, nämlich das Erstellen / Beitreten von Spielen, das Aktualisieren / Lesen / Filtern von Spiellisten, das Überprüfen des Zustands des Spielservers und das Lesen von Charakteren aus der Datenbank, um sicherzustellen, dass Ihr Charakter an dem teilnehmen kann, wofür Sie filtern. Wichtig ist, dass dieser Dienst ein Singleton ist, was bedeutet, dass wir nur eine Instanz davon ausführen können, um sicherzustellen, dass alle Spieler jederzeit die aktuellste und korrekteste Spielliste sehen. Wir haben diesen Service in vielerlei Hinsicht optimiert, um der moderneren Technologie zu entsprechen, aber wie wir bereits erwähnt haben, stammen viele unserer Probleme aus der Spieleerstellung.
Wir erwähnen “modernes Spielerverhalten”, weil es ein interessanter Punkt ist, über den man nachdenken sollte. Im Jahr 2001 gab es im Internet nicht annähernd so viele Inhalte darüber, wie man Diablo II “richtig” spielt (Baal läuft für XP, Pindleskin / Ancient Sewers / etc für magischen Fund usw.). Heute kann ein neuer Spieler jedoch eine beliebige Anzahl von erstaunlichen Content-Erstellern nachschlagen, die ihnen beibringen können, wie man das Spiel auf verschiedene Arten spielt, viele von ihnen einschließlich viel Datenbanklast in Form von Erstellen, Laden und Zerstören von Spielen in schneller Folge. Obwohl wir dies vorhergesehen haben - mit Spielern, die neue Charaktere auf neuen Servern erstellen und hart daran arbeiten, ihre magischen Gegenstände zu erhalten - haben wir den Umfang, den wir aus beta-Tests abgeleitet haben, stark unterschätzt.
Darüber hinaus haben wir insgesamt zu oft in der globalen Datenbank gespeichert: Es besteht keine Notwendigkeit, dies so oft zu tun, wie wir es waren. Wir sollten Sie wirklich in der regionalen Datenbank speichern und Sie nur dann in der globalen Datenbank speichern, wenn wir Sie entsperren müssen - dies ist eine der Minderungen, die wir eingeführt haben. Im Moment schreiben wir Code, um zu ändern, wie wir dies vollständig tun, so dass wir fast nie in der globalen Datenbank speichern werden, was die Last auf diesem Server erheblich reduzieren wird, aber das ist ein Architektur-Redesign, das einige Zeit in Anspruch nehmen wird, um zu erstellen, zu testen und dann zu implementieren.
Ein Hinweis zum Fortschrittsverlust:
Der Fortschrittsverlust, den einige Spieler erlebt haben, ist auf die Art und Weise zurückzuführen, wie wir Charaktersperren sowohl in der regionalen als auch in der globalen Datenbank durchführen – wir sperren Ihren Charakter in der globalen Datenbank, wenn Sie einer Region zugewiesen sind (wenn Sie beispielsweise in der US-Region spielen, ist Ihr Charakter an die US-Region gebunden und die meisten Aktionen werden in der Datenbank der US-Region aufgelöst).)
Das Problem war, dass während eines Serverausfalls, wenn die Datenbank umfiel, eine Reihe von Zeichen in der regionalen Datenbank stecken blieben und wir keine Möglichkeit hatten, sie in die globale Datenbank zu verschieben. Zu dieser Zeit glaubten wir, dass wir zwei Möglichkeiten hatten: Entweder wir schalten alle mit nicht gespeicherten Änderungen in der globalen Datenbank frei und verlieren daher einige Fortschritte aufgrund eines Überschreibens, das in der globalen Datenbank auftreten würde, oder wir bringen das Spiel für eine unbestimmte Zeit vollständig herunter und führen ein Skript aus, um die regionalen Daten in die globale Datenbank zu schreiben.
Zu dieser Zeit handelten wir nach ersterem: Wir hielten es für wichtiger, das Spiel auf dem Laufenden zu halten, damit die Leute spielen konnten, anstatt das Spiel für einen langen Zeitraum herunterzunehmen, um die Daten wiederherzustellen. Es tut uns zutiefst leid für alle Spieler, die wichtige Fortschritte oder wertvolle Gegenstände verloren haben. Als Spieler selbst kennen wir den Stachel eines Rollbacks und spüren ihn zutiefst.
In Zukunft glauben wir, dass wir eine Möglichkeit haben, Charaktere wiederherzustellen, die nicht zu einem signifikanten Datenverlust führt - es sollte im Falle eines Serverabsturzes auf mehrere Minuten Verlust beschränkt sein, falls vorhanden.
Das ist besser, aber in unseren Augen immer noch nicht gut genug.
Was wir dagegen tun:
Ratenbegrenzung: Wir beschränken die Anzahl der Operationen auf die Datenbank rund um das Erstellen und Verbinden von Spielen, und wir wissen, dass dies von vielen von Ihnen empfunden wird. Zum Beispiel für diejenigen von Ihnen, die Pindleskin-Läufe machen, werden Sie in und aus einem Spiel sein und innerhalb von 20 Sekunden ein neues erstellen. In diesem Fall sind Sie an einem Punkt preislich begrenzt. Wenn dies auftritt, wird die Fehlermeldung sagen, dass es ein Problem bei der Kommunikation mit Spielservern gibt: Dies ist kein Indikator dafür, dass die Spielserver in diesem speziellen Fall ausgefallen sind, es bedeutet nur, dass Sie die Rate begrenzt haben, um die Last der Datenbank vorübergehend zu reduzieren, um das Spiel am Laufen zu halten. Wir können Ihnen versichern, dass dies vorerst nur eine Milderung ist - wir sehen dies nicht als langfristige Lösung.
Erstellung der Anmeldewarteschlange: Das vergangene Wochenende war eine Reihe von Problemen, nicht immer wieder das gleiche Problem. Aufgrund einer revitalisierten Spielerbasis, dem Hinzufügen mehrerer Plattformen und anderen Problemen im Zusammenhang mit der Skalierung können wir weiterhin auf kleine Probleme stoßen. Um sie schnell zu diagnostizieren und anzugehen, müssen wir sicherstellen, dass das “Herden” - eine große Anzahl von Spielern, die sich gleichzeitig anmelden - aufhört. Um dies zu beheben, haben wir Leute, die an einer Login-Warteschlange arbeiten, ähnlich wie Ihr es vielleicht in World of Warcraft erlebt habt. Dies wird die Bevölkerung auf dem sicheren Niveau halten, das wir zu der Zeit haben, so dass wir überwachen können, wo das System angespannt ist und es ansprechen können, bevor es das Spiel vollständig herunterbringt. Jedes Mal, wenn wir eine Sorte reparieren, können wir die Populationsobergrenzen erhöhen. Diese Anmeldewarteschlange wurde bereits teilweise im Backend implementiert (im Moment sieht es wie eine fehlgeschlagene Authentifizierung im Client aus) und sollte in den kommenden Tagen vollständig auf dem PC bereitgestellt werden, mit der Konsole, die danach folgen wird.
Aufteilen kritischer Funktionen in kleinere Dienste: Diese Arbeit ist sowohl teilweise in Arbeit für Dinge, die wir in weniger als einem Tag angehen können (einige wurden bereits in dieser Woche abgeschlossen) als auch für größere Projekte geplant, wie neue Microservices (zum Beispiel ein GameList-Dienst, der nur für die Bereitstellung der Spielliste für Spieler verantwortlich ist). Sobald kritische Funktionen heruntergebrochen sind, können wir unsere Spielverwaltungsdienste skalieren, wodurch die Last reduziert wird.
Wir haben Leute, die unglaublich hart daran arbeiten, Vorfälle in Echtzeit zu verwalten, Probleme zu diagnostizieren und Korrekturen zu implementieren – nicht nur im D2R-Team, sondern bei Blizzard. Dieses Spiel bedeutet uns allen so viel. Viele von uns im Team sind lebenslange D2-Spieler - wir haben während des ersten Starts im Jahr 2000 gespielt, einige sind Teil der Modding-Community und so weiter. Wir können euch versichern, dass wir so lange weiterarbeiten werden, bis sich das Spielerlebnis für uns nicht nur als Entwickler, sondern auch als Spieler und Mitglieder der Community selbst gut anfühlt.
Bitte senden Sie Ihr Feedback weiterhin an die Diablo II: Auferstandenes Forum , melden sie ihre fehler an unsere Bug Report Forum , und für hilfe bei der fehlerbehebung besuchen sie unsere Forum für technischen Support . Vielen Dank für Ihre kontinuierliche Kommunikation mit uns über alle Kanäle hinweg – sie ist für uns bei der Arbeit an diesen Themen von unschätzbarem Wert.
Das Diablo-Community-Team wird euch über die Foren über unsere Fortschritte auf dem Laufenden halten.
- Das Diablo II: Resurrected Dev Team