InfluxDB Backup und Restore

InfluxDB ist eine Open Source Datenbank, die speziell für die Speicherung und Analyse von Zeitreihendaten entwickelt wurde. Sie wird häufig in Anwendungen eingesetzt, die große Mengen an zeitbasierten Daten generieren, wie z.B. IoT-Sensoren, Überwachungs- und Logging-Systeme sowie Performance-Monitoring von Anwendungen.

In meinem Homelab wird InfluxDB genutzt, um Metriken diverser Systeme, wie zum Beispiel die Proxmox Infrastruktur, PV Anlage oder diverse Linux VMs und Containern zu speichern.

InfluxDB Backup und Restore

Die gespeicherten Daten werden dann per Grafana visualisiert.

InfluxDB Daten in Grafana

Die InfluxDB selbst läuft auch in einem Container innerhalb eines LXC Containers. Dieser LXC Container wird einmal pro Woche automatisiert auf ein NFS Share gesichert.

Doch was passiert, wenn zwischendurch etwas mit den Daten der InfluxDB passiert? Im schlimmsten Fall würde das einen Datenverlust bis zum letzten Backup des LXC Containers bedeuten. Um dies zu verhindern, lassen sich die InfluxDB Daten auch über das Influx CLI sichern. Dabei können entweder alle Einstellungen und Buckets komplett oder auch nur einzelne Buckets gesichert werden.

Um alle Einstellungen und Daten zu sichern, kann folgender Befehl ausgeführt werden.

./influx backup --token $token /tmp/influxdb/backup

Als Token muss ein gültiger Influx API Token mit entsprechenden Berechtigungen angegeben werden. Alle erzeugten Daten landen im angegebenen Verzeichnis.

Um alle Daten und Einstellungen wiederherzustellen kann folgender Befehl ausgeführt werden.

./influx restore --full --token $token /tmp/influxdb/backup

Auch hier muss wieder ein gültiger API Token angegeben werden, damit die Authentifizierung an der InfluxDB möglich ist. Durch den Parameter “–full” werden alle vorhandenen Daten durch das Backup ersetzt.

Damit der Befehl nicht jedes Mal von Hand ausgeführt werden muss, kann auch ein kleines Bash Skript erstellt werden, welches sich um das Backup kümmert. Um nicht unzählige Backups vorzuhalten, kann die Anzahl auch begrenzt werden, damit zum Beispiel nur die letzten sieben Tage vorgehalten werden. Auch lassen sich die Backups zusätzlich auf einen NFS Share ablegen, um nicht direkt auf dem InfluxDB Server liegen zu müssen.

Ein mögliches Skript kann folgendermaßen aussehen:

#!/bin/bash

# variables
influx_token=xxx
backup_dir=/tmp/influxdb/backup
backup_dest_dir=/shared/influxdb
current_date=$(date +"%Y-%m-%d")
backup_archive_name="influxdb_backup_${current_date}.tar.gz"

# create backup dir and clean it if not empty
mkdir -p $backup_dir/tmp
mkdir -p $backup_dest_dir
rm -rf $backup_dir/*

# create full backup of influxdb
./influx backup --token $influx_token $backup_dir/tmp

# create archive of full backup
tar -czf $backup_dir/$backup_archive_name -C $backup_dir/tmp .

# copy backup to target directory on NFS share
cp $backup_dir/$backup_archive_name $backup_dest_dir

# remove backup files, that are older than 7 days
find $backup_dest_dir -type f -name '*.tar.gz' -mtime +7 -exec rm {} \;

echo "Backup done..."

Das Skript kann dann per cronjob oder systemd Timer regelmäßig ausgeführt werden. Ein Restore kann im Bedarfsfall mit dem oben gezeigten Befehl manuell durchgeführt werden.