These forums have been archived and are now read-only.

The new forums are live and can be found at https://forums.eveonline.com/

Informationen und Bekanntmachungen

 
  • Topic is locked indefinitely.
 

Devblog: Hinter den Kulissen einer langen EVE Online-Downtime

First post
Author
CCP Shadowcat
C C P
C C P Alliance
#1 - 2015-08-07 10:44:36 UTC  |  Edited by: CCP Phantom
Devblog von CCP Goliath in Kooperation mit CCP Masterplan.

Dieser Devblog ist ein Bericht darüber, was hinter den Kulissen geschah, als EVE Online am 15. Juli 2015 eine seiner längsten Downtimes seit Jahren hatte. Wir teilen ihn mit euch, weil wir wissen, dass viele Spieler im IT-Bereich arbeiten und die Kriegsgeschichten zu schätzen wissen, und weil wir euch dadurch einen guten Einblick in das Innenleben eines recht einzigartigen Spieleclusters geben können. Wenn euch diese Dinge interessieren, dann lest weiter für einen Bericht über die Ereignisse am 15. Juli. Falls ihr diese Details lieber auslassen wollt, empfehlen wir die oberflächlichere Zusammenfassung, die wir hier kurz nach dem Vorfall veröffentlicht haben.

Hintergrund

Diejenigen unter euch, die bereits seit einer langer Zeit bei uns sind, erinnern sich bestimmt an eine Zeit, in der die Downtime mehrere Tage statt Stunden betrug. In den letzten Jahren haben wir es geschafft, diese furchtbar langen Downtimes - größtenteils - zu eliminieren. Am 15. Juli waren wir 699 Minuten lang für Spieler unerreichbar. Das ist etwas länger als die Downtimes, die am 2. und 3. Juni 2013 auftauchten, direkt vor der Veröffentlichung von Odyssey (das selbst aufgrund von über einen großen Zeitraum laufenden Tiercide-Skripten eine 342-minütige Downtime nach sich zog). Davor waren wir 2011 mit Incarna 963 Minuten unerreichbar, was aber die letzte der sehr langen Veröffentlichungen darstellte, die unserem 6-monatigen Releasezyklus folgten. Wenn wir momentan einfach automatisch neu starten, ohne etwas zu veröffentlichen, können wir sicher sein, dass dies ungefähr 7 Minuten dauert. Wenn wir etwas veröffentlichen, rechnen wir normalerweise damit, dass innerhalb der 30-minütigen Downtime alles wieder läuft.

Das Hochfahren

Der Tranquility-Cluster besteht aus ungefähr 250 Serverknoten. Um den Cluster hochzufahren, müssen alle Knoten eine koordinierte Funktionsabfolge ausführen. Dies beinhaltet die Zuweisung von IDs zu jedem Knoten, die Herstellung von Netzwerkverbindungen zwischen jedem Knotenpaar, die Zuweisung welches Sonnensystem auf welchem Knoten läuft, sowie das Laden der notwendigen Daten, um es jedem Knoten zu ermöglichen, seine Aufgabe auszuführen (ein Knoten ist beispielsweise für die Region eines Markts zuständig, oder eine Reihe von Corporations/Allianzen, oder dem Skilltraining für eine Reihe an Charakteren).

Während der Startsequenz bewegt sich der Cluster durch mehrere Phasen. Der Cluster wird nicht in die nächste Phase übergehen, bis alle Knoten berichten, dass sie die Aufgaben der aktuellen Phase abgeschlossen haben. Er beginnt bei Phase -4 und läuft bis Phase 0 weiter. Sobald sich alle Knoten in Phase 0 melden, ist der Cluster bereit. Ein Hauptknoten wird gewählt, um diese Sequenz zu organisieren. Diesen nennen wir Polaris. Der Polaris-Knoten ist dafür verantwortlich, die Phasen aller anderen Knoten zu überprüfen und Anweisungen zum Übergang in die nächste Phase auszusenden, sobald die erforderlichen Bedingungen erfüllt wurden.

