LF08 - Daten systemübergreifend bereitstellen

1 Container-Virtualisierung

Bevor wir anfangen, Software-Projekte zu planen, beschäftigen wir uns mit einer inzwischen sehr weit verbreiteten Methode, mit der sich Server-Dienste sehr einfach über Container starten lassen.

Zum Kapitel Docker...

2 Time-Series-Datenbanken[1]

Am Beispiel von InfluxDB[2]. Diese Datenbank zählt zu den NoSQL-Datenbanken und speichert die Daten im Gegensatz zu einer relationalen Datenbank schemalos. Das bedeutet, dass keine Tabellen angelegt werden sondern sich die Struktur aus den Daten selbst ergibt. Daher eignet sie sich für die Speicherung von Messwerten, da sie mit einer zeitlichen Auflösung im Nanosekundenbereich schneller ist als eine SQL-Datenbank und Daten mit einer SQL-ähnlichen Abfragesprache auch automatisch einfacher zusammengefasst werden können. Wie bei relationalen Datenbanken ist eine genaue Planung der Speicherung für die spätere Auswertbarkeit zwingend erforderlich. Zudem gibt es zahlreiche Konnektoren, z.B. für NodeRed, ESP8266 und Grafana.

Weitere Informationen:

2.1 Installation

Achten Sie bei produktivem Einsatz einer InfluxDB auf eine Absicherung und ein User-Management!

2.1.1 Docker-Container

  1. Starten Sie einen InfluxDB-Container: https://hub.docker.com/_/influxdb in der Version 1.8.6.
    Erstellen Sie dabei für die Datenbank ein Volume.
    docker run -d --name influxdb -p 8086:8086 -v influxdbdata:/var/lib/influxdb influxdb:1.8.6
    Alternativ: Einbindung in Stack.
  2. Öffnen Sie die Kommandozeile in diesem Container. docker exec -it influxdb bash
  3. Starten Sie dort das CLI der Datenbank influx -precision rfc3339

2.1.2 Lokale Installation

InfluxDB ist für alle gängigen Server-Betriebssystem erhältlich - die aktuelle Version leider nicht mehr für Windows.

  1. Installieren Sie InfluxDB, indem Sie diese zip-Datei entpacken[3]. Weitere Versionen und andere Programme finden Sie hier.
  2. Starten Sie die Datenbank durch Ausführen des Dienstes: C:\influx-1.8.6-n>influxd.exe. Das Fenster darf nicht geschlossen werden. Der Dienst kann mit Strg+C beendet werden.
  3. Öffnen Sie eine weitere Eingabeaufforderung und starten Sie mit C:\influx-1.8.6-n>influx.exe -precision rfc3339 das CLI (Command Line Interface) der Datenbank. Durch den Parameter werden die Timestamps in einem verständlichen Format ausgegeben.
    Verlassen Sie später das CLI mit exit.

2.2 Daten erfassen

Zur Speicherung muss zunächst eine Datenbank angelegt werden create database datenbankname. Danach muss diese Datenbank ausgewählt werden use datenbankname.

Jetzt können beliebige Datenpunkte eingefügt werden. Hierbei muss der Name der Messungen angeben werden (z.B. 'temp'), was in etwa der Tabelle im relationalen Datenmodell entspricht. Ein Datenpunkt besteht hierbei aus:

  • tag value - z.B. 'Bad' (entspricht dem Spaltennamen)
  • field value - die Messwerte, Standard ist der Datentyp float, andere sind möglich, nach der ersten Speicherung muss der Typ beibehalten werden
  • timestamp - optional, wenn er fehlt, wird er automatisch vom Server übernommen

Hier einige Beispiele:
insert temp,ort=Bad,sensor=1 value=22.8
insert temp,ort=Bad,sensor=1 value=23.2 1613415973169237754 - hier wurde ein Timestamp angegeben
insert pres,ort=Bad,sensor=1 value=825

Datenpunkt können nach ihrer Speicherung nicht mehr verändert oder gelöscht werden.

  1. Legen Sie über das CLI eine neue Datenbank an und fügen Sie ca. zwanzig beliebige Datenpunkte gemäß obigem Beispiel mit unterschiedlichen Tag Values, Field Values und Werten ein.
  2. Schreiben Sie mit dem ESP8266 Daten direkt in die InfluxDB
    1. Installieren Sie in der Arduino-IDE über die Bibliotheksverwaltung die Erweiterung 'ESP8266 influxdb' von Tobias Schürg[4]
    2. Öffnen Sie 'Datei - Beispiele - ESP8266 - BasicWrite'
    3. Schreiben Sie in regelmäßigen Zeitabständen Werte in die InfluxDB. Nutzen Sie dazu entweder einen Poti, Zufallszahlen oder inkrementierte Werte.

2.3 Daten auswerten

