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:

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
/etc/influxdb/influxdb.conf
# 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:

Beispiele für gebräuchliche InfluxQL-Queries - Informationen abfragen
SHOW DATABASES
USE icinga_influxdb

SHOW MEASUREMENTS
SHOW SERIES
SHOW RETENTION POLICIES
SHOW TAG KEYS FROM "cmd-check-about-me"
Beispiele für gebräuchliche InfluxQL-Queries - DDL
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'
Beispiele für gebräuchliche InfluxQL-Queries - Umgang mit Retention Times
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

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.

  1. InfluxDB auf beiden Maschinen stoppen: systemctl stop influxdb

  2. Auf InfluxDB2: rm -rf /var/lib/influxdb/*

  3. Auf InfluxDB1: rsync --archive /var/lib/influxdb/* influxdb2:/var/lib/influxdb/

  4. 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