-4: Der Knoten ist aktiv und wir haben eine Verbindung zur Datenbank
-3: Der Knoten hat erfolgreich eine Netzwerkverbindungen zu jedem anderen Knoten geöffnet
-2: Der Adressen-Cache wurde vorbereitet. Das ist im Prinzip die Routingtabelle, so dass jeder Knoten weiß, was die Aufgabe jedes anderen Knotens ist
-1: Alle Hochfahrdienste haben ihre Initialisierung abgeschlossen und das Vorausladen einiger Daten (Markt, Sonnensysteme, usw.) hat begonnen
0: Dem Knoten wurde mitgeteilt, dass der Cluster bereit ist. Alle Hochfahrdaten sind geladen und Dienste sind bereit, Anfragen anzunehmen

Der Vorfall

Als wir den Server am 15. Juli vom Netz nahmen um den ersten Folgepatch für Souveränität in Aegis aufzuspielen, haben wir keinen Störfall erwartet. Die Testserver, auf die wir das Update zuvor aufgespielt hatten, wurden korrekt hochgefahren und verhielten sich normal, so dass wir erwarteten, dass es sich um eine standardmäßige 15-20 minütige Veröffentlichung handeln wird. Das erste Hindernis war, dass unser Veröffentlichungstool sehr lange brauchte, um das Serverpaket zu installieren, irgendwann eine Fehlermeldung ausspuckte und kurz vor 11:30 Uhr neu gestartet wurde. Zu diesem Zeitpunkt haben wir die Verzögerung beim Hochfahren bekannt gegeben, rechneten aber immer noch nicht mit etwas Ungewöhnlichem - Programme versagen manchmal einfach, Zeitüberschreitungen passieren und wir haben die Inhalte einfach neu installiert, dieses Mal erfolgreich. Der erste Versuch zum Hochfahren des Servers war um 11:42, um 11:46 berichteten 12 Knoten (von ca. 250), dass sie feststecken und verhinderten somit ein erfolgreiches Hochfahren. Das schreckte uns nicht ab: Unser erster Anlaufpunkt war der älteste Trick im IT-Buch - "aus- und wieder einschalten".

[img]http://content.eveonline.com/www/newssystem/media/67449/1/have-you-triedsmall.jpg[/img]

Das Hochfahren ging dieses Mal schneller, allerdings sahen wir uns immer noch mit 41 Knoten konfrontiert, die im "-1"-Status feststeckten. Wir entschieden uns dafür, den Server auf VIP-Zugriff zu setzen, so dass nur Accounts mit besonderen Entwicklerrollen Zugriff auf den Server haben, sobald er online ist, und die Veröffentlichung nochmal komplett von vorne vorzunehmen, um mögliche Sperrungen, Konflikte oder menschliches Versagen nach dem ersten Versuch auszuschließen. All unsere Vermutungen konzentrierten sich diesmal auf die Umgebung als mögliche Ursache, da der Code auf dem Testserver funktionierte und keine der Daten für rote Flaggen sorgte.

Leider waren wir 2 Hochfahrversuche später immer noch keinen Schritt näher an einem funktionierendem Server, also war es an der Zeit, die Kavallerie zu rufen. EVE-Programmierer taten sich mit der Serverbetriebsabteilung (Live Ops) für weitere Recherchen des...
  • CCP Shadowcat (=^・^=)

Señor German Linguistic Owner |  @CCP_Shadowcat

CCP Shadowcat
C C P
C C P Alliance
#2 - 2015-08-07 10:58:22 UTC  |  Edited by: CCP Shadowcat
Den Server in diesem Zustand zu öffnen war keine Option, da wir gerade einen ganzen Tag voller Souveränitätskampagnen gelöscht hatten. Also forschten wir weiter. Zu dieser Zeit nahmen etwa 8 EVE-Programmierer an den Recherchen teil, während die Serverbetriebsabteilung zeitgleich ihre eigenen Recherchen vornahm und praktisch jedes Mitglied des QA-Teams im Gebäude versuchte, das Problem auf Singularity nachzustellen. Um 17:10 Uhr nahmen wir die nächste Änderung vor - nur die Daten der Verwundbarkeitsfenster wurden zur Datenbank hinzugefügt. Das nächste Hochfahren sollte uns dabei helfen, festzustellen, ob es diese Daten oder die Verstärkungsevents sind, die ein Hochfahren verhindern. Wir haben die Änderung aufgespielt, den Server erfolgreich hochgefahren und hatten einen relativ eindeutigen Beweis - die Kampagnen selbst sorgten irgendwie für den Fehler. Das EVE-Entwicklerteam konzentrierte seine Recherchen entsprechend. Die verbleibende Kampagnendaten wurden anschließend wieder der Datenbank hinzugefügt.

