Zeitreihen, Metriken und Statistiken: Einführung in InfluxDB

  • Tutorial
Influxdb

Einleitung


Jeder Systemadministrator muss sich ständig mit Daten befassen, die in Form von Zeitreihen (Zeitreihen) dargestellt werden: Statistiken über Dateidownloads, Statistiken über Anforderungen an Server, Daten über die Nutzung von System- und Hardwareressourcen durch virtuelle Maschinen ...

Um all dies zu speichern und zu verarbeiten, benötigen Sie eine angemessene und effiziente Lösung Werkzeug.


Zum Speichern von Zeitreihen werden häufig spezielle Lösungen verwendet - die sogenannten (zeitlichen) Zeitreihen-Datenbanken. Wir haben bereits über ihre Vor- und Nachteile geschrieben  . Um die Mängel bestehender Lösungen zu beheben, haben wir sogar eine eigene Produktzeitreihendatenbank ( YAWNDB) entwickelt, die in unserem Überwachungssystem verwendet wird. Alle Zeitreihendatenbanken sind jedoch Low-Level-Datenbanken, und ihre Verwendung ist sehr begrenzt. Erstens erlauben sie nicht, Zeitreihen mit Daten anderer Typen zu kombinieren - zum Beispiel mit Wörterbüchern. Zweitens sind sie absolut nicht dafür ausgelegt, mit großen Datenmengen zu arbeiten. Die meisten temporären Datenbanken haben nicht einmal eine Abfragesprache. Daher wird die Standardaufgabe, jederzeit die erforderlichen Informationen anzufordern und zu erhalten, sehr komplex und nicht trivial. Natürlich kann es ohne eine Abfragesprache gelöst werden, aber nur Benutzer mit speziellen Kenntnissen und bemerkenswerten Programmierkenntnissen können es tun.

Zum Speichern von Zeitreihen werden heutzutage zunehmend sogenannte NoSQL-Datenbanken verwendet - sowohl die beliebten HBase- und Cassandra-Datenbanken als auch spezialisiertere Lösungen - beispielsweise OpenTSDB , KairosDB und  Acunu . Vielleicht ist diese Option in einigen Situationen gerechtfertigt, aber es ist unwahrscheinlich, dass sie zur Lösung der meisten praktischen Probleme geeignet ist. Alle oben aufgeführten Datenbanken arbeiten auf der Basis der Hadoop-Infrastruktur, und für ihre normale Funktionsweise sind eine Vielzahl von Abhängigkeiten erforderlich. Und mit der Leistung haben sie nicht alles so reibungslos, wie es auf den ersten Blick scheinen mag (für weitere Details siehe zum Beispiel hier ).

Wie kann das Problem des Speicherns von Zeitreihen, Metriken und Statistiken gelöst werden? Wir haben ernsthaft über dieses Problem nachgedacht, als wir die Option zum Speichern von Informationen zu Anfragen an unsere NS-Server ausgewählt haben.

Ganz unerwartet in der Diskussion unserer Post auf Habrahabr eines Leser empfohlen NoSQL Datenbank InfluxDB . Wir haben es versucht - und waren sehr zufrieden. In diesem Artikel möchten wir unsere Erfahrungen mit InfluxDB teilen.

allgemeine Informationen


Die in Go geschriebene InfluxDB-Datenbank (siehe GitHub-Repository ) ist ein neues Produkt: Ihre erste Veröffentlichung fand im Oktober 2013 statt. Es wird als Datenbank zum Speichern von Zeitreihen, Metriken und Ereignisinformationen positioniert.

Unter den Vorteilen von InfluxDB sollte zunächst Folgendes hervorgehoben werden:
  • Mangel an Abhängigkeiten (aufgrund der Tatsache, dass es in Go geschrieben ist);
  • die Fähigkeit, auch im Cluster-Modus zu arbeiten;
  • das Vorhandensein von Bibliotheken für eine große Anzahl von Programmiersprachen (Python, JavaScript, PHP, Haskell und andere);
  • SQL-ähnliche Abfragesprache, mit der Sie verschiedene Operationen mit Zeitreihen ausführen können (Kombinieren, Zusammenführen, Aufteilen in Teile);
  • komfortable grafische Oberfläche für die Arbeit mit der Datenbank.


InfluxDB verwendet die LevelDB- Datenbank als Low-Level-Speicher für Schlüssel-Wert-Paare . Zu diesem Zweck können Sie auch RocksDB (laut den Entwicklern von InfluxDB zeigt dieses Repository die beste Leistung - siehe Testbericht hier ) und  LMDB verwenden .

