Wo geht der ganze Traffic hin?


Die meisten Fehler bei der Entwicklung werden erst unter ganz unerwarteten und unglücklichen Umständen deutlich. Heute hatte ich mal wieder so einen klassischen Fall.

Vor ungefähr einer Woche ist die Datenbankreplikation ausgefallen, das kann passieren und ist auch nicht weiter wild da der Datenbankslave eigentlich nur für Notfälle und Datenbankbackups da ist. Vorgestern hab‘ ich die Replikation wieder angeworfen und der Slave fing auch brav an seine verpasste Woche nachzuholen. Gestern der Blick auf den Datentransfer: 25MBit, doppelt so viel wie sonst und dummerweise auch noch steigend. Ein iftop zeigt mir, dass die Daten auf meinen Backupserver wandern, der die neuen Bilder von instantgallery sichert. Dieser Mechanismus funktioniert folgendermaßen:
Alle Bilder sind in einer Datenbanktabelle eingetragen. Diese Tabelle enthält einen Flag ob das Bild schon gesichert wurde oder nicht. Die Spalte mit dem Flag hat leider keinen Index, das nachträgliche Hinzufügen eines solchen würde bei einer Tabelle mit mehreren Millionen einträgen einen Lock von mehreren Minuten bedeuten, was ich auf dem Livesystem nicht ohne Not machen würde und deshalb nur auf der Replikation gemacht hatte. Das Backupscript wird jetzt alle 5 Minuten per cron gestartet und fragt die Slave-DB welche Bilder neu sind, sichert diese und schreibt anschließend auf die Master-DB dass sie gesichert wurden, welche das wiederum auf den Slave repliziert. Dummerweise hängt der Slave aber gerade eine Woche hinterher und bekommt das erst mit, wenn er diese Woche nachgearbeitet hat. Das Backupscript bekommt also mit jedem Durchlauf eine immer länger werdende Liste von Bildern die zwar schon gesichert sind, aber noch nicht als gesichert markiert sind. Irgendwann ist die Liste so lang, dass das Backupscript sie nicht in 5 Minuten abarbeiten kann, ein zweiter Backupprozess der wieder mehr als 5 Minuten brauchen wird startet und im Handumdrehen laufen da auch schon 5 Backups parallel, fressen Bandbreite, fressen Performance und sichern dabei nur Daten die schon längst gesichert sind.

Dumm gelaufen und hätte man verhindern können wenn
– das Backupscript unabhängig selber merken würde dass die Daten schon gesichert sind
– das Backupscript merken würde, dass es schon läuft oder statt cron einfach immer laufen würde
– vorausschauend gleich einen Index gesetzt und auf dem Master gearbeitet hätte
– statt Flag in der Bildertabelle ein anderes Datenbankdesign gewählt hätte

Naja, wieder was gelernt 🙂

Traffic
Traffic
Advertisements

Kommentar verfassen

Trage deine Daten unten ein oder klicke ein Icon um dich einzuloggen:

WordPress.com-Logo

Du kommentierst mit Deinem WordPress.com-Konto. Abmelden / Ändern )

Twitter-Bild

Du kommentierst mit Deinem Twitter-Konto. Abmelden / Ändern )

Facebook-Foto

Du kommentierst mit Deinem Facebook-Konto. Abmelden / Ändern )

Google+ Foto

Du kommentierst mit Deinem Google+-Konto. Abmelden / Ändern )

Verbinde mit %s