Echtzeit-Statistiken für Webserver mit StatsD und Graphite

Vor nicht allzu langer Zeit haben wir über unsere Server-Infrastruktur berichtet. Seither können wir bis zu einem gewissen Punkt unsere Webserver in beliebiger Anzahl skalieren. Mit dem verteilten System bemerkten wir allerdings, dass Probleme und erhöhte Auslastung nur schwer nachvollziehbar sind.  Wir zeigen euch, wie wir dieses Problem mit Statistiken in Echtzeit lösen.

Jeder, der mit verteilten Software-Systemen arbeitet, kennt die Herausforderung: Im normalen Tagesbetrieb sind bei uns vier Server im Einsatz. Sie stellen die Websites von rund 120 Kunden bereit. Tritt irgendwo ein Problem auf, etwa eine aussergewöhnlich hohe Auslastung, ist im ersten Moment nur schwer nachvollziehbar, welcher oder welche Webseiten betroffen sind oder von Spam-Bots attackiert werden. Es ist möglich, die Ursache zu finden; ohne Analysewerkzeuge braucht das aber seine Zeit. Da unsere Infrastruktur in den letzten Monaten stark gewachsen ist, war es an der Zeit ein Echtzeit-Tracking über alle unsere Webserver einzuführen.

Installation

Ein Tipp verwies uns auf Graphite. Graphite ist eine auf Python basierende Lösung, die aus Zählern und Timern Grafiken generiert. Eine einfache URL-API bietet viele Funktionen und Parameter. Diese können über beliebig lange Zeiträume konfiguriert werden: Also etwa die Page Impressions pro Server pro Minute oder die Anzahl erkannter Spam-Kommentare pro Monat über die letzten zwei Jahre. Für letzteres braucht man natürlich die entsprechenden Messdaten. Für Graphite sind folgende Komponenten nötig und sollten auf einem separaten Webserver installiert werden:

  1. StatsD, ein auf node.js aufgebautes Tool, welches Messdaten über UDP in Empfang nimmt. Es ist der Anlaufpunkt der Software, deren Daten getrackt werden.
  2. Die Software, in unserem Fall das Social Media Kit, muss  Werkzeuge zur Verfügung stellen, um die Daten per UDP an node.js zu senden. Wir verwenden die Klasse, welche auch in den PHP Code-Beispielen von StatsD genutzt wird.
  3. Nun wird der Graphite Stack, bestehend aus dem Carbon Cache und dem Graphite Web-Interface, installiert. Wir haben dazu die Anleitung von kinvey.com verwendet. Sie enthält die Installation von StatsD.
  4. Graphite bietet selbst ein Webinterface, welches aber eingeschränkt nutzbar ist und nicht besonders schön aussieht. Als Frontend für das Dashboard haben wir uns für Graphiti entschieden. Graphiti sieht gut aus und erlaubt, die Grafiken über ein JSON-Objekt zu konfigurieren. Das ist viel besser lesbar als eine URL mit diversen Parametern.
  5. Graphiti läuft auf Ruby on Rails, deshalb installieren wir erstmal Ruby.
  6. Der letzte Punkt beinhaltet die Installation eines Redis Servers, In Ubuntu 12.04 LTS geht das mit sudo apt-get install redis-server recht einfach. Nun ist das aufsetzen und konfigurieren von Graphiti keine grosse Sache mehr.

Mit den erwähnten Anleitungen kann man die gesamte Infrastruktur in Betrieb nehmen. Wir können zwar sehr gut mit PHP umgehen, aber haben wenig Erfahrung mit Python, Ruby on Rails, node.js oder einem Redis Server. Da sind solche Anleitungen Gold wert.

Anwendungsfälle

Unser erster Anwendungsfall: PHP-Requests. Wir wollen wissen, welcher Kunde auf welchen Servern wie viele Backend- und Frontend-Requests generiert. Damit haben wir bereits einen ersten Indikator bei Besucheranstürmen oder einer Spambot-Attacke. Die Grafiken lassen sich manuell in Echtzeit oder automatisiert alle 60 Sekunden erstellen. Die Intervalle im Auto-Mode können verändert werden. Mit diesen Grafiken sehen wir nun eine erhöhte Last auf den Webservern sehr früh und erkennen, welche Webseiten betroffen sind. Für längere Zeiträume kann man Grafiken der Requests pro Stunde, Tag oder Monat erstellen.

Die Daten misst folgende Methode in Graphite-Modul, welches sich in einem Social Media Kit-Plugin befindet:

Die vier StatsD::increment Aufrufe sind simple Zähler. Der erste zeichnet die Requests pro Website auf, die Methode „getSiteField()“ liefert in diesem Falle z.B. www_blogwerk_com. Der zweite Aufruf zeichnet Requests pro Server auf. Die Methode „getServerField()“ gibt hier einen für Graphite präparierten Hostnamen der ausführenden Maschine zurück. Weiter unten unterscheiden wir auf die einfachste Art und Weise noch zwischen einen Front- oder Backend Request.

In kritischen Situationen könnte man vorübergehend jeden Datenbank- oder Memcache-Zugriff aufzeichnen, um zu sehen wo Probleme oder Flaschenhälse liegen. Das alles macht das einfache Protokoll UDP möglich. Da wir mit StatsD über UDP Daten versenden, ergibt dies auch bei mehreren hundert aufgezeichneten Werten pro PHP-Aufruf kaum eine zeitliche Verzögerung. Eine Amazon EC2 Small Instance mit sehr schwacher Hardware kann in einer Sekunde rund 80‘000 Datenpunkte aufzeichnen. Natürlich sollte man ein so intensives Tracking trotzdem nicht permanent in die Software einbauen.

Hands-On

Nun wisst Ihr, wie man einen Graphite Stack installiert und wie man mit PHP Daten sammeln kann. Natürlich ist die Installation abhängig vom Betriebssystem. Wir haben Ubuntu 12.04 LTS im Einsatz. Im nächsten Beitrag dieser Serie werden wir euch die Graphite URL API etwas näher bringen, um mit den gesammelten Daten sinnvolle Grafiken zu produzieren.

Michael Sebel

Michael Sebel ist Software-Entwickler bei Blogwerk AG.

 

In dieser Serie

Beispiel einer Grafik aus Graphiti

Auswertung von Graphite-Statistiken mit Graphiti

26.02.2013 – Im ersten Beitrag dieser Serie ging es darum mit StatsD und Graphite Daten zu sammeln. Doch was stellen wir nun damit an? In diesem Beitrag zeige ich euch ein paar Beispiele wie man mit dem Graphite Frontend Graphiti aussagekräftige Grafiken darstellen kann. » weiterlesen

Ein Kommentar

  1. Thomas Bruhin sagt:

    Interessanter und sehr verständlich geschriebener Artikel. Gratulation an den Verfasser!

Schreiben Sie einen Kommentar

Wir sind sehr an einer offenen Diskussion interessiert, behalten uns aber vor, beleidigende Kommentare sowie solche, die offensichtlich zwecks Suchmaschinenoptimierung abgegeben werden, zu editieren oder zu löschen. Mehr dazu in unseren Kommentarregeln.

Pflichtfelder
OK
Bitte geben Sie Ihren Namen ein.
OK
Bitte geben Sie Ihre E-Mail-Adresse ein.
OK
Bitte geben Sie einen korrekte Website ein.
OK
Bitte geben Sie einen Kommentar ein.