Zur Auswertung der Daten steht die Abfragesprache InfluxQL zur Verfügung, die stark an SQL angelehnt ist. Mit dem Befehl show measurements können die Messungen aus der Datenbank ausgegeben werden. Genauere Informationen zu den Inhalten erhält man mit den Befehlen show series, show tag keys und show field keys. Die Daten lassen sich dann mit SELECT-Abfragen ausgeben - z.B. select * from temp - und mit where und group by einschränken und gruppieren.

  1. Erstellen Sie verschiedene Abfragen auf die Daten, die folgendes ausgeben:
    1. alle Daten in der 'temp'-Messung
    2. alle Daten in der 'temp'-Messung, die Werte enthalten
    3. alle Daten des Sensors 1 in der 'temp'-Messung
    4. alle Daten in der 'temp'-Messung aus dem Bad
    5. alle Daten in der 'temp'-Messung, bei denen der Wert im Bad unter 21°C liegt
    6. alle Daten in der 'temp'-Messung gruppiert nach Ort
    7. alle Daten in der 'temp'-Messung, die in den letzten 30 Minuten geschrieben wurden
  2. Daten importieren
    1. Laden Sie die Datei https://s3.amazonaws.com/noaa.water-database/NOAA_data.txt herunter und speichern Sie diese im Verzeichnis der Influx-Datenbank. Diese Datenbank enthält 15.258 Datenpunkte zur Wasserqualität an zwei Orten, die zwischen dem 17.08.2019 und 17.09.2019 erhoben wurden.
    2. Importieren Sie die Datei mit dem Befehl influx -import -path=NOAA_data.txt -precision=s
  3. Dokumentieren Sie die Struktur der beiden Datenbanken mit den oben genannten Befehlen.

Links:

2.4 Daten automatisiert weiterverarbeiten

Mit Continous Queries können Daten von mehreren Messung zu einem neuen Messwert zusammengefasst werden und anschließend mit einer Retention Policy automatisiert gelöscht werden.

Links:

Arbeitsauftrag:

  1. Zeigen Sie zunächst die Datenpunkte Ihrer Datenbank an. Halten Sie fest, wie diese zusammengefasst werden sollen. Erstellen Sie anschließend eine Abfrage, die die Datenpunkte sinnvoll zusammenfasst und kontrollieren Sie das Ergebnis.

2.5 Daten visualisieren

Influxdata stellt ein eigenes Visualisierungs-Tool names Chronograf zur Verfügung, allerdings lassen sich ebenso andere andere Tools nutzen.

  1. Visualisieren Sie die erfassten Daten mit Grafana.


3 Grafana

Grafana ist ein sehr mächtiges Tool zur Visualisierung von (fast) beliebigen Daten auf Dashboards. Die Daten können u. a. von unterschiedlichen Datenbankmanagementsystemen bezogen werden, z.B. auch von MySQL und InfluxDB.

3.1 Installation

3.1.1 Docker-Container

Starten Sie einen Grafana-Container: https://hub.docker.com/r/grafana/grafana
docker run -d --name=grafana -p 3000:3000 grafana/grafana.
Alternativ können Sie den Container auch über einen Stack starten. Der Vorteil hierbei ist, dass sich Grafana mit anderen Containern - z.B. Datenbanken - automatisch im selben Netzwerk befindet.

Damit Datenbankverbindungen und Abfragen in Grafana gespeichert werden können, muss ein Volume angebunden werden.

3.1.2 lokale Installation

  1. Laden Sie das Programm für Ihren Computer herunter: https://grafana.com/grafana/download
  2. Öffnen Sie die Eigenschaften der zip-Datei und setzen Sie den Haken bei 'Zulassen' unter 'Sicherheit'
  3. Entpacken Sie die zip-Datei
  4. Öffnen Sie den Ordner C:\grafana-n.n.n\conf und erstellen Sie eine Kopie der Datei sample.ini, die Sie anschließend in custom.ini umbenennen. Änderungen dürfen nur in dieser Datei vorgenommen werden.
  5. Starten Sie c:\grafana-n.n.n\bin\grafana-server.exe

3.2 Daten visualisieren

WICHTIG: in der Praxis muss für den Zugriff auf die Datenbank durch Grafana ein Benutzer angelegt werden, der nur SELECT auf einer bestimmten Tabelle ausführen darf.

  1. Öffnen Sie in Ihrem Browser die Seite http://localhost:3000 Benutzer und Passwort lauten 'admin'
  2. Im nächsten Schritt werden Sie aufgefordert ein neues Passort einzugeben.
  3. Wählen Sie anschließend 'Add data source'. Sollte die Verbindung mit 'localhost' fehlschlagen, geben Sie stattdessen die IP-Adresse Ihres Rechners ein.
  1. Um Daten visualisieren zu können, müssen zunächst welche zur Verfügung stehen. Falls Sie keine Temperaturdaten in Ihrer MySQL-Datenbank gespeichert haben, können Sie dieses SQL-Skript importieren.
  2. Wählen Sie 'Add data source', um Grafana mit einer Datenbank zu verbinden.
    Wählen Sie Ihre lokale MySQL-Datenbank, der Benutzer ist 'root' ohne Passwort.
  3. Stellen Sie die Daten in einem Graphen dar. (Beachten Sie, dass die Temperaturdaten in dem Skript im Dezember 2020 erstellt wurden.)
  4. Richten Sie in Grafana eine Ansicht ein, mit der die Daten ohne Eingabe eines Passworts angezeigt werden können.
    Dokumentieren Sie die hierzu notwendigen Schritte.