[img]http://content.eveonline.com/www/newssystem/media/67449/1/Iqy3lnysmall.png[/img]

Es gab eine Theorie darüber, was die feststeckenden Knoten verursachen könnte: Während dem Hochfahren müssen die Knoten, die Sonnensysteme mit einer oder mehreren Souveränitätskampagnen laufen lassen, mit den Knoten kommunizieren, die die zugehörigen Allianzen verwalten. Eine dieser Abfragen beinhaltet die Suche nach dem gewählten Hauptsystem der Allianz. Im neuen Souveränitätssystem dauert es ein paar Tage, bis Änderungen am Hauptsystem einer Allianz in Kraft treten. Während den Tagen nach der ersten Veröffentlichung dieser Änderungen wollten wir es Allianzen so einfach wie möglich machen, sich an die neuen Regeln zu gewöhnen, also fügten wir eine Einstellung hinzu, mit der wir den 7-tägigen Timer kurzzeitig mit einer weitaus kürzeren Verzögerung ersetzen konnten. Wir hatten die Theorie, dass falls diese Aufrufe zwischen Serverknoten, um den Hauptsitz einer Allianz abzurufen, in irgendeiner Weise mit dem Mechanismus interagieren, der für das Laden der Konfigurationsdaten zuständig ist (wie zur Überbrückung der standardmäßigen Verzögerung), könnte dies zu einer knotenübergreifenden Blockade führen. Das würde bedeuten, dass der Sonnensystem-Knoten, der die Kampagne lädt, auf die Antwort des Allianzknotens mit den benötigten Informationen wartet. In der Zwischenzeit hat der Allianzknoten die Hauptsitz-Einstellungen geladen und sendet eine Aktualisierung an das Hauptsonnensystem mit der Nachricht "Du bist das Hauptsystem, du solltest einen Verteidigungsmultiplikator von +2 haben". Der Allianzknoten wird nicht auf neue Anfragen reagieren, bis der Sonnensystemknoten den aktualisierten Hauptsitzstatus anerkannt hat, doch der Sonnensystemknoten antwortet nicht auf neue Anfragen, bis der Allianzknoten auf die Kampagnenanfrage reagiert. Wir haben eine Codeänderung übermittelt, welche die konfigurierbare Haupsitzverzögerung entfernt und die Möglichkeit einer Blockade hierdurch ausschließen sollte.

Während dem nächsten Hochfahren um 18:12 Uhr hatten wir 51 Knoten bei "-1" - und mussten nochmal von vorne anfangen (nach einem schnellen Neustart, nur um auf Nummer sicher zu gehen).

Was hatten wir bis zu diesem Zeitpunkt also gelernt?


  • Das Hochfahren ohne Kampagnendaten in der Datenbank funktionierte einwandfrei auf Tranquility und allen Testservern.
  • Das Hochfahren mit etwa 300 Kampagnen in der Datenbank funktionierte nicht auf Tranquility, lief aber auf allen Testservern.
  • Das Löschen von knotenübergreifenden Abfragen in Bezug auf Allianz-Hauptsysteme schien keinen Effekt zu haben.
  • Wir mussten einige Versuche zum Laden von Kampagnen auf Tranquility durchführen, um abzugrenzen, wo genau das Problem auftrat.


