Die Sache mit der Quota und den Datenbanken

Posted by moritz on Monday, June 22, 2015

Quota ist die technische Bezeichnung für die Menge an Speicherplatz, die dir zur Verfügung steht. Alle Uberspaces haben eine Quota von zehn GB. Falls diese Überschritten wird, legen wir eine Woche lang noch ein GB drauf, danach ist aber wirklich Schluss. In dem Fall schicken wir eine Mail an den Systemuser und sobald die Quota wieder unterschritten ist gibt’s natürlich auch eine Entwarnung per Mail.

Die Quota bezieht alles mit ein: Dein Home-Verzeichnis ~/ (und damit auch deine Mails), deinen DocumentRoot /var/www/virtual/$USER, deine Dateien unter /tmp und eben auch deine Datenbanken.

Zumindest in der Theorie.

Im Unterschied zu deinen Daten in den erst genannten Verzeichnissen, läuft auf jedem Server eine globale mysqld-Instanz, die die Datenbanken aller User beinhaltet. Und hier wird’s ein bisschen kniffelig:

Wie wir bisher mit der Quota umgegangen sind

Versucht der mysqld zu schreiben wenn die Quota überschritten ist, unterscheidet er nicht zwischen “quota voll” und “Platte voll”, spuckt waiting 60 seconds for some free space ... ins Log und blockiert sämtliche schreibvorgänge auf allen Datenbanken auf dem Server und legt damit effektiv den Großteil aller gehosteten Seiten lahm. Und das ist ziemlich doof.

In der Praxis haben wir die Datenbankgröße bei der Berechnung der Quota also bisher nicht berücksichtigt. Auch, wenn wir das so kommuniziert haben (man möge uns die kleine Notlüge an dieser Stelle verzeihen 😋).

Kleiner Exkurs in unsere Skripte

Diejenigen, die unsere Systeme gut kennen (Hint: wir machen unsere Skripte unter /usr/local/bin und /usr/local/sbin nicht umsonst für alle lesbar), werden unsere Skripte vielleicht schon kennen. Alle, die schon mal eine automatisierte Mail von uns bekommen haben, sind zumindest schon mal mit ihnen in Berührung gekommen. Wir haben da eine ganze Batterie an kleinen Helfern, die beispielsweise kontrollieren, ob die Rechte für dein Home-Verzeichniss noch stimmen (und diese ggf. korrigieren), ob alle Daemons noch laufen (und diese ggf. stoppen) oder prüfen, wie lange aufgeschaltete TLS-Zertifikate noch gültig sind (ung ggf. Erinnerungsmails verschicken). Ein anderes Beispiel: Da wir in der Vergangenheit immer mal wieder Probleme mit der Quota nach einem Reboot hatten, setzen wir die Quota kurzerhand für jeden User auf jedem Host im Zuge unserer Skripte bei jedem Durchlauf - das ist alle fünf Minuten:

[root@andromeda ~]# grep RUNWHEN /service/uberspace-account-healthcheck/run
RUNWHEN=",M/5,S=30"
[root@andromeda ~]# cat /service/uberspace-account-healthcheck/log/main/current | grep next | tai64nlocal | tail
2015-06-22 18:51:27.043763500 next run time: 2015-06-22 18:55:55.000000000
2015-06-22 18:56:27.195782500 next run time: 2015-06-22 19:00:55.000000000
2015-06-22 19:01:27.007127500 next run time: 2015-06-22 19:05:55.000000000

Für alle die es genau wissen wollen: Die Skripte liegen unter /usr/local/etc/checks und werden von /usr/local/sbin/uberspace-account-healthcheck aufgerufen. Aus Sicherheitsgründen da wo es geht als User, da wo es eben nicht geht, als root.

Wie wir es ab jetzt machen

Neuerdings sammeln wir die Größe aller Datenbanken pro User ein und speichern die weg - auch hier alle fünf Minuten über eines der Skripte: /usr/local/etc/checks/user_as_root/get_mysql_size schreibt die kombinierte Größe aller Datenbanken nach /readonly/$USER/healthcheck/mysql_size/all_databases (die Datei ist für dich lesbar, wie alles unter /readonly/$USER). Wenn wir die Quota nun über /usr/local/etc/checks/user_as_root/set_quota setzen, ziehen wir ab sofort die Größe der Datenbanken ab und voilà - das Problem ist, wenn auch ein bisschen von hinten durch die Brust ins Auge, gelöst: die Datenbank ist zwar immer noch schreibbar, alles andere aber unter Umständen nicht mehr und das sollte für die meisten User genug Strafe sein.

Für eine Übergangszeit werden wir nur die Quota entsprechend der Größe der Datenbanken anpassen, grace aber bei elf GB belassen. Damit geben wir euch effektiv eine Woche Zeit, evtl. zu große Datenbanken aufzuräumen, bevor es wirklich ernst wird. Danach gibt es aber keine Ausreden mehr und ihr hört im Zweifelsfall von unseren Skripten 😊.