Das von Tobias Oetiker entwickelte Programm RRDtool[2] hat sich zum Quasi-Standard bei der Speicherung von Netzwerk-Überwachungsdaten gemausert. Es legt seine Daten in so genannten Round-Robin-Datenbanken (RRD) ab, die von Frontends wie Cacti[3] genutzt werden. Ein Round-Robin-Archiv (RRA) stellt man sich am besten wie in Abbildung 1 dargestellt vor.
Abbildung 1: Das Round-Robin-Archiv hält eine feste Anzahl von Datenwerten vorrätig und überschreibt alte Werte, um Platz für neue zu schaffen.
Dort liegen auf einer begrenzten Anzahl von Speicherplätzen die bei einem Webserver ermittelten Lastwerte, angefangen beim Wert 6,1 um 01:00 Uhr (oben Mitte), dann - im Uhrzeigersinn - eine Last von 2,0 um 01:01 Uhr, bis schließlich zu dem um 01:04 Uhr gespeicherten Wert 2,4. Der Zeiger deutet auf den zuletzt aktualisierten Eintrag.
Das Ergebnis der nächsten Messung passt aber nicht mehr ins Archiv - deshalb wird, wie Abbildung 2 zeigt, die Messung von 01:00 Uhr mit dem neuen Wert 4,1 von 01:05 Uhr überschrieben. Nun ist der Admin aber nicht nur an Messwerten der letzten 5 Minuten interessiert, sondern möchte auch sehen, wie sich die Rechnerlast über die letzten dreißig Tage oder die zurückliegenden zwölf Monate entwickelt hat.
Gewollt unscharf
Auch dafür braucht er keine riesigen Datenmengen vorzuhalten, denn über größere Zeiträume hinweg ist eine gewisse Unschärfe akzeptabel. Der Trick ist, weitere RRAs anzulegen, die die Durchschnittslast (oder die Höchstlast, ganz nach Geschmack) pro Stunde für den letzten Tag oder pro Tag für das laufende Jahr aufnehmen. Sind diese Round-Robin-Archive erst einmal in der RRD-Datei angelegt, füttert RRDtool neue Messwerte hinein, und zwar per Kommandozeilenaufruf oder über die mitgelieferte Perl-Schnittstelle.
Der darunter liegende Datenbankmotor sorgt automatisch dafür, dass die Kreise mit den verschiedenen Granularitäten die richtig aufpolierten Daten erhalten. Spätere Abfragen liefern auch die Werte über einen angegebenen Zeitraum in der höchsten verfügbaren Genauigkeit und RRDtool zeichnet davon sogar formschöne Grafiken.
RRDtool in Perl-Skripten verwenden
Die Definition einer Round-Robin-Datenbank besteht aus einer oder mehreren Datenquellen (DS, Data Sources). Für jede einzelne Quelle gibt der RRD-Administrator beim Anlegen der Datenbank vier Parameter an: Einen Namen, einen Datenquellentyp, die Breite des Eingabe-Zeitfensters sowie die minimalen und maximalen Eingangswerte.
Der Name (zum Beispiel »load« oder »mem_usage«) identifiziert die Eingabedatenquelle in der RRD eindeutig. Über den Datenquellentyp (DST, Data Source Type) legt der Admin fest, ob die Eingabewerte einfach übernommen werden (»GAUGE«) oder von einem stetig wachsenden Zähler stammen, den RRDtool bei einem Überlauf sinnvoll behandelt (»COUNTER«). Das Programm fängt den Überlauf dann ab und nutzt den zuletzt gespeicherten Wert, um die Zählreihe fortzuführen.
Purzeln in der durch die Breite des Eingabe-Zeitfensters bestimmten Zeit mehrere Daten herein, wird der Mittelwert berechnet und abgespeichert. Trifft in diesem Zeitraum kein einziger Wert ein, speichert RRDtool ein »na« (not available). Alle Messwerte, die jenseits der minimalen und maximalen Eingangswerte liegen, ignoriert es.
Folgender Perl-Code legt eine Datenbank an, die ihre Einträge aus der Eingabequelle namens »load« bezieht, die wiederum alle 60 Sekunden Infos über die aktuelle Rechnerlast liefert:
use RRDs;
RRDs::create(
"/tmp/load.rrd", "--step=60",
"--start=" . time() - 10,
"DS:load:GAUGE:90:0:10.0",
"RRA:MAX:0.5:1:5",
"RRA:MAX:0.5:5:10");
Leider gibt es noch kein intuitives objektorientiertes Interface für RRDtool, der etwas kryptisch anmutende Code ist daher sehr erklärungsbedürftig. In der Datei »/tmp/load.rrd« legt RRDtool die Datenbank ab. Das vorgegebene Eingabeintervall ist 60 Sekunden (über die Option »--step=60«). In diesen Zeitabständen werden später die Daten in das Archiv eingespeist.