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

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

/etc/yum.repos.d/influxdb.repo
[influxdb]
name = InfluxDB Repository - RHEL $releasever
baseurl = https://repos.influxdata.com/rhel/$releasever/$basearch/stable
enabled = 1
gpgcheck = 1
gpgkey = https://repos.influxdata.com/influxdb.key
yum -y install influxdb
systemctl enable --now influxdb
/etc/influxdb/influxdb.conf
reporting-disabled = true

Backup und Restore

Es ist zu beachten, dass User und User-Rechte nicht wiederhergestellt werden. Siehe https://github.com/influxdata/influxdb/issues/9685.

Backup:

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

Query Language

Umgang mit der DB:

influx -host 'localhost' -username 'influxdb-user' -password ''
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'

Die Double-Quotes in Abfragen sind Pflicht - ohne geht es nicht. Abfragen beherrschen reguläre Ausdrücke.

SELECT * FROM "cmd-check-disk-usage" LIMIT 10
SELECT "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'

DROM 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

Siehe auch https://docs.influxdata.com/influxdb/v1.7/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.

  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.

Built on 2023-03-17