Influxdb wird bei sehr vielen IoT Systemen verwendet, weil es die perfekte Datenbank für die Erfassung von Metriken ist. Wenn man dann im Sekundentakt Daten rein pumpt, dann füllt sich so eine Datenbank natürlich auch irgendwann. Und dafür gibt es dann den Mechanismus der Compaction, welcher in regelmäßigen (konfigurierbaren) Abständen die bisherigen Daten zusammenfasst, optimiert und ggf. auch reduziert.
In sehr vielen Fällen kommt als Server ein Raspberry Pi zum Einsatz, der in den meisten Fällen auf einem 32 Bit Betriebssystem betrieben wird. Und hier ist Influxdb (mittlerweile wird von denen auch 32Bit gar nicht mehr supported) eine mehr oder weniger tickende Zeitbombe. So auch bei mir. In den letzten Tagen ist die Last auf dem System auf durchschnittlich 20 und darüber gegangen, obwohl der Raspberry sonst nur eine Load von ca. 1-2 hatte.
Im Log konnte ich dann sehen, dass Influxdb alle 15 Sekunden versucht hat, die Daten zu compacten, aber immer wieder scheiterte – weil der RAM nicht ausreichte. “cannot allocate memory” konnte ich dann immer wieder im Log lesen, und der Spaß ging von vorne los.
Das Problem hier ist: Influxdb lädt alle Daten erstmal in den RAM, um sie dann zu compacten. Es benötigt für seine Arbeiten dann ungefähr das 2-3 fache der Datenbankgrö0e an RAM. Sobald man diese Grenze einmal überschreitet, passiert der Fehler wie bei mir und ist nicht wirklich zu lösen.
Ein User hat sich dann hingesetzt und das Problem analysiert und auch einen Fix gebastelt, der aber leider nicht gemerged wurde. Aber man kann den Fix selbst einbauen oder dankenswerterweise direkt das fertige Docker Image mit dem Patch nutzen:
https://github.com/terjesannum/docker-influxdb-arm32/pkgs/container/influxdb-arm32
docker pull ghcr.io/terjesannum/influxdb-arm32:1.8.10-1
Zusätzlich solltest du in deiner Influxdb Config folgendes einstellen:
[data]
…
index-version = “tsi1”
tsm-use-seek = true
…
Der zweite Parameter sollte nur gesetzt werden, wenn deine Influx DB auf einer SSD liegt, da im Prinzip auf in-Memory Sachen verzichtet wird und stattdessen die Platte genutzt wird. Das ist bei Low-Memory Systemen wie derm Raspberry Pi vorteilhafter. Wenn du den Raspberry Pi allerdings nur mit der SD Karte betreibst, dann schalte das keineswegs an!
Wenn du nun Influxdb startest, dann sollte die Compaction der Datenbank ohne Probleme durchlaufen.