InfluxDB
Die Time-Series-Datenbank (Zeitreihendatenbank) InfluxDB gibt es in einer Open Source- (OSS) und einer Enterprise-Edition. Die Enterprise-Edition bietet zusätzlich:
einen HA-Modus
Verwaltung lokaler Benutzer
Anbindung an LDAP oder OAuth
Scale out Features
Eine verteilte InfluxDB mit synchronisierten Daten lässt sich mit der Open Source-Variante erreichen, indem man Telegraf die gesammelten Werte in mehrere InfluxDB-Instanzen schreiben lässt. Bedeutet aber auch, dass Schreibanfragen an Telegraf statt InfluxDB gerichtet werden müssen.
InfluxDB hört auf
HTTP API: Port 8086
Begriffe:
Measurement: wie „Table“ in einer SQL-Datenbank. Zu Measurements gehören eine oder mehrere Retention Policies. Bei Icinga erhält jedes Plugin sein Measurement, beispielsweise
cmd-check-swap
.Eine Serie besteht aus Retention Policy, Measurement und einem Tag Set. Series sehen so aus, im Beispiel aus einer Icinga-Datenbank:
# measurement ,"tag key"="tag value","tag key"="tag value", ... cmd-check-swap,hostname=myhost, metric=free, service=Swap cmd-check-swap,hostname=myhost, metric=swap-usage, service=Swap cmd-check-swap,hostname=myhost, metric=used, service=Swap cmd-check-swap,hostname=myhost, service=Swap
Tag: indizierte Spalte
Tag Key: Spaltenname
Tag Value: der Inhalt
Tag Set: alle Kombinationsmöglichkeiten aus „Tag Key“ und „Tag Value“
Connect und Execute:
# ask for password
influx -username 'influxdb-user' -password ''
# execute statement
influx -username 'influxdb-user' -password 'password' -execute 'SHOW RETENTION POLICIES ON icinga_influxdb'
- Links:
Doku (HTTP API): https://docs.influxdata.com/influxdb/latest/tools/api/
Installation und Konfiguration
cat > /etc/yum.repos.d/influxdb.repo << 'EOF'
[influxdb]
name = InfluxDB Repository - RHEL $releasever
baseurl = https://repos.influxdata.com/stable/$basearch/main
enabled = 1
gpgcheck = 1
gpgkey = https://repos.influxdata.com/influxdata-archive_compat.key
EOF
dnf -y install influxdb
# Once every 24 hours InfluxDB will report usage data to usage.influxdata.com
reporting-disabled = true
systemctl enable --now influxdb
Backup und Restore
Benutzer und deren Rechte können nicht wiederhergestellt werden. Siehe https://github.com/influxdata/influxdb/issues/9685.
Backup:
# full dump
influxd backup -portable /path/to/influxdb-dump
influxd backup
[ -database <db_name> ]
[ -portable ]
[ -host <host:port> ]
[ -retention <rp_name> ] | [ -shard <shard_ID> -retention <rp_name> ]
[ -start <timestamp> [ -end <timestamp> ] | -since <timestamp> ]
<path-to-backup>
Timestamps sind im RFC3339-Format anzugeben, also zum Beispiel als 2015-12-24T08:12:23Z
.
Restore:
Vor dem Restore müssen existierende Datenbanken per influx -execute 'DROP DATABASE mydb'
gelöscht werden. Nach dem Restore müssen User und User-Rechte von Hand nachgezogen werden.
influxd restore -portable /path/to/influxdb-dump
# restore a specific database with a new name
influxd restore -db old_db -newdb new_db -portable /path/to/influxdb-dump
# but only one retention policy
influxd restore -db old_db -newdb new_db -rp old_rp -newrp new_rp -portable /mnt/influxdb-dump
InfluxQL Query Language
Umgang mit der DB:
# interactive
influx -host 'localhost' -username 'influxdb-user' -password ''
# non-interactive
influx -host 'localhost' -username 'influxdb-user' -password '' -execute 'My InfluxQL Query'
Beispiele:
SHOW DATABASES
USE icinga_influxdb
SHOW MEASUREMENTS
SHOW SERIES
SHOW RETENTION POLICIES
SHOW TAG KEYS FROM "cmd-check-about-me"
CREATE DATABASE measure
USE measure
INSERT temp inside=24.2,outside=10.1
# INSERT with two tags to enhance search speed
INSERT temp,room=bad,building=ferienhaus inside=24.2,outside=10.1
SELECT * FROM "temp"
SELECT * FROM temp WHERE "room" = 'bad'
SHOW TAG VALUES FROM "cmd-check-disk-usage" WITH KEY = "metric" WHERE "hostname" =~ /^myhost.*/ AND "service" = 'Disk Usage'
SELECT * FROM "cmd-check-disk-usage" LIMIT 10
SELECT metric, value FROM "cmd-check-about-me" WHERE ("hostname" =~ /^myhost\.linuxfabrik\.ch$/ AND "service" = 'About me') AND time >= now() - 30d GROUP BY "metric" limit 2;
DROP SERIES FROM "cmd-check-cpu-usage" WHERE hostname='myhost'
DROP MEASUREMENT cmd-check-users
# gilt global
# Show Retention Policies
SHOW RETENTION POLICIES ON icinga_influxdb
# Drop a subscription
DROP SUBSCRIPTION "icinga-replication" ON "icinga"."autogen"
# Add Retention Policy
CREATE RETENTION POLICY "lf_retention_policy" ON icinga_influxdb DURATION 4320h REPLICATION 1 DEFAULT
# Alter Retention Policy
ALTER RETENTION POLICY "lf_retention_policy" ON icinga_influxdb DURATION 4320h REPLICATION 1 DEFAULT'
# Delete Retention Policy
DROP RETENTION POLICY "lf_retention_policy" ON icinga_influxdb
Bemerkung
Die Double-Quotes in Abfragen sind Pflicht - ohne geht es nicht.
Abfragen beherrschen reguläre Ausdrücke.
Siehe auch https://docs.influxdata.com/influxdb/v1.8/query_language
HTTP API
INSERTs etc. lassen sich wie oben mit dem CLI erledigen, meist ist das InfluxDB HTTP API aber dafür besser geeignet.
curl -i -XPOST --data-binary 'mymeasure,mytag=1 myfield=90 1463683075' "http://influxdb1:8086/write?db=measure&precision=s"
Sync
Es existieren verschiedene Ansätze, von denen die meisten nur die Enterprise-Version beherrscht. Siehe auch https://www.influxdata.com/blog/multiple-data-center-replication-influxdb/. Alternativ:
- Per rsync
Data-Verzeichnisse von InfluxDB1 auf InfluxDB2 syncen.
InfluxDB auf beiden Maschinen stoppen:
systemctl stop influxdb
Auf InfluxDB2:
rm -rf /var/lib/influxdb/*
Auf InfluxDB1:
rsync --archive /var/lib/influxdb/* influxdb2:/var/lib/influxdb/
InfluxDB auf der zweiten Maschine starten, dann auf der ersten:
systemctl start influxdb
- Per Backup und Restore
Siehe oben.
Clients
- InfluxDB Workbench
Für Linux, Mac und Windows. Schon älter, aber funktioniert Stand 2023-04 einwandfrei: https://github.com/JorgeMaker/InfluxDBWorkBench
InfluxDB und Icinga
So sieht die Datenstruktur einer InfluxDB-Tabelle im Zusammenspiel mit Icinga aus - eine Tabelle pro Check-Command:
Jede Tabelle weist mindestens diese Spalten auf - dazu kommen die pro Check individuellen Perfdata-Werte:
acknowledgement (integer, z.B. `0.0`)
current_attempt (integer, z.B. `1.0`)
downtime_depth (integer, z.B. `0.0`)
execution_time (float, z.B. `0.09958`)
latency (float, z.B. `5.51e-4`)
max_check_attempts (integer, z.B. `5.0`)
min (float, z.B. `0`)
reachable (boolean, z.B. `true`)
state (integer, z.B. `0.0`)
state_type (integer, z.B. `1.0`)
unit (string, z.B. `seconds`)
value (float, z.B. `0.031`)
Tag Keys (indizierte Spalten) und deren Tag Values:
time (`1999-12-31 T13:59:59Z`)
hostname (string, z.B. `host.example.com`)
metric (string, z.B. `cpu-usage`)
service (string, z.B. `CPU Usage`)
Troubleshooting
Disk-Usage pro Measurement anzeigen lassen:
influx_inspect report-disk -detailed /var/lib/influxdb/data/
Disk-Usage pro Measurement anzeigen lassen - alternativ und human-readable mit folgendem Python-Skript (benötigt die Linuxfabrik Python Libraries):
#!/usr/bin/env python3
import json
import sys
import lib.human
if len(sys.argv) != 2:
print(f"Usage: {sys.argv} <influxdb_inspect file>")
with open(sys.argv[1], 'rb') as input_file:
data = json.load(input_file)
for measurement in sorted(data['Measurement'], key=lambda v: v['size']):
print(f"{lib.human.bytes2human(measurement['size'])} {measurement['db']} {measurement['measurement']}")
Built on 2023-09-21