Wir entschieden uns dafür, das Laden der Kampagnen beim Hochfahren komplett zu entfernen. Die Konsequenz dessen war, dass das Auftauchen von Kommandoknoten im Hintergrund nicht stattfinden würde; die Souveränitätsstrukturen sollten aber normal hochfahren. Bitte beachtet, dass dies nicht als tatsächliche Lösung gedacht war, sondern uns stattdessen lediglich neue Punktdaten zu den Bedingungen geben sollte, die zu einem erfolgreichen/gescheiterten Hochfahren führten. Diese versuchsweise Änderung (Hotfix #2) führte tatsächlich zu einem erfolgreichen Hochfahren um 19:15 Uhr und führte zu Versuch Nummer 3: Was passiert, wenn wir nun die Kampagnen erst nach einer kurzen Verzögerung laden, damit zuerst alles andere in Ruhe hochfahren kann?

Wir haben auch versucht, das Laden der Kampagnen (welches wir zuvor in Hotfix #2 deaktiviert hatten) erneut zu aktivierten, verzögerten dies jedoch und ließen es asynchron mit dem Rest des Hochfahrens laufen. Zu diesem Zeitpunkt wurden wir von einigen leichten Mucken geplagt: Perforce-Synchronisierungen sorgten zu Verzögerungen in unserem Buildsystem und es gab einige unzusammenhängende Probleme bei der Datenspeicherung, doch mit jedem Hotfix kamen wir näher und näher...

[img]http://content.eveonline.com/www/newssystem/media/67449/1/CJ-vErKWsAARyU8small.jpg[/img]

an Pizza, die glücklicherweise um 19:48 Uhr ankam, während unser dritter Hotfix aufgespielt wurde. Tranqulity konnte mit dieser Änderung nicht wieder hochfahren, was interessant war, da wir in Hotfix #3 die Kampagnen unabhängig von den übrigen Aufgaben beim Hochfahren luden, das Laden selbiger dennoch einige Knoten abschaltete.

Neu gestärkt mit einer Tischtennisplatte voller Pizza spielten wir Hotfix #2 für neue Versuche und LIVE-KONSOLENVERSUCHE auf.

[img]http://content.eveonline.com/www/newssystem/media/67449/1/pics_026small.jpg[/img]

Sobald alle Knoten online waren und wir überprüft hatten, dass die Sonnensysteme korrekt geladen wurden, öffneten wir eine Python-Konsole auf dem Server, die es uns ermöglichte, Befehle auszuführen und die Ergebnisse in...
  • CCP Shadowcat (=^・^=)

Señor German Linguistic Owner |  @CCP_Shadowcat

CCP Shadowcat
C C P
C C P Alliance
#3 - 2015-08-07 10:59:57 UTC  |  Edited by: CCP Shadowcat
Folgendes passierte:

Zuerst hatten wir zwei Protokollkanäle - einen allgemeinen Kanal, sowie den speziellen Kanal, der zum Erfassen der Kampagnenaktivität im Souveränitätssystem benutzt wurde. Wir konnten bestätigen, dass beide Kanäle funktionierten, indem wir den folgenden Code auf einem einzelnen Knoten ausführten.


  1. # generic_logger ist eine Referenz zu einem allgemeinen Protokollkanal
  2. # campaign_logger ist eine Referenz zum Protokollkanal, der von Souveränitätskampagnen benutzt wird
  3. # Schritt 1a: Sicherstellen, dass die Ausgabe zum allgemeinen Protokoll korrekt funktioniert
  4. generic_logger.warn('The quick brown fox jumps over the lazy dog')
  5. # Schritt 1a: Sicherstellen, dass die Ausgabe zum Kampagnenprotokoll korrekt funktioniert
  6. campaign_logger.warn('The quick brown fox jumps over the lazy dog')


Während dieser Code arbeitete, haben wir zudem die Protokollausgabe in Echtzeit über Splunk im Auge behalten. Tatsächlich tauchte jede Zeile einmal auf.

Als nächstes führten wir Schritt 1a gleichzeitig auf allen 250 Knoten aus. Sofort tauchten 250 Einträge auf der Splunk-Anzeige auf. Dann wiederholten wir das gleiche für Schritt 1b und erhielten das gleiche Ergebnis - jeder Knoten protokolliert eine Instanz der Zeile und jede Zeile zeigte an, dass sie vom Kampagnenkanal kam.

So weit, so gut. Jetzt wollten wir mehr Daten protokollieren, aber nichts, das irgendwelche Probleme verursachen sollte, richtig? Richtig? Hmm...


  1. # Schritt 2a: Die selbe Zeile 500 Mal pro Knoten im allgemeinen Kanal protokollieren
  2. [generic_logger.warn('The quick brown fox jumps over the lazy dog') for i in range(500)]
  3. # Schritt 2a: Die selbe Zeile 500 Mal pro Knoten im Kampagnenkanal protokollieren
  4. [campaign_logger.warn('The quick brown fox jumps over the lazy dog') for i in range(500)]


Für diejenigen unter euch, die sich nicht mit Python auskennen: Die zweite Zeile wird 500 Mal wiederholt und gibt die Warnmeldung einmal pro Wiederholung im allgemeinen Protokollkanal aus. Die fünfte Zeile macht das gleiche, aber im Kampagnenprotokollkanal.

Zuerst haben wir Schritt 2a parallel auf allen Knoten ausgeführt. Der Befehl wurde sofort ausgeführt und wir sahen eine Spitze mit 125.000 Zeilen (250*500) auf dem Splunk-Diagramm. Das hört sich nach einer Menge Protokollen an, aber es handelt sich hierbei um nichts, was das System nicht verarbeiten kann, besonders wenn sie in kleinen Spitzen wie hier auftauchten. Dann führten wir das gleiche mit Schritt 2b aus. Hier passierte etwas Merkwürdiges. Die korrekte Anzahl an Protokollzeilen tauchte in Splunk auf (die Protokolle zeigen also tatsächlich etwas an!), doch der Befehl schien nicht so unverzüglich zurückzukommen wie bei Schritt 2a. Tatsächlich dauerte es ein paar Minuten, bis die Konsole wieder reagierte und die zurückerhaltenden Daten deuteten darauf hin, dass einige Knoten nicht rechtzeitig antworteten. Als wir uns den Status des Clusters ansahen, wurden diese Knoten als ausgefallen angezeigt. Irgendwie hat es diese unschuldige Protokollzeile geschafft, eine Zeitabschaltung bei diesen Knoten hervorzurufen und sie aus den Cluster geworfen.

Das war einfacher, als wir dachten! Wir mussten nicht mal etwas mit den Kampagnen oder der Datenbank anstellen, um den ausgefallenen Cluster zu reproduzieren. Wenn ein Entwickler sich nicht darauf verlassen kann, dass eine einfache Protokollaktion nicht den Produktionserver vernichtet, hat er einen schlechten Tag. So wie wir am Mittwoch, den 15. Juli. Jetzt wo wir das Problem weiter abgegrenzt hatten, starteten wir Tranquility neu und gaben dann die Anweisung, den VIP-Modus abzuschalten und den Server wie gewohnt zu öffnen.

Wie bereits ein paar Mal in der Zeitachse weiter oben beschrieben, passierte dies nie zuvor oder seitdem auf einem anderen Testserver. Die Art, wie Tranquility funktioniert (oder konfiguriert ist) ist irgendwie einzigartig. Die Untersuchung, warum dieses Protokollverhalten nur auf Tranquility und nur in bestimmten Protokollkanälen auftaucht, wird fortgesetzt. Wir wissen, dass Tranquility mit Sicherheit auf einer anderen Skala arbeitet, was die Menge an Hardware angeht, bis jetzt legen andere Versuche jedoch nahe, dass es es sich hierbei nicht nur um eine Frage der Anzahl an Knoten handelt. Die Untersuchung wird fortgesetzt...

[img]http://content.eveonline.com/www/newssystem/media/67449/1/RaidersWarehouse.jpg[/img]
  • CCP Shadowcat (=^・^=)

Señor German Linguistic Owner |  @CCP_Shadowcat

Baby Leonie
Samsung Techwin
Kids With Guns Alliance
#4 - 2015-08-07 17:57:46 UTC
Moin,

danke für den Einblick hinter die Kulissen und Hut ab für die Offenheit bezüglich des Problems. Es gibt nur sehr wenig andere Unternehmen, die mir spontan einfallen würden, welche so offen über Fehler sprechen.

Gerade bei Problemen trifft eher selten auf Verständnis von Usern, wenn es um die Fehlfunktion des Equipments geht. Viel zu oft habe ich schon lesen müssen wie unqualifiziert die Mitarbeiter dann abgestempelt werden. Daher finde ich es wirklich gut, dass ihr dem User es ermöglicht wirklich zu verstehen wie solche Situationen gehandelt werden und wie aufwendig dies sein kann.

Persönlich hätte ich noch etwas mehr an Basisinformationen reingepackt um dem User die Zeiten noch etwas besser verständlich zu machen.

- Zeit für das erstellen des Hotfix/ Builds
- Masse an Daten die Dabei verarbeitet wird
- Wird eine Münze geworfen ob Backup oder nicht^^

So sind zumindest meine Erfahrungen wenn ich jemand derartige Probleme erklärt habe. Da das Verständnis auch unter den interessierten derartig weit auseinander geht, hilft manchmal das Motto: "Du kannst mit mir reden wie mit einem doofen, nur nicht so schnell^^"


Was euer Problem angeht:
Ich kenne diese Auswirkungen aus einem anderen Szenario dem Synchronisieren von 35.000 Usern + Attributen von einem Datenbank System zum anderen. Mit dem Testserver an der DB war alles problemlos, der Umzug auf eine UCS als VM brachte dann aber ähnlich unerwartete Fehler. Die VM hatte soviel Power mehr als der alte Server mit der DB, dass die Antwort (success) noch im gleichen Moment zurück kam, der Server diese aber nicht so schnell erwartet hat.
Das Resultat war, dass die VM auf der UCS ihre Maximale CPU Leistung atm ausgenutzt hat und nicht einmal mehr in der Lage war den Leistungsanstieg per Agent weiterzugeben. Am ende des Imports aber willkürlich 5-100 User gefehlt haben!

Möglicherweise liefert euer Protokollkanal der Kampagnen im Gegensatz zu dem normalen auch ein ungewolltest Feedback oder ein zu schnelles ;) Ich würde euch zustimmen, dass es nicht an der Anzahl der Knoten liegt sondern viel mehr an der vermutlich weitaus höheren Performance eines jeden einzelnen. Geschwindigkeit bringt eben nicht nur vorteile^^

Ist natürlich nur ins blaue gedacht, aber eventuell bringt es ja einen neuen Ansatz zur Fehlersuche Blink

Gruß Leonie

P.S: Wenn ihr jemand brauch um SISI niederzumachen, brauch ihr doch nur etwas zu sagen^^ Das oben ist nur ein seltsamen Problem gewesen. Im allgemeinen neige ich dazu Fehlfunktionen magisch anzuziehen. Dafür kann man sagen, was mich überlebt hat muss stabil sein. P

Tharin Ianthalas
Genetic Solution Laboratories
#5 - 2015-08-11 15:35:07 UTC
wow


ich bin beeindruckt, ich bin kein Fachmann und ich konnte dem ganzen folgen und es verstehen Smile

Ich möchte an dieser Stelle mal ganz **** DANKE sagen. So einen Einblick bekommt man wirklich selten und ich finde es klasse sowas lesen zu dürfen. Ich kann keinen Tipp geben, aber das was Baby Leonie geschrieben hat, das die Performance vielleicht zu schnell verarbeitet und es damit zu "Staus" kommt klingt nachvollziehbar.


Mein Fazit: Macht weiter so
Dai Chryss
C2 Tech
Belter's
#6 - 2015-08-12 12:48:30 UTC
Big smile ... Dank auch meinerseits. Hab ja auch schon eine Menge mitgemacht
was DT betrifft. Diese Form der Information sollte gerne beibehalten werden,
wenn sie in keiner Weise schädlich ist. Arrow StarCiTizen fällt mir da spontan ein.

Top weiter so Attention
Kapieli
Aliastra
Gallente Federation
#7 - 2015-08-12 22:09:02 UTC
Wirklich ätzend solche Fehler. Und da natürlich wirkt sich der Fehler nur auf dem System aus, an dem es den meisten Schaden anrichtet.

Murphy is strong in this one Cool

Und vielen Dank für die ausführlichen Informationen. Für mich ist das tatsächlich ein Grund immer wieder zu diesem Spiel zurück zu kehren. Die tiefen Einblicke in eure Arbeit und der Aufwand, den ihr betreibt um es wirklich ausführlich und strukturiert zu erklären sind bewundernswert. Selbst wenn der Account mal ruht, werden die Devblogs regelmäßig durchstöbert :)

Bitte macht weiter so und ich drücke euch die Daumen! Ihr packt das schon.