Wir haben dir bereits in unserem Tutorial zu MySQL Datenbank erstellen und löschen und PostgreSQL 10 auf Ubuntu 16.04 / 14.04 installieren gezeigt, wie du objektrelationale SQL-Datenbanken auf deinem Ubuntu-Server installierst und einrichtest. Ebendies haben wir dir auch für objektrelationale NO-SQL Datenbanken wie MongoDB, Redis und RethinkDB in unseren Tutorials MongoDB auf Ubuntu installieren, Apache Cassandra auf Ubuntu installieren, Redis auf Ubuntu 16.04 LTS installieren und RethinkDB auf Ubuntu installieren nahe gebracht. In diesem Tutorial geht es nun um ein Open Source-Produkt, das an das Konzept einer Datenbank angelehnt ist, sich aber von den bisher durch uns vorgestellten Modellen der SQL- und NO-SQL-Datenbanken abhebt. Ich werde dich in den folgenden Kapiteln mit InfluxDB vertraut machen. Solltest du mit der Installation, dem Einrichten und/oder der Nutzung von InfluxDb bereits betraut sein, können für dich weiterführend die Tutorials InfluxDB – Monitoring mit dem TICK-Stack oder InfluxDB – Monitoring mit dem TIG-Stack interessant und hilfreich sein, da es auch direkt an das in diesem Tutorial beschriebene Anwendungsszenario anknüpft.
Neu! – Autoscale MySQL-as-a-Service von Tech4Hosting
Alle, die sich nicht mehr mit Datenbank-Administration auseinandersetzen wollen, können jetzt auch die neuen Platform Services von Tech4Hosting nutzen.
Der Vorteil der Platform Services bei Tech4Hosting: Wir kümmern uns um die sichere Konfiguration, den zuverlässigen Betrieb und die Installation von Sicherheitsupdates deiner PaaS-Dienste. In deinem Tech4Hosting Panel kannst du ab sofort mit den Datenbanken PostgreSQL, MySQL und redis starten.
Probiere es einfach mal aus!
Mehr Infos zu PaaS bei Tech4Hosting und wie PaaS funktioniert gibt es in unserem
Getting started mit PaaS bei Tech4Hosting
Platform Services von Tech4Hosting.
Zu InfluxDB
Mit InfluxDB wird eine komplette Open Source-Plattform angeboten, die für Metriken, Ereignisse und andere zeitbasierte Daten von Menschen, Sensoren oder Maschinen und deren Verarbeitung, bzw. Auswertung entwickelt wurde. In Echtzeit können Daten gesammelt, gespeichert, visualisiert und Erkenntnisse in Aktionen umgesetzt werden. Es handelt sich sozusagen um eine moderne Zeitreihen-Plattform. InfluxDB differenziert sich somit vom Modell einer SQL- oder NoSQL-Datenbank, da dieses Produkt als Plattform fungiert und nicht auf einen SQL- oder NoSQL-Speicher beschränkt ist. Da sich Compute-Infrastruktur und -Architekturen als Konsequenz neuer Anforderungen und Bedürfnisse weiterentwickeln, genügen bestehende Technologien meist nicht, um die damit verbundenen neuen Anforderungen zu erfüllen (Big Data und das Aufkommen von HDFS und Hadoop). Und da die bisherige Technologie der Datenspeicherung in SQL- und NoSQL-Speichern diesen nicht gerecht wurde, wurde InfluxDB entwickelt. InfluxDB bietet für die Speicherung von Zeitreihendaten in einer Zeitreihen-Datenbank eine zweckmäßige und moderne Zeitreihen-Plattform. Die Transparenz und Kontrolle von Zeit gehören zum Zeitalter der Digitalisierung und Instrumentierung, in der Echtzeitverarbeitung datengesteuerten Organisationen Einblicke und Wettbewerbsvorteile verschaffen können. Als eine End-to-End-Plattform kann InfluxDB in der Cloud oder per Download bereitgestellt werden, elegant und einfach zu bedienen, frei von externen Abhängigkeiten, aber offen und flexibel genug für komplexe Implementierungen. Die Analyse der Daten erfolgt über eine SQL-ähnliche Abfragesprache.
Man kann seine Daten sogar mit dem integrierten Open-Source-Projekt Chronograf grafisch darstellen und visualisieren und eine somit eine Untersuchung im Sinne von Daten-Plotting durchführen. Hierzu wirst du im vorletzten Kapitel dieses Tutorials mehr erfahren. Darüber hinaus unterstützt InfluxDB andere Visualisierungswerkzeuge wie Grafana.
Anwendungsszenario
Um dir ein Gefühl für die Arbeit mit der Datenbank-Plattform InfluxDB zu geben, werde ich mit dir einen Real-Live Case simulieren, bei dem wir uns im Anschluss die in eine angelegte Datenbank integrierten Datenpunkte visuell analysiert plotten lassen werden. Hierzu nehme ich mit dir die Perspektive eines Unternehmens ein, das Wert darauf legt, seine über den Online-Shop stattfindenden Verkaufsaktivitäten als Messung in Relation zur Zeit, sowie den Tatsachen, wie alt die Person ist (INTEGER) und letztlich eingekauft wurde oder nicht (Boolean TRUE/FALSE) als Messwerten und schließlich zu demographischen Daten wie dem Geschlecht und dem Standort sowohl seiner bereits existierenden Kunden als auch potentieller Kunden zu betrachten. Aus den sich aus Besucher-Tracking-Zeitreihen ergebenden Datenpunkten können möglicherweise interessante Informationen ermittelt und auf Basis dieser Informationen zukünftige Online-Marketingstrategien (z.B. Newsletter, Social-Media) und Usability-Maßnahmen entwickelt und/oder optimiert werden. Das Projekt soll sozusagen helfen, die Psychologie des Online-Shoppings zu verstehen, indem Einkaufsphasen und die dahinter stehenden Kunden in bestimmten Kontexten erkannt werden. Es ist – wie schon erwähnt – ein an die Realität angelehntes Fallbeispiel, dass dir lediglich zur Orientierung dienen soll. InfluxDB kann natürlich nicht nur für gewerbliche Zwecke sehr hilfreich sein, sondern auch für private oder auf Bildung ausgelegte Projekte jeglicher Art genutzt werden, um Zeitreihen basierte Zusammenhänge von Datenmengen wiederauffindbar, bewachbar, analysierbar, auswertbar und visualisierbar zu machen.
Zur Simulation des Szenarios werde ich die Datenpunkte mittels der aus der SQL-Datenbanksprache bekannten INSERT-Operation sozusagen als Indexer in die betreffende Messung implementieren. Mit Ausblick auf einen Real-Life Case darfst du dir vorstellen, dass die pro Datenpunkt enthaltenen Informationen direkt auf der Website getrackt und über eine im Hintergrund agierende Software automatisiert an die Datenbank kommuniziert wurden. Wobei die persönlichen Informationen zu Geschlecht und Alter über eine für den Besucher unumgängliche Interface-Abfrage auf der Website abgefangen wurden. Ich beschränke mein Zeitreihen-Szenario auf ein Zeitfenster, das Datenpunkte zum 17.04.2018 im Zeitraum 13:00 bis 13:15 enthält und diese im Epoch-Zeitformat auf Minuten bestimmt getrackt wurden.
Voraussetzungen
Die Nutzung von InfluxDB setzt das Vorhandensein der Netzwerkports 8086 und 8088 auf deinem System voraus, wobei der TCP-Port 8086 für die Client-Server-Kommunikation über die HTTP-API von InfluxDB verwendet wird und der TCP-Port 8088 für den RPC-Dienst zum Sichern und Wiederherstellen.
Neben diesen beiden Ports bietet InfluxDB mehrere Plugins, die möglicherweise benutzerdefinierte Ports erfordern. Es ist möglich alle Port-Zuordnungen über die Konfigurationsdatei zu ändern. Die Port-Zuordnungen befinden sich bei Standardinstallationen in der Datei /etc/influxdb/influxdb.conf. Informationen darüber, wie du diese Datei editieren kannst, findest du im Kapitel InfluxDB konfigurieren.
Die unten stehende Tabelle bietet dir einen guten Überblick über mögliche Ports.
Port |
Bedeutung |
---|---|
8086 |
Der Standardport, auf dem der HTTP-Dienst InfluxDB ausgeführt wird. Du kannst diesen Port in der Konfigurationsdatei konfigurieren, indem du bind-address = „127.0.0.1:8086“ setzt. Umgebungsvariable: INFLUXDB_HTTP_BIND_ADDRESS |
8088 |
Der Standardport, auf dem der RPC-Dienst zum Sichern und Wiederherstellen ausgeführt wird. Du kannst diesen Port in der Konfigurationsdatei konfigurieren, indem du bind-address = „127.0.0.1:8088“ setzt. Umgebungsvariable: INFLUXDB_HTTP_BIND_ADDRESS |
2003 |
Der Standardport, auf dem der Graphite-Dienst ausgeführt wird. Du kannst diesen Port in der Konfigurationsdatei konfigurieren, indem du bind-address = „127.0.0.1:2003“ setzt. Umgebungsvariable: INFLUXDB_GRAPHITE_0_BIND_ADDRESS |
4242 |
Der Standardport, auf dem der OpenTSDB-Dienst ausgeführt wird. Du kannst diesen Port in der Konfigurationsdatei konfigurieren, indem du bind-address = „127.0.0.1:4242“ setzt. Umgebungsvariable: INFLUXDB_OPENTSDB_BIND_ADDRESS |
8089 |
Der Standardport, auf dem der UDP-Dienst ausgeführt wird. Du kannst diesen Port in der Konfigurationsdatei konfigurieren, indem du bind-address = „127.0.0.1:8089“ setzt. |
25826 |
Der Standardport, auf dem der Collect-Dienst ausgeführt wird. Du kannst diesen Port in der Konfigurationsdatei konfigurieren, indem du bind-address = „127.0.0.1:25826“ setzt. |
aktivierte Ports |
deaktivierte Ports |
Bei InfluxDB dienen Zeitstempel zur Koordination und zur Zuordnung von Daten, wobei die lokale Zeit eines Hosts in UTC genutzt wird. Um eine Ungenauigkeit der Zeitstempel der in INfluxDB geschriebenen Daten zu vermeiden, ist es nötig, die Zeit zwischen Hosts mittels Verwendung des Network Time Protocol (NTP) zu synchronisieren.
InfluxDB installieren
Zunächst musst du das InfluxDB-Repository mit den folgenden drei Befehlen hinzufügen.
> curl -sL https://repos.influxdata.com/influxdb.key | apt-key add -
> source /etc/lsb-release
> echo "deb https://repos.influxdata.com/${DISTRIB_ID,,} ${DISTRIB_CODENAME} stable" | tee /etc/apt/sources.list.d/influxdb.list
Sowohl für Ubuntu-Versionen unterhalb Ubuntu 15.04+ als auch die darüber liegenden Versionen, müsstest du für die Installation von InfluxDB das unten stehende Kommando im Terminal ausführen.
> apt-get update && sudo apt-get install influxdb
Nach der Installation ist es noch notwendig, dass du InfluxDB startest. Der hierfür zu verwendende Command unterscheidet sich bei Ubuntu-Versionen unterhalb Ubuntu 15.04+ von denen, deren Version darüber liegt. Im Fall von Ubuntu-Versionen unterhalb Ubuntu 15.04+ wäre für den Start die Kommandozeile richtig, wie sie im Code-Block unten zu sehen ist.
> service influxdb start
Mit Ubuntu-Versionen ab Ubuntu 15.04+ allerdings wird das Hintergrundprogramm systemd im Kommando berücksichtigt, das den Start von InfluxDB umsetzt. Somit sollte das Kommando für den Start von InfluxDB so aussehen, wie im unten eingeblendeten Code-Snippet demonstriert.
> systemctl start influxdb
InfluxDB konfigurieren
Für die Einstellung jeder Konfigurationsdatei stellt das System interne Standardeinstellungen bereit. Via dem unten gezeigten Command kannst du dir die Einstellungen im nano-Editor ansehen und bei Bedarf editieren.
> nano /etc/influxdb/influxdb.conf
Die meisten Einstellungen in der lokalen Konfigurationsdatei /etc/influxdb/influxdb.conf sind auskommentiert. Alle auskommentierten Einstellungen werden durch die internen Standardeinstellungen bestimmt. Alle unkommentierten Einstellungen in der lokalen Konfigurationsdatei überschreiben die internen Standardeinstellungen. Beachte, dass die lokale Konfigurationsdatei nicht bereits alle Konfigurationseinstellungen enthalten muss.
Bevor du mit InfluxDB arbeiten kannst, also z.B. um (eine) Datenbank(en) anzulegen, zu löschen oder zu editieren oder Daten zu analysieren, musst du InfluxDB einmalig mit deiner Konfigurationsdatei starten.
Hierbei gibt es zwei Möglichkeiten:
1. Richte den Prozess mit der Option -config auf die richtige Konfigurationsdatei aus.
> influxd -config /etc/influxdb/influxdb.conf
8888888 .d888 888 8888888b. 888888b.
888 d88P" 888 888 "Y88b 888 "88b
888 888 888 888 888 888 .88P
888 88888b. 888888 888 888 888 888 888 888 888 8888888K.
888 888 "88b 888 888 888 888 Y8bd8P' 888 888 888 "Y88b
888 888 888 888 888 888 888 X88K 888 888 888 888
888 888 888 888 888 Y88b 888 .d8""8b. 888 .d88P 888 d88P
8888888 888 888 888 888 "Y88888 888 888 8888888P" 8888888P"
2018-04-04T23:03:51.641110Z info InfluxDB starting {"log_id": "07GjHMMG000", "version": "1.5.1", "branch": "1.5", "commit": "cdae4ccde4c67c3390d8ae8a1a06bd3b4cdce5c5"}
2018-04-04T23:03:51.641142Z info Go runtime {"log_id": "07GjHMMG000", "version": "go1.9.2", "maxprocs": 4}
run: open server: listen: listen tcp 127.0.0.1:8088: bind: address already in use
2. Setze die Umgebungsvariable INFLUXDB_CONFIG_PATH in Relation zu dem Pfad deiner Konfigurationsdatei und starte den Prozess.
> echo $INFLUXDB_CONFIG_PATH /etc/influxdb/influxdb.conf
> influxd
8888888 .d888 888 8888888b. 888888b.
888 d88P" 888 888 "Y88b 888 "88b
888 888 888 888 888 888 .88P
888 88888b. 888888 888 888 888 888 888 888 888 8888888K.
888 888 "88b 888 888 888 888 Y8bd8P' 888 888 888 "Y88b
888 888 888 888 888 888 888 X88K 888 888 888 888
888 888 888 888 888 Y88b 888 .d8""8b. 888 .d88P 888 d88P
8888888 888 888 888 888 "Y88888 888 888 8888888P" 8888888P"
2018-04-04T23:43:31.184743Z info InfluxDB starting {"log_id": "07GlYaS0000", "version": "1.5.1", "branch": "1.5", "commit": "cdae4ccde4c67c3390d8ae8a1a06bd3b4cdce5c5"}
2018-04-04T23:43:31.184777Z info Go runtime {"log_id": "07GlYaS0000", "version": "go1.9.2", "maxprocs": 4}
run: open server: listen: listen tcp 127.0.0.1:8088: bind: address already in use
InfluxDB funktioniert so, dass zunächst die Konfiguration über die Option -config überprüft wird und im Anschluss daran die über die Umgebungsvariable.
Des Weiteren musst du sicherstellen, dass die Verzeichnisse, in denen Daten und das Write Ahead-Protokoll (WAL) gespeichert sind, für dich schreibbar sind, bevor du den InfluxDB-Dienst ausführst. Sprich, du musst du prüfen, ob diese Verzeichnisse existieren. Für den Fall, dass die Daten- und WAL-Verzeichnisse nicht beschreibbar sind, wird der InfluxdDB-Service nämlich nicht gestartet. Beide sollten im Verzeichnis /var/lib/influxdb liegen. Im Terminal kannst du dir die darin befindlichen Verzeichnisse mit den beiden folgenden Kommandos anzeigen lassen und somit deren Beschreibbarkeit garantieren.
> cd /var/lib/influxdb
> ls
In InfluxDB eine Datenbank anlegen, nutzen oder löschen
Um mit InfluxDB zu arbeiten, kannst du die influx-Befehlszeilenschnittstelle (CLI) nutzen, die in allen InfluxDB-Paketen enthalten ist und eine leichte und einfache Möglichkeit bietet, mit der Datenbank zu interagieren. Die CLI kommuniziert direkt mit InfluxDB, indem standardmäßig Anfragen an die InfluxDB-HTTP-API über Port 8086 gestellt werden. Daher stellt Influx standardmäßig eine Verbindung zu Port 8086 und localhost her. Wenn du diese Standardwerte ändern musst, führe den Command influx –help im Terminal aus.
Schließlich kannst du die CLI über den influx-Command – wie ich es dir im Code-Block unten zeige – starten und somit eine Verbindung zur lokalen InfluxDB-Instanz herstellen. Am daraufhin generierten Output kannst du erkennen, dass der korrekte Port 8086 angetriggert worden ist und auch die Version der InfluxDB wird dir angezeigt.
In meinem Beispiel nutze ich zusätzlich zum influx-Command das Argument -precision. Dieses gibt das Format/die Genauigkeit von zurückgegebenen Zeitstempeln an. Im obigen Beispiel teilt das Attribut rfc3339 InfluxDB mit, dass Zeitstempel im RFC3339-Format zurückgegeben werden sollen, was wiederum dem Format YYYY-MM-DDTHH:MM:SS.nnnnnnnnnZ entspricht.
> influx -precision rfc3339
Connected to http://localhost:8086 version 1.5.x
InfluxDB shell version: 1.5.x
Solltest du Zeitstempel im Format Unix-Epoch bevorzugen, dann sollte hingegen nach -precision ein Element aus der Liste [h, m, s, ms, u, ns] folgen. Zum Beispiel bekommst du Epoch in Stunden, wenn den Command so angibst, wie im Code-Snippet unten veranschaulicht.
> influx -precision s
Connected to http://localhost:8086 version 1.5.x
InfluxDB shell version: 1.5.x
Mittels dem EXIT-Command kannst du die CLI wieder verlassen oder auch jede andere Datenbank, die du in InfluxDB erzeugt hast.
Um eine Datenbank anzulegen, nutzt du den CREATE DATABASE-Command, wie ich dir im Code-Snippet unten veranschauliche, in dem ich die Datenbank OnlineMarketDevelopment anlege.
> CREATE DATABASE OnlineMarketDevelopment
Mittels dem SHOW DATABASES-Command ist es dir möglich, die alle existierenden Datenbanken ausgeben zu lassen.
> SHOW DATABASES
name: databases
name
----
_internal
OnlineMarketDevelopment
Um eine Datenbank hingegen zu löschen, wird der DROP DATABASE-Command genutzt. Hätte ich in der Zwischenzeit noch zusätzlich die Datenbank HumanResources angelegt und würde diese wieder löschen wollen, würde mein Command so aussehen.
> DROP DATABASE HumanResources
Wenn du schließlich eine spezielle Datenbank mit Inhalten füllen, nach Inhalten durchsuchen oder nach Inhalten analysieren willst, dann musst du explizit mit dem USE-Command in die betreffende Datenbank wechseln. Solange du dann nicht den EXIT-Command ausführst, werden alle Operationen lediglich auf die in meinem Beispiel gezeigte Datenbank OnlineMarketDevelopment ausgeübt.
> USE OnlineMarketDevelopment
Using database OnlineMarketDevelopment
Als Hinweis ist noch wichtig, dass du InfluxDB nicht nur über die CLI nutzen kannst, sondern auch direkt über rohe HTTP-Anfragen mittels der curl-Applikation. Im Terminal würde der Befehl für eine Anfrage über einen POST-Request im Endpunkt /query resultieren und dann dem Schema folgen, wie ich es dir im Code-Block unten präsentiere, wobei nach q= jedes Datenbank-Kommando – bis auf den USE-Command ausgeführt werden kann, das ich bereits in den oben gezeigten Code-Snippets über die CLI durchgeführt habe und XXX sozusagen als Platzhalter zu interpretieren ist.
> curl -i -XPOST http://localhost:8086/query --data-urlencode "q=XXX"
Angewendet auf den DROP-Command, würde die Kommandozeile als rohe HTTP-Anfrage dann so aussehen, wie du dem Code-BLock unten entnimmst.
> curl -i -XPOST http://localhost:8086/query --data-urlencode "q=DROP DATABASE HumanResources"
HTTP/1.1 200 OK
Content-Type: application/json
Request-Id: c53a00b6-3caa-11e8-8018-000000000000
X-Influxdb-Build: OSS
X-Influxdb-Version: 1.5.1
X-Request-Id: c53a00b6-3caa-11e8-8018-000000000000
Date: Tue, 10 Apr 2018 10:34:38 GMT
Transfer-Encoding: chunked
{"results":[{"statement_id":0}]}
In InfluxDB eine Datenbank mit Inhalten füllen und nach Inhalten durchsuchen
Nachdem wir gemeinsam die Datenbank OnlineMarketDevelopment erstellt und uns mittels dem USE-Command Zugang zu dieser verschafft haben, ist InfluxDB bereit, Anfragen und Schreibvorgänge in dieser zu akzeptieren.
Den Datenspeicher in InfluxDB darfst du dir so vorstellen, dass die Daten nach Zeitreihen gegliedert sind, sodass sie eine zeitabhängige Folge von Datenpunkten bilden. Die Datenpunkte wiederum beziehen sich auf eine Messung. Im Sinne des von mir vorgestellten Anwendungsszenarios könnte das z.B. die Messung mit der Bezeichnung SalesActivity sein. Zeitreihen können null bis viele Datenpunkte haben, wobei jeder Datenpunkt für eine Stichprobe der Metrik steht. Datenpunkte bestehen aus der Zeit (ein Punkt ist zu verstehen als ein Zeitstempel), mindestens einem Feld-Schlüssel-Wert-Paar (dem hinter der Messung SalesActivity stehenden Werten selbst, z. B. age=52i und buying=FALSE) und Null oder vielen Tag-Schlüssel-Wert-Paaren, die Metadaten zum Messwert enthalten (z. B. gender=“male“ region=“EMEA“ und dc=“koeln“). EMEA als Wert des Feld-Schlüssels region stünde dann für den Wirtschaftsraum Europa, Naher Osten und Afrika.
Im Hinblick auf die Integration in der Datenbank-Plattform kann man sich eine Messung konzeptionell als eine SQL-Tabelle vorstellen, bei der der Primärindex, bzw. Primärschlüssel immer die Zeit in Form des Zeitstempels ist. Tags und Felder sind als Spalten in der Tabelle zu verstehen. Tags werden indiziert und Felder nicht. Nullwerte werden nicht gespeichert.
Punkte werden in InfluxDB unter Verwendung des Leitungsprotokolls geschrieben. Das Format gleicht dem, das du dem im Code-Block unten integrierten Muster entnimmst, wobei die in ()-Klammern stehenden Bezeichnungen als Platzhalter zu interpretieren sind und die []-Klammern lediglich zur Wahrung der Übersichtlichkeit innerhalb der Syntax dienen. Es ist aus dem Muster im Code-Snippet unten gut ersichtlich wie die Tag-Schlüssel-Wert-Paare von den Feld-Schlüssel-Wert-Paaren bei der Zuordnung zur Messung kenntlich gemacht werden. Wenn nach der Messung ein Komma folgt, dann ist mindestens ein Tag vorhanden. Solltest du allerdings kein(e) Tag-Schlüssel-Wert-Paar(e) verwenden, dann folgt nach der Messung – lediglich getrennt durch ein Leerzeichen – unmittelbar das/die Feld-Schlüssel-Wert-Paar(e). Allgemein folgt das erste Feld-Schlüssel-Wert-Paar nie auf ein Komma. Sowohl die Tag-Schlüssel-Wert-Paare als auch die Feld-Schlüssel-Wert-Paare werden – sobald es sich um mehr als eins handelt – durch Komma gelistet. Hier musst du darauf achten, dass dazwischen keine Leerzeichen stehen, da es ansonsten zu einer Fehlermeldung kommt.
*Messung*[,(Tag-Schlüssel)=(Tag-Wert),...] (Feld-Schlüssel)=(Feld-Wert)[,(Feld2-Schlüssel)=(Feld2-Wert),...][Unix-Nanosekunden-Zeitstempel]
In der Tabelle unten findest du alle Parameter dieser Syntax gelistet im Zusammenhang mit deren Bedarf, deren Bedeutung und Datentyp.
Element der Syntax |
optional vs. erforderlich |
Bedeutung |
Datentyp |
---|---|---|---|
Messung |
erforderlich |
Name der Messung. Entspricht konzeptionell einem Namen, den man einer SQL-Tabelle geben würde. Beim INSERT eines Datensatzes wird – gemäß der Syntax – eine Messung pro Datenpunkt akzeptiert. |
String |
Tag-Sammlung |
optional |
Alle Tag-Schlüssel-Wert-Paare des Datenpunktes. |
Sowohl Schlüssel als auch Werte werden jeweils als String integriert. |
Feld-Sammlung |
erforderlich > Ein Datenpunkt muss mindestens einem Feld zugeordnet werden können. |
Alle Feld-Schlüssel-Wert-Paare des Datenpunktes. |
Feld-Schlüssel werden jeweils als String eingebunden und Feld-Werte jeweils als String, Integer, Float oder Boolean. |
Zeitstempel |
optional > Falls dieser nicht beim INSERT des Datensatzes gesetzt wird und somit nicht im Datenpunkt enthalten ist, verwendet InfluxDB den lokalen Nanosekunden-Zeitstempel des Servers in UTC. |
Beim INSERT eines Datensatzes wird – gemäß der Syntax – ein Zeitstempel pro Datenpunkt akzeptiert. |
Unix-Nanosekunden-Zeitstempel |
Wenn du den Datentyp Boolean für bestimmte Feld-Werte nutzen möchtest, dann beachte, dass sowohl TRUE als auch FALSE in InfluxDB auf unterschiedliche Weise interpretiert werden können. Die unten stehende Tabelle gibt dir einen schnellen Überblick zu den Möglichkeiten der Boolean-Syntax. Hieraus entnimmst du, dass beim Schreiben von Datenpunkten (via INSERT-Operation) jeweils zwei Schreibweisen mehr für die beiden Boolean-Werte genutzt werden können als beim Lesen von Datenpunkten (z.B. via SELECT-Statement). Diese beiden jeweils für TRUE und FALSE zusätzlich nutzbaren Schreibweisen werden beim Lesen von Datenpunkten zwar als entsprechender Boolean-Wert interpretiert, aber sind lediglich über die in der Spalte ganz rechts aufgeführten Schreibweisen erreichbar.
Boolean |
akzeptierte Schreibweisen in InfluxDB bei INSERT-Operationen |
akzeptierte Schreibweisen in InfluxDB bei SELECT-Operationen |
---|---|---|
TRUE |
t, T, true, True oder TRUE |
true, True oder TRUE |
FALSE |
f, F, false, False, FALSE |
false, False, FALSE |
Die bereits aus SQL bekannte INSERT-Operation wird auch bei InfluxDB genutzt, um in eine Messung bzw. in eine konzeptionelle SQL-Tabelle Datenpunkte einzubinden. Dem unten eingeblendeten Code-Snippet kannst du nachempfinden, wie solch ein INSERT angewendet auf die Messung SalesActivity aussehen kann. In dem von mir über die CLI durchgeführten INSERT-BeIspiel setze ich den Zeitstempel des Datenpunktes selbst, nämlich im Epoch-Format in Sekunden. Wenn man den jeweils zu einem integrierten Datenpunkt gehörenden Zeitstempel nicht implementiert, wird er in InfluxDB automatisch auf Basis der aktuellen Zeit gesetzt. Im Hinblick auf Zahlen, also Zahlen, die dem Datentyp INTEGER angehören, solltest du berücksichtigen, dass bei ihrer Implementierung ein i suffigiert werden muss, da sie ansonsten als Gleitkommazahl interpretiert werden. Diese Konvention gilt allerdings nur für ganze Zahlen. Gleitkommazahlen, also Zahlen, die dem Datentyp FLOAT angehören, sind davon nicht betroffen und werden in der Datenbank direkt als solche erkannt. In der Datenbank sind die Werte für ganze Zahlen dann als ganze Zahlen gespeichert, ohne das nachfolgende i. Es spielt – wie gesagt – lediglich bei der Implementierung eine Rolle. Im Code-Snippet unten heißt es dann für das Feld age nicht age=52, sondern age=52i. Zudem solltest du die Konvention beibehalten, dass du in einem INSERT alle als Datentyp STRING vorgesehenen Werte in Anführungszeichen setzt, um sie explizit als solche von anderen Datentypen differenzierbar zu machen. Würdest du dies nicht tun, also wären alle Werte nicht in Anführungszeichen gesetzt, würde auch zwangsläufig der Feld-Wert in age=52i als String „52i“ erkannt werden und nicht als Zahl 52i. Folglich müsste der komplette INSERT so aussehen, wie im Code-Block unten demonstriert.
> INSERT SalesActivity,region="EMEA",dc="koeln",gender="male" age=52i,buying=FALSE 1523962800
Auch das Schreiben von Daten – also auch die INSERT-Operation ist via rohen HTTP-Anfragen möglich. Hierbei mündet der POST-Request allerdings nicht im Endpunkt /query, sondern im Endpunkt /write. Und hier wird der in der CLI anwendbare USE-Command nicht ausgeführt, sondern bereits direkt im Anschluss an den Endpunkt /write via ?db= angetriggert. In der HTTP-Anfrage unten könnte ich den Zeitstempel auch selbst setzen, aber ich tue dies nicht, sodass er automatisch in InfluxDB vergeben wird.
> curl -i -XPOST 'http://localhost:8086/write?db=OnlineMarketDevelopment' --data-binary 'SalesActivity,region="EMEA",dc="koeln",gender="male" age=52i,buying=FALSE'
HTTP/1.1 200 Ok
Content-Type: application/json
Request-Id: 3afe35d0-3c14-11e8-8048-000000000000
X-Influxdb-Build: OSS
X-Influxdb-Version: 1.5.1
X-Request-Id: 3afe35d0-3c14-11e8-8048-000000000000
Date: Mon, 09 Apr 2018 16:37:02 GMT
Über die CLI kannst du dir dann mittels dem SELECT-Statement Datensätze wiedergeben lassen. Es funktioniert genauso, wie bei einer SQL-Abfrage. Nach dem SELECT werden die Spalten gelistet, deren Inhalte gefunden werden sollen, mittels dem FROM wird die Verortung der Spalten angetriggert, was konzeptionell der betreffenden SQL-Tabelle entsprechen würde und in InfluxDB der betreffenden Messung SalesActivity. Wäre die Messung SalesActivity bereits mit vielen Datenpunkten gefüllt, könntest du zusätzlich noch die WHERE-Bedingung einsetzen, um die Treffermenge zu spezifizieren.
> SELECT "region", "gender", "age", "dc", "buying" FROM "SalesActivity"
name: SalesActivity
time region gender age dc buying
---- ------ ------ --- -- ------
1523962800 "EMEA" "male" 52 "koeln" false
Würdest du für das SELECT die rohe HTTP-Anfrage nutzen, sähe das Kommando so aus, wie unten im Code-Block zu entnehmen. Nun stellst du eine GET-Request an den /query-Endpunkt, legst den URL-Parameter db als Zieldatenbank fest, und bettest deine Anfrage in q= ein.
curl -GET 'http://localhost:8086/query?pretty=true' --data-urlencode 'db=OnlineMarketDevelopment' --data-urlencode 'q=SELECT "region", "gender", "age", "dc", "buying" FROM "SalesActivity"'
{
"results": [
{
"statement_id": 0,
"series": [
{
"name": "SalesActivity",
"columns": [
"time",
"region",
"gender",
"age",
"dc",
"buying"
],
"values": [
[
"2018-04-17T13:00:00Z",
""EMEA"",
""male"",
52,
""koeln"",
false
],
]
}
]
}
]
}
Wie du bereits weißt, werden Zeitstempel in InfluxDB standardmäßig in RFC3339 UTC zurückgegeben und haben eine Genauigkeit im Nanosekundenbereich. Wenn du Zeitstempel im Format Unix-Epoch verwenden möchtest, dann binde zusätzlich in deine Anfrage den Parameter epoch=”x” gefolgt von –data-urlencode ein, wobei x ein Platzhalter ist, den du mit einem Element aus der Liste [h, m, s, ms, u, ns] festlegen musst. Zum Beispiel bekommst du Epoch in Sekunden, wenn dein Command so aussieht, wie im Code-Snippet unten präsentiert.
curl -GET 'http://localhost:8086/query?pretty=true' --data-urlencode 'db=OnlineMarketDevelopment' --data-urlencode 'epoch=s' --data-urlencode 'q=SELECT "region", "gender", "age", "dc", "buying" FROM "SalesActivity"'
{
"results": [
{
"statement_id": 0,
"series": [
{
"name": "SalesActivity",
"columns": [
"time",
"region",
"gender",
"age",
"dc",
"buying"
],
"values": [
[
1523962800,
""EMEA"",
""male"",
52,
""koeln"",
false
]
]
}
]
}
]
}
Nachdem ich dir im Kontext des zu Beginn des Tutorials vorgestellten Anwendungsszenarios gezeigt habe, wie du eine Datenbank in InfluxDB erstellst und diese mit Messungen und dazugehörenden Datenpunkten befüllst, widme ich mich nun schließlich dem Teil des Anwendungsszenarios, in dem es um die visuelle Aufbereitung und dem Monitoring integrierter Datensätze geht. Hierzu werde ich Chronograf verwenden, das wiederum – neben InfluxDB – Bestandteil eines Stacks ist. Die beschriebene Fortsetzung des Anwendungsszenarios wird dir – wie bereits zu Beginn des Tutorials erwähnt – in unserem Tutorial zum Thema InfluxDB – Monitoring mit dem TICK-Stack bereitgestellt. Grafana ist ein weiteres Tool zum Plotten und Monitoring deiner Daten. Auch hierzu biete ich dir ein Tutorial an, in dem ich das eingeführte Anwendungsszenario umsetze, nämlich im Tutorial InfluxDB – Monitoring mit dem TIG-Stack.
Fazit
Du hast nun einen Einblick bekommen, wie sich Zeitreihen basierte Datenspeicherung und -auswertung mittels InfluxDB umsetzen und mit den damit in Verbindung stehenden Stack-Komponenten managen lässt. Dieses Tutorial hat dir sowohl eine solide Basis für das Verständnis über die Datenbank-Plattform InfluxDB sowie deren Installation und Einrichtung geschaffen, als auch einen Ausblick auf die Nutzung ihrer Features geboten. Du bist fähig, die gelernten Inhalte anzuwenden, im besten Fall für spannende Projekte – sei es für den Beruf, für die Schule, Lehre, Universität oder private Zwecke – auszuweiten und in die Möglichkeiten, die dir InfluxDB bietet, hineinzuwachsen. Ich wünsche dir gutes Gelingen und vor allem aber auch viel Spaß bei der Arbeit mit InfluxDB.
Aus unserer Rubrik zu Open Source Datenbanken und Datenbank-Plattformen auch noch interessant und hilfreich:
- Neo4j unter Ubuntu 16.04/18.04 installieren und einrichten
- ArangoDB unter Ubuntu 16.04 installieren und einrichten
- OrientDB unter Ubuntu 16.04/18.04 installieren und einrichten
- Elasticsearch und der ELK-Stack unter Ubuntu 16.04/18.04
- Apache CouchDB unter Ubuntu 16.04/18.04 installieren und einrichten
- Microsoft SQL Server unter Ubuntu 16.04/18.04 installieren und einrichten