Sie können Daten auf verschiedene Arten in InfluxDB schreiben. Erstens können JSON-Daten über die HTTP-API übertragen werden. Zweitens unterstützt InfluxDB das Carbon- Protokoll, das im Graphite -Datenverarbeitungs- und Visualisierungstool verwendet wird . Drittens können Daten über UDP gesendet werden.

InfluxDB kann als Backend für Graphite verwendet werden, was die Leistung erheblich verbessern kann. Die Möglichkeit, mit dem Dashboard für Grafana-Metriken zu arbeiten, wird ebenfalls unterstützt (mehr dazu weiter unten).

Der unbestrittene Vorteil von InfluxDB besteht in den umfassenden Integrationsmöglichkeiten mit anderen Softwareprodukten, z. B. Fluentd- Protokollverarbeitungstools , CollectD- und  StatsD- Statistik- Daemons , Sensu- und  Shinken- Monitoring- Frameworks .

Client-Bibliotheken für JavaScript , Ruby , Ruby on Rails ,Python , Node.js , PHP , Java , Clojure , Common Lisp , Go , Scala , R , Erlang , Perl , Haskell , .NET (C #) .

Die Entwickler von InfluxDB arbeiten aktiv an der Entwicklung und Verbesserung des Produkts. Folgende Neuerungen sind für die nächsten Versionen geplant :
  • Hinzufügen eines binären Datenaustauschprotokolls;
  • Hinzufügen der Publisher-Subscriber-Schnittstelle (Pubsub): Hiermit können Sie jede Anforderung abonnieren und Daten in Form von Push-Benachrichtigungen empfangen, sobald sie eingehen.
  • die Fähigkeit, Spalten zu indizieren;
  • die Möglichkeit, benutzerdefinierte Funktionen mithilfe von Skripten in der Sprache Lua hinzuzufügen;
  • Hinzufügen von Sicherheitsfunktionen;
  • die Fähigkeit, Daten zusammenzuführen.


Installation


Installieren Sie Influx DB und sehen Sie, wie es in der Praxis eingesetzt werden kann. Wir werden Installations- und Konfigurationsverfahren zum Beispiel mit Ubuntu OC betrachten. Bei anderen Linux-Distributionen können diese abweichen (Details finden Sie in der offiziellen Dokumentation).

Führen Sie den folgenden Befehl aus:
# für 64-Bit-Systeme
$ wget http://s3.amazonaws.com/influxdb/influxdb_latest_amd64.deb
$ sudo dpkg -i influxdb_latest_amd64.deb


# für 32-Bit-Systeme
$ wget http://s3.amazonaws.com/influxdb/influxdb_latest_i386.deb
$ sudo dpkg -i influxdb_latest_i386.deb

Führen Sie nach Abschluss der Installation InfluxDB aus:

$ sudo /etc/init.d/influxdb start


Standardmäßig verwendet InfluxDB die Ports 8083, 8086, 8090 und 8099. Sie können auch andere Ports verwenden. Dazu müssen Sie die entsprechenden Änderungen an der Konfigurationsdatei vornehmen. Betrachten Sie die Konfigurationsfunktionen von InfluxDB genauer.

Setup und Konfiguration


Alle InfluxDB-Einstellungen werden in der Konfigurationsdatei /opt/influxdb/current/config.toml gespeichert. Sie sind in die folgenden Gruppen unterteilt:


[Protokollierung] - Protokollierungsparameter (Protokollierungsstufe und Name der Protokolldatei werden angezeigt);
[admin] - Webinterface-Einstellungen (der Port, auf dem der interne Webserver ausgeführt wird, und der Pfad zu den Webinterface-Dateien);
[api] - HTTP-API-Einstellungen;
[input_plugins] - Einstellungen für die Eingabe von Daten aus externen Quellen (Sie können Daten, die an Graphite gesendet werden sollen, an InfluxDB übertragen; Sie können in diesem Abschnitt auch die Dateneingabe über UDP konfigurieren)
[Floß] - Einstellungen des RAFT-Verhandlungsprotokolls ;
[storage] - allgemeine Einstellungen für die Datenspeicherung;
[cluster] - Einstellungen für die Arbeit im Cluster-Modus (diese werden weiter unten ausführlicher beschrieben;
[wal] - Einstellungen für den Fortschritt der Protokollierung (Write Ahead Logging, WAL).


Erstellen Sie eine Datenbank


Öffnen Sie nach Abschluss der Installation die Seite localhost: 8083 im Browser. Wir werden ein Webinterface für die Arbeit mit Datenbanken sehen. So sieht es aus:

Influxdb

Geben Sie nun Login (root) und Passwort (root) ein (die Anfangswerte können vor dem ersten Start in der Konfigurationsdatei festgelegt werden) und klicken Sie dann auf die Schaltfläche Verbinden. Folgendes Fenster öffnet sich: Die

Influxdb

grafische Oberfläche von InfluxDB ist einfach und intuitiv. Lassen Sie uns einige wichtige Punkte beachten, die beim Erstellen der ersten Datenbank berücksichtigt werden sollten.
Um das Lesen von Daten auf Anfrage zu vereinfachen und zu beschleunigen, ist es besser, die Datenbank in Komponenten eines kleinen Volumens aufzuteilen - die sogenannten Shards (englische Shards).

Um eine Basis zu erstellen, müssen Sie angeben, welche Shard-Bereiche in die Komposition einbezogen werden sollen. Daten können zunächst nach Zeitintervallen in Shards unterteilt werden. Wenn wir beispielsweise Informationen zu Benutzeraktionen in der Datenbank speichern, ist es bequemer, sie in Zeiträume zu unterteilen. Beispielsweise werden Daten für alle 7 Tage in einem separaten Shard gespeichert. Die Länge des Zeitraums wird im Abschnitt Dauer angegeben. Die Aufbewahrungsspalte gibt die Haltbarkeit der Scherbe an.

Shards können auch mit regulären Ausdrücken gebildet werden. Wenn wir in der Datenbank Metriken für Benutzer des Formulars log.user speichern., dann wird für jeden Benutzer ein separater Shard erstellt - dazu müssen Sie den regulären Ausdruck /^log.user.*/ setzen.

Beim Erstellen einer Datenbank können Sie Parameter für die Arbeit in einem Cluster angeben. Die RF-Spalte (diese Abkürzung steht für Replikationsfaktor) gibt an, wie viele Knoten eine Kopie jedes Shards im Shard-Bereich gespeichert werden soll. Die Spalte Teilen gibt an, in wie viele Shards Sie die Daten für einen bestimmten Zeitraum aufteilen müssen.

Damit jeder Server im Cluster jederzeit für die Aufzeichnung aktueller Daten bereit ist, wird empfohlen, den Wert des Replikationsfaktors mithilfe der folgenden Formel zu berechnen:

RF = NoS / Split 

(RF-Replikationsfaktor, NoS-Anzahl der Server)

Der Algorithmus, der der Aufteilung der Daten in Shards zugrunde liegt, umfasst die folgenden Schritte:

1. Das Programm durchsucht alle Shard-Bereiche in der Datenbank.
2. Anschließend durchläuft er mit einem Zyklus alle Shard-Räume und sucht den Raum, dem die neuen Daten entsprechen.
3. Danach werden alle Shards für ein bestimmtes Zeitintervall angezeigt.
4. Wenn keine Shards vorhanden sind, werden N Shards erstellt (N ist die in der geteilten Spalte angegebene Nummer).
5. Daten werden mit dem Hash-Algorithmus (series_name)% N in den Shard geschrieben.

Es wird empfohlen, den Shard auf eine kleine Zeitgröße (Dauer) festzulegen .
Wenn Sie die Aufbewahrungszeit des Shards auf inf (d. H. Unendlich) einstellen, wird dieser Shard niemals gelöscht.
Nachdem Sie alle erforderlichen Einstellungen vorgenommen haben, klicken Sie auf die Schaltfläche Datenbank erstellen.

Arbeiten Sie in einem Cluster


Im Cluster-Modus bilden mehrere InfluxDB-Server ein einziges System. Jeder Clusterknoten kann Lese- und Schreibanforderungen annehmen. Um die Arbeit im Cluster zu organisieren, wird das RAFT-Verhandlungsprotokoll verwendet. In dieser Präsentation wird eine klare und grafische Erklärung des Funktionsprinzips gegeben  .

Laut offizieller Dokumentation wird in der aktuellen Version die Arbeit in einem Cluster nur im Testmodus unterstützt. Die vollständige Implementierung ist für eine der folgenden Versionen (0.9 oder 0.10) geplant.

Die Dokumentation sagt nichts darüber aus, wie die Clustereinstellungen in die Konfigurationsdatei geschrieben werden. Wir werden daher auf diesen Punkt im Detail eingehen. Um den Cluster zu konfigurieren, benötigen Sie:

1. Starten Sie den ersten InfluxDB-Knoten mit allen erforderlichen Einstellungen, jedoch ohne den Parameter seed-servers in der Konfigurationsdatei (Abschnitt cluster).

2. Auf dem zweiten und allen nachfolgenden Knoten wird die IP-Adresse des ersten Servers, die unabhängig gestartet werden muss, als Wert des Parameters seed-servers angegeben:
seed-servers = ["IP-Adresse des ersten Servers: 8090"]

Wenn der Server bereits ohne Einstellung des Parameters seed-servers gestartet wurde, müssen Sie vor dem Hinzufügen zum Cluster alle InfluxDB-Daten daraus löschen (Standarddatenpfad: / opt / influxdb / shared / data /).
Beim Hinzufügen eines neuen Knotens können Sie die IP-Adresse eines beliebigen Servers angeben, der bereits Teil des Clusters ist.
Geben Sie den Hafen wie im Abschnitt [Floß] an (standardmäßig - 8090).

Benutzerrechteverwaltung


Die Möglichkeiten zum Verwalten von Benutzerrechten über die grafische Oberfläche sind sehr begrenzt: Sie können nur die einfachsten Vorgänge zum Hinzufügen und Entfernen von Benutzern ausführen und den vollständigen Zugriff (mit Administratorrechten) gewähren.

Feinere Einstellungen für den Datenzugriff können nur über die API festgelegt werden. Der Zugriff auf Metriken wird in Form von regulären Ausdrücken implementiert.

Um den Zugriff zu ändern, müssen Sie eine POST-Anforderung im JSON-Format an eine URL der folgenden Form senden : influxdb.host : 8086 / db / < Basisname > / users / <Benutzername>.

In schematischer Form sieht die Abfragestruktur folgendermaßen aus:

{
"readFrom": "<regulärer Ausdruck>",
"writeTo": <regulärer Ausdruck>
}


Hier ist ein Beispiel für einen Befehl zum Ändern der Zugriffseinstellungen:

$ curl 'http://influxdb.host:8086/db/seriousmetrics/users/grafana?u=root&p=root' -XPOST -d '{"writeTo": "^ $", "readFrom": ". *" } '


Mit dem Befehl können Sie die aktuellen Regeln anzeigen

$ curl 'http://influxdb.host:8086/db/seriousmetrics/users/grafana?u=root&p=root&pretty=true'


{
 "name": "grafana",
 "isAdmin": false,
 "writeTo": "^ $",
 "readFrom": ". *"
}


Aus der Ausgabe geht hervor, dass der Grafana-Benutzer alle Metriken lesen kann ("*"), aber nichts schreiben kann ("^ $").

Integration mit Grafana


Grafana

Grafana ist ein praktisches Dashboard zum Abrufen und Visualisieren von Metriken. Es gibt fast keine Veröffentlichungen in russischer Sprache, mit Ausnahme einer sehr kleinen Anmerkung zu Habré .

Speziell für diejenigen, die sehen möchten, wie InfluxDB in Verbindung mit Grafana funktioniert, haben wir ein Skript (Playbook) für Ansible erstellt und auf GitHub veröffentlicht .
Um einen Testlauf durchzuführen, klonen Sie das Repository über den obigen Link, geben Sie in der Hostdatei die IP-Adressen der Maschinen an, die Teil des Clusters sein werden, und führen Sie dann das Skript run.sh aus. Bitte beachten Sie, dass die Konfigurationsbeschreibung für Influxdb im nativen Ansible YAML-Format festgelegt ist, aus dem dann die TOML-Datei generiert wird.

Fazit


Aufgrund unserer eigenen (wenn auch noch nicht sehr umfangreichen) Erfahrung gelangten wir zu dem Schluss, dass InfluxDB eine interessante und vielversprechende Lösung ist, die für den praktischen Einsatz empfohlen werden kann. Wir hoffen, dass Sie nach dem Lesen unseres Artikels auch InfluxDB besser kennenlernen möchten.

Wenn einer von Ihnen InfluxDB bereits verwendet, laden wir Sie ein, Ihre Erfahrungen in den Kommentaren mitzuteilen.

Leser, die aus dem einen oder anderen Grund hier keine Kommentare hinterlassen können, sind in unserem Blog willkommen .

Jetzt auch beliebt: