InfluxDB: Time series database - Docker
Eine InfluxDB Datenbank ist eine für Zeitdaten optimierte Datenbank. Für das Visualisieren wird InfluxDB des Öfteren in Kombination mit Grafana eingesetzt. Achtung: Der Artikel bezieht sich auf die InfluxDB Version 1, Informationen zur Version 2 folgen in Kürze.
Docker Basics
Ein Container ist eine vom Betriebssystem (OS) unabhängige isolierte Umgebung:
Beim ersten Start eines Containers, lädt Docker selbstständig alle notwendigen Quellen
aus dem Internet.
Docker kann unter Windows, macOS oder einer Linux-Distribution installiert werden,
siehe auch: Docker
Datenbank Initialisieren
Bevor wir den Container verwenden können, muss darauf eine Datenbank angelegt werden. Der folgende Befehl startet den Container, legt die Datenbank an und stoppt den Container im Anschluss wieder. Das Passwort sollte an dieser Stelle natürlich angepasst werden:
mkdir -p /docker
mkdir -p /docker/influxdb
docker run \
--rm -e INFLUXDB_DB=iobroker \
-e INFLUXDB_ADMIN_USER=admin \
-e INFLUXDB_ADMIN_PASSWORD=adminpassword \
-e INFLUXDB_USER=iobroker \
-e INFLUXDB_USER_PASSWORD=password4iobrokerdb \
-v /docker/influxdb:/var/lib/influxdb influxdb /init-influxdb.sh
Die Ausgabe sollte ca. wie folgt aussehen:
docker run --rm -e INFLUXDB_DB=ha -e INFLUXDB_ADMIN_USER=admin -e INFLUXDB_ADMIN_PASSWORD=???-e INFLUXDB_USER=ha -e INFLUXDB_USER_PASSWORD=??? -v /var/web/ha.libe.net/influxdb:/var/lib/influxdb influxdb /init-influxdb.sh
..
ts=2022-01-18T11:01:45.570263Z lvl=info msg="Executing query" log_id=0Z7DRsEl000 service=query query="CREATE DATABASE ha"
[httpd] 127.0.0.1 - - [18/Jan/2022:11:01:45 +0000] "POST /query?chunked=true&db=&epoch=ns&q=CREATE+DATABASE+ha HTTP/1.1" 200 57 "-" "InfluxDBShell/1.8.3" 06a1e3a9-784e-11ec-8002-0242ac110002 6635
/init-influxdb.sh: ignoring /docker-entrypoint-initdb.d/*
...
ts=2022-01-18T11:01:45.590635Z lvl=info msg="Closed service" log_id=0Z7DRsEl000 service=subscriber
ts=2022-01-18T11:01:45.590686Z lvl=info msg="Server shutdown completed" log_id=0Z7DRsEl000
InfluxDB starten
Nachdem der Container initialisiert wurde, habe ich mit "docker network create smart-home" ein eigenes Netzwerk angelegt, die Datenbank kann daraufhin mit folgendem Befehl gestartet werden:
docker run -d \
--name=influxdb \
--network=smart-home \
-p 8086:8086 \
--restart=always \
-v /docker/influxdb:/var/lib/influxdb influxdb
Alternativ kann InfluxDB beim Einsatz mehrerer Container auch über eine Docker-Compose-Datei eingebunden werden, siehe: Home-Assistant Docker Conbee 2 und Zigbee2MQTT / deCONZ
Shell docker exec
Beim Einsatz des Docker-Containers, kann die Datenbank über docker exec im Terminal verwaltet werden
Retention-Policy anzeigen und verstehen
bernhard@sox:~$ docker exec -it influxdb influx
Connected to http://localhost:8086 version 1.8.3
InfluxDB shell version: 1.8.3
...
Please set a database with the command "use <database>".
> use ha
Using database ha
> SHOW RETENTION POLICIES
name duration shardGroupDuration replicaN default
---- -------- ------------------ -------- -------
autogen 0s 168h0m0s 1 true
Als Standard wird beim Anlegen der Datenbank eine Retention-Policy mit dem Namen "autogen" angelegt. Die Policy besitzt eine unendlich lange Retention und eine "shrdGroupDuration" von sieben Tagen. "0s" als Retention steht für unendlich. Beim Überschreiten der Retention werden shrdGroups gelöscht, was bei der Standardeinstellung immer Blöcke von sieben Tagen löschen würde, entsprechend hat die shardGroupDuration bei einem anderen Wert als 0s einen Einfluss auf die Retention.
Zusätzliche Datenbank anlegen
bernhard@sox:~$ docker exec -it influxdb influx
Connected to http://localhost:8086 version 1.8.3
InfluxDB shell version: 1.8.3
> CREATE DATABASE "traefik"
> CREATE USER "traefik" WITH PASSWORD '???'
> GRANT ALL ON "traefik" TO "traefik"
Werte anzeigen und bestimmte Werte löschen
Ich hatte anfangs von meinem Temperatursensor einige Falschmeldungen mit dem Wert "-127". Um diese zu entfernen kann ein bestimmter Zeitwert verwendet werden.
- Herausfinden des Key für die Werte: "SHOW SERIES ON ha"
- Anzeige der Werte mit "select time,value from "°C" where value < -100 limit 10"
- Löschen der angezeigten Werte über dessen Zeitwert: "delete from "°C" where time = 1642559861967671040"
> SHOW SERIES ON ha
key
---
%,domain=sensor,entity_id=aussen_battery
%,domain=sensor,entity_id=aussen_humidity
%,domain=sensor,entity_id=bad_battery
%,domain=sensor,entity_id=bad_humidity
%,domain=sensor,entity_id=baldrian_battery
%,domain=sensor,entity_id=baldrian_humidity
...
°C,domain=sensor,entity_id=gefrierschrank_temperature
°C,domain=sensor,entity_id=heating_pufferspeicher
°C,domain=sensor,entity_id=heating_ruecklauf
°C,domain=sensor,entity_id=heating_vorlauf
°C,domain=sensor,entity_id=heating_waermetauscher
°C,domain=sensor,entity_id=heating_warmwasser
> select time,value from "°C" where value < -100 limit 10
name: °C
time value
---- -----
1642559861967671040 -127
1642577899531245824 -127
1642582871417732096 -127
1642583544890542080 -127
1642590298966192128 -127
1642590767340711168 -127
1642590767352859136 -127
1642590767357784064 -127
1642590767358241024 -127
1642590767358556928 -127
> delete from "°C" where time = 1642559861967671040
> delete from "°C" where time = 1642577899531245824
> delete from "°C" where time = 1642582871417732096
> delete from "°C" where time = 1642583544890542080
> delete from "°C" where time = 1642590298966192128
> delete from "°C" where time = 1642590767340711168
> delete from "°C" where time = 1642590767357784064
> delete from "°C" where time = 1642590767358241024
> delete from "°C" where time = 1642590767358556928
Queries
https://docs.influxdata.com/influxdb/v1.3/query_language/functions/
Upgrade Influxdb 1 auf 2
docker run -p 8086:8086 \
-v ./influxdb:/var/lib/influxdb \
-v ./influxdb2:/var/lib/influxdb2 \
-e DOCKER_INFLUXDB_INIT_MODE=upgrade \
-e DOCKER_INFLUXDB_INIT_USERNAME=ha \
-e DOCKER_INFLUXDB_INIT_PASSWORD=pASSED \
-e DOCKER_INFLUXDB_INIT_ORG=my-org \
-e DOCKER_INFLUXDB_INIT_BUCKET=my-bucket \
influxdb
Zugriff auf die InfluxDB
Für den Zugriff auf die Datenbank können einfach die zuvor beim Initialisieren hinterlegten Daten verwendet werden:
- Host innerhalb des Netzwerkes "smart-home": influxdb:8086
- Datenbankname: influxb
- User: admin
- Passwort: adminpassword
Zugriff aus Grafana und ioBroker, siehe auch: /grafana#Datenquelle und /iobroker#InfluxDB bzw. Home-Assistant Docker Conbee 2 und Zigbee2MQTT / deCONZ
{{percentage}} % positiv