InfluxDB 0.9 auf dem Raspberry Pi installieren

Die Zeitreihendatenbank InfluxDB lässt sich in der Version 0.9 relativ einfach auf dem Raspberry Pi installieren. Als Basis der folgenden Beschreibung dient Raspbian in der aktuellen Fassung.

InfluxDB ist in der Programmiersprache Go implementiert. Seit der Version 0.9 werden zur Kompilierung keine weiteren C- oder C++-Tools mehr benötigt. Zwar werden fertig installierbare Pakete für Debian/Ubuntu und RedHat bzw. CentOS bereit gestellt, jedoch bislang nicht für die ARM-Architektur des Raspberry Pi. Hinweise zur Kompilierung finden sich in der Datei CONTRIBUTING.md.

Update – mehr als ein Jahr später

Mit der Zeit gibt es neue Entwicklungen, neue Versionen, und für Raspbian inzwischen offizielle Binaries vom Unternehmen “hinter” InfluxDB, InfluxData. Zu finden im Download-Bereich stellt dies sicherlich mittlerweile die einfachste und adäquate Methode dar, InfluxDB unter Raspbian zu installieren. Wer trotzdem die Schritte manuell gehen möchte oder einfach nur neugierig ist, ist dennoch herzlich eingeladen, den folgenden Artikel zu lesen. Daher belasse ich die hier vorgestellten Schritte, Versionsnummern etc. auch in den ursprünglichen Fassungen. 

Vorbereitungen – Installation von Go 1.4

Zunächst muss Go in der benötigten Version installiert werden. Leider war nach der üblichen Installation (sudo apt-get install golang) nur Version 1.0.2 verfügbar:

go version
go version go1.0.2

Daher musste zunächst Go in der von InfluxDB 0.9 verlangten Version 1.4 installiert werden. Dafür existiert wiederum GVM (Go Version Manager). GVM wird wie folgt installiert:

bash < <(curl -s -S -L https://raw.githubusercontent.com/moovweb/gvm/master/binscripts/gvm-installer)

Zur Bestätigung wurde folgendes ausgegeben:

Cloning from https://github.com/moovweb/gvm.git to /home/pi/.gvm
Created profile for existing install of Go at "/usr/lib/go" 
Installed GVM v1.0.22

Please restart your terminal session or to get started right away run
 `source /home/pi/.gvm/scripts/gvm`

Zum Einlesen der Umgebungsvariablen wurde die zuletzt genannte Zeile ausgeführt:

source /home/pi/.gvm/scripts/gvm

Beim ersten Start wurde angemerkt, dass der Parser-Generator ‘bison’ fehlen würde. In einem der nächsten Schritte wurde zusätzlich die Versionsverwaltung Mercurial verlangt. Der Einfachheit halber wird zunächst beides installiert:

pi@raspberrypi ~ $ sudo apt-get install bison mercurial 

Möglicherweise sind weitere Tools notwendig, bei meiner Installation genügte jedoch dies, um gvm zum Funktionieren zu überreden.

Danach kann Go in der benötigten Version installiert und als Standard gesetzt werden:

pi@raspberrypi ~ $ gvm install go1.4
pi@raspberrypi ~ $ gvm use go1.4 --default
Now using version go1.4


pi@raspberrypi ~ $ go version
go version go1.4 linux/arm

InfluxDB kompilieren

In der Datei CONTRIBUTING.md wird explizit beschrieben, wie InfluxDB kompiliert werden kann. Da ich bislang nicht mit Go in Kontakt gekommen bin, ist die dort beschriebene Verzeichnis- bzw. Projekt-Struktur zumindest ungewöhnlich – die Kompilierung funktionierte jedoch auf Anhieb. Dafür werden zunächst das Projektverzeichnis angelegt, die Umgebungsvariable eingerichtet und die Quelltexte aus dem Repository kopiert:

pi@raspberrypi ~ $ export GOPATH=$HOME/gocodez
pi@raspberrypi ~ $ mkdir -p $GOPATH/src/github.com/influxdb
pi@raspberrypi ~ $ cd $GOPATH/src/github.com/influxdb
pi@raspberrypi ~/gocodez/src/github.com/influxdb $ git clone git@github.com:influxdb/influxdb

Danach erfolgt der Build-Vorgang mit:

pi@raspberrypi ~/gocodez/src/github.com/influxdb $ go get -u -f ./...
pi@raspberrypi ~/gocodez/src/github.com/influxdb $ go build ./...

Hier heißt es nun, einige Minuten zu warten, bis die Kompilierung abgeschlossen ist. Zum Testen kann folgendes Kommando aufgerufen werden:

pi@raspberrypi ~/gocodez/src/github.com/influxdb/influxdb $ go test -v ./...

Nach etlichen Ausgaben wird einem der Erfolg oder Misserfolg bescheinigt. Ein Test der Datenbanken kann stattfinden mittels:

pi@raspberrypi ~/gocodez/src/github.com/influxdb/influxdb $ go test -run=TestDatabase . -v

Auch danach wird einem das Ergebnis mitgeteilt. Danach befinden sich übrigens diverse Testdaten im /tmp-Verzeichnis. Diese können bedenkenlos gelöscht werden.

Der Build-Prozess sollte einige Dateien erzeugt haben, die im Verzeichnis “~/gocodez/bin” liegen. Zur Kontrolle:

~/gocodez/bin $ ls -la
insgesamt 18908
drwxr-xr-x 2 pi pi     4096 Mär 28 22:29 .
drwxr-xr-x 5 pi pi     4096 Mär 28 22:29 ..
-rwxr-xr-x 1 pi pi  5684456 Mär 28 22:29 influx
-rwxr-xr-x 1 pi pi 11599184 Mär 28 22:29 influxd
-rwxr-xr-x 1 pi pi  2064688 Mär 28 22:29 urlgen

Bis dahin war der Build-Prozess insofern erfolgreich. Im Folgenden werden die Schritte bis hin zu einer lauffähigen Konfiguration inkl. Einbindung in den Boot-Prozess beschrieben. Diese umfassen z.B. das Anlegen eines speziellen Users, das Anlegen der Verzeichnisse für die Binaries usw.. Normalerweise übernimmt dies das jeweilige Paket-System. Zur Installation wurde darauf geachtet, möglichst nah an der Struktur und Einrichtung des InfluxDB-Paketes für Ubuntu bzw. Debian zu bleiben. Zwar ist dessen Verzeichnisstruktur auch eher ungewöhnlich, jedoch erschien es mir der Einheitlichkeit und Vergleichbarkeit her als sinnvoll, sich daran zu orientieren.

InfluxDB installieren

Zunächst werden die benötigten Verzeichnisse angelegt. Die Versionsnummer schlägt sich in der Benennung der Verzeichnisse nieder. Durch eine Änderung der Symlinks kann leicht auf eine neuere Version gewechselt werden – vermutlich war das der Hintergedanke bei der Erstellung der offiziellen Pakete für Debian bzw. Ubuntu.

pi@raspberrypi /opt $ sudo mkdir /opt/influxdb
pi@raspberrypi /opt $ sudo mkdir /opt/influxdb/versions
pi@raspberrypi /opt $ sudo mkdir /opt/influxdb/versions/0.9.0-rc16
pi@raspberrypi /opt $ sudo mkdir /opt/influxdb/versions/0.9.0-rc16/scripts
pi@raspberrypi /opt $ sudo cp /home/pi/gocodez/bin/* influxdb/versions/0.9.0-rc16/

Das Start-Stop-Skript namens init.sh und die Config-Datei influxdb.conf hatte ich aus einem InfluxDB-Paket zunächst auf den Raspberry Pi ins Home-Verzeichnis des Users pi kopiert. Von dort werden beide Dateien an die vorgesehenen Stellen kopiert.

pi@raspberrypi /opt $ sudo cp /home/pi/init.sh influxdb/versions/0.9.0-rc16/scripts/

pi@raspberrypi /opt $ sudo mkdir -p /etc/opt/influxdb

pi@raspberrypi /opt $ sudo cp /home/pi/influxdb.conf /etc/opt/influxdb/

Danach werden der User und die Gruppe influxdb angelegt, der InfluxDB-Daemon soll unter diesen User- bzw. Gruppenkennungen laufen, die Rechte werden entsprechend vergeben:

sudo groupadd influxdb
sudo useradd -M -s /bin/bash -g influxdb -d /home/influxdb influx 
pi@raspberrypi /opt $ sudo chown -R influxdb:influxdb /opt/influxdb/

Danach werden die Symlinks gesetzt, so dass die InfluxDB-Binaries letztlich unter /opt/influxdb/ erreichbar sind und das Init-Skript unter /etc/init.d/influxdb:

sudo ln -s /opt/influxdb/versions/0.9.0-rc16/influx /opt/influxdb/influx
sudo ln -s /opt/influxdb/versions/0.9.0-rc16/influxd /opt/influxdb/influxd
sudo ln -s /opt/influxdb/versions/0.9.0-rc16/urlgen /opt/influxdb/urlgen
sudo ln -s /opt/influxdb/versions/0.9.0-rc16/scripts/init.sh /opt/influxdb/init.sh
sudo ln -s /opt/influxdb/init.sh /etc/init.d/influxdb

Standardmässig werden die Daten im /tmp-Verzeichnis abgelegt. Um dies zu ändern, ist eine Anpassung in der influxdb.conf Datei notwendig. Die Änderungen wie folgt:

[broker]
# Where the Raft logs are stored. The user running InfluxDB will need read/write access.
dir  = "/var/lib/influxdb/development/raft"

[...]

[data]
  dir = "/var/lib/influxdb/development/db"

[...]

[cluster]
# Location for cluster state storage. For storing state persistently across restarts.
dir = "/var/lib/influxdb/development/state"

Weitere Änderungen wurden nicht durchgeführt, die Config-Datei ist jedoch leicht lesbar und nahezu selbsterklärend. Achtung – per Default wird der InfluxDB-Server auf allen IP-Adressen gestartet und ist somit nicht nur von localhost aus erreichbar. In sicherheitskritischen Umgebungen sollte die entsprechende Konfigurationsoption angepasst werden!

Danach wurden die neuen Verzeichnisse angelegt und die Rechte vergeben:

pi@raspberrypi /opt/influxdb $ sudo mkdir /var/lib/influxdb
pi@raspberrypi /opt/influxdb $ sudo chown influxdb:influxdb /var/lib/influxdb
pi@raspberrypi /opt/influxdb $ sudo mkdir /var/log/influxdb
pi@raspberrypi /opt/influxdb $ sudo chown influxdb:influxdb /var/log/influxdb

Eigentlich wäre InfluxDB nun so weit gewesen, aber zunächst war der Aufruf des Start-Skriptes nicht erfolgreich. Das PID-File konnte aufgrund fehlender Rechte bzw. des nicht vorhandenen Verzeichnisses nicht angelegt werden. Insofern hat sich InfluxDB nach dem Start gleich wieder beendet. Da mir der Speicherort nicht zusagte, bzw. ich mich mehr an den Standard halten wollte, hielt ich es für eine gute Idee, das pid-File in /var/run/influxdb/ zu platzieren. Nun ist /var/run bzw. /run ein Verzeichnis, was beim Starten neu angelegt wird, dementsprechend verschwinden ggf. angelegte Verzeichnisse nach dem Reboot auch wieder… Die Lösung bestand in der Anpassung des init.sh-Skriptes, was nun analog zu anderen Start-Stop-Skripten dafür sorgt, dass das entsprechende Verzeichnis angelegt wird.

Insgesamt sieht das init.sh-Skript nun wie folgt aus:

#! /usr/bin/env bash

### BEGIN INIT INFO
# Provides:          influxd
# Required-Start:    $all
# Required-Stop:     $remote_fs $syslog
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: Start influxd at boot time
### END INIT INFO

# this init script supports three different variations:
#  1. New lsb that define start-stop-daemon
#  2. Old lsb that don't have start-stop-daemon but define, log, pidofproc and killproc
#  3. Centos installations without lsb-core installed
#
# In the third case we have to define our own functions which are very dumb
# and expect the args to be positioned correctly.

if [ -r /lib/lsb/init-functions ]; then
    source /lib/lsb/init-functions
fi

DEFAULT=/etc/default/influxdb

if [ -r $DEFAULT ]; then
    source $DEFAULT
fi

if [ "x$STDOUT" == "x" ]; then
    STDOUT=/dev/null
fi

OPEN_FILE_LIMIT=65536

function pidofproc() {
    if [ $# -ne 3 ]; then
        echo "Expected three arguments, e.g. $0 -p pidfile daemon-name"
    fi

    pid=`pgrep -f $3`
    local pidfile=`cat $2`

    if [ "x$pidfile" == "x" ]; then
        return 1
    fi

    if [ "x$pid" != "x" -a "$pidfile" == "$pid" ]; then
        return 0
    fi

    return 1
}

function killproc() {
    if [ $# -ne 3 ]; then
        echo "Expected three arguments, e.g. $0 -p pidfile signal"
    fi

    pid=`cat $2`

    kill -s $3 $pid
}

function log_failure_msg() {
    echo "$@" "[ FAILED ]"
}

function log_success_msg() {
    echo "$@" "[ OK ]"
}

# Process name ( For display )
name=influxd

# Daemon name, where is the actual executable
daemon=/opt/influxdb/influxd

# pid file for the daemon
#idfile=/var/run/influxdb/influxd.pid

PIDDIR=/var/run/influxdb
DAEMONUSER=influxdb
pidfile=$PIDDIR/influxdb.pid


# Configuration file
config=/etc/opt/influxdb/influxdb.conf

# If the daemon is not there, then exit.
[ -x $daemon ] || exit 5

check_run_dir() {
    if [ ! -d $PIDDIR ]; then
        mkdir -p $PIDDIR
        chown $DAEMONUSER $PIDDIR
        chgrp $DAEMONUSER $PIDDIR
    fi
}
              

case $1 in
    start)
        check_run_dir
        # Checked the PID file exists and check the actual status of process
        if [ -e $pidfile ]; then
            pidofproc -p $pidfile $daemon > /dev/null 2>&1 && status="0" || status="$?"
            # If the status is SUCCESS then don't need to start again.
            if [ "x$status" = "x0" ]; then
                log_failure_msg "$name process is running"
                exit 1 # Exit
            fi
        fi

        # Bump the file limits, before launching the daemon. These will carry over to
        # launched processes.
        ulimit -n $OPEN_FILE_LIMIT
        if [ $? -ne 0 ]; then
            log_failure_msg "set open file limit to $OPEN_FILE_LIMIT"
        fi

        log_success_msg "Starting the process" "$name"
        if which start-stop-daemon > /dev/null 2>&1; then
            start-stop-daemon --chuid influxdb:influxdb --start --quiet --pidfile $pidfile --exec $daemon -- -pidfile $pidfile -config $config > $STDOUT 2>&1 &
        else
            nohup $daemon run -config $config -pidfile $pidfile > $STDOUT 2>&1 &
        fi
        log_success_msg "$name process was started"
        ;;

    stop)
        # Stop the daemon.
        if [ -e $pidfile ]; then
            pidofproc -p $pidfile $daemon > /dev/null 2>&1 && status="0" || status="$?"
            if [ "$status" = 0 ]; then
                if killproc -p $pidfile SIGTERM && /bin/rm -rf $pidfile; then
                    log_success_msg "$name process was stopped"
                else
                    log_failure_msg "$name failed to stop service"
                fi
            fi
        else
            log_failure_msg "$name process is not running"
        fi
        ;;

    restart)
        # Restart the daemon.
        $0 stop && sleep 2 && $0 start
        ;;

    status)
        # Check the status of the process.
        if [ -e $pidfile ]; then
            if pidofproc -p $pidfile $daemon > /dev/null; then
                log_success_msg "$name Process is running"
                exit 0
            else
                log_failure_msg "$name Process is not running"
                exit 1
            fi
        else
            log_failure_msg "$name Process is not running"
            exit 3
        fi
        ;;

    *)
        # For invalid arguments, print the usage message.
        echo "Usage: $0 {start|stop|restart|status}"
        exit 2
        ;;
esac

 

Danach konnte endlich der InfluxDB-Daemon erfolgreich gestartet werden:

pi@raspberrypi /opt/influxdb $ sudo /etc/init.d/influxdb start

Das Web-Interface befindet sich unter der URL http://<ip-des-raspberry-pi>:8083

Um InfluxDB in den Bootprozess zu bringen, wird noch update-rc.d ausgeführt:

pi@raspberrypi /opt/influxdb $ sudo update-rc.d influxdb defaults
update-rc.d: using dependency based boot sequencing

Das war es auch schon! Zwar ist der hier beschriebene Weg der Installation durchaus als umfangreich zu bezeichnen, und sicherlich gibt es auch andere Möglichkeiten, z.B. ohne Symlinks, per Kopie in /usr/local/bin oder ähnliches. Das sei jedem selbst überlassen, mir erschien es hingegen sinnvoll, sich an der Struktur der offiziellen Pakete zu orientieren. Das wäre prinzipiell auch der nächste Schritt, d.h. das Bereitstellen eines Raspbian-Paketes. Momentan bin ich dazu jedoch eher weniger motiviert. 😉

Der nächste Beitrag zu InfluxDB wird sich mit der Sammlung bzw. Speicherung von Bewegungsdaten eines PIR-Sensors beschäftigen.

 

 

8 Gedanken zu „InfluxDB 0.9 auf dem Raspberry Pi installieren“

  1. Servus Ralf,
    herzlichen Dank für die tolle Anleitung.

    Ich zögere noch ein wenig vor dem Aufwand (mit der Installation ist ja nur der erste Schritt getan…), aber habe ähnliches vor um meine Openhab Installation auf dem Pi sauber reportbar und auswertbar zu machen.

    Hast Du bereits Erfahrungen mit der Performance sammeln können? Hab schon gelesen dass sich der Pi 1 ein wenig schwer tut und überlege vor der ganzen action auf den 2er bzw. Alternativen zu wechseln.

  2. Hallo Chris!

    Vielen Dank für Dein Feedback! Momentan läuft die Installation bei mir auf einem Raspberry Pi 2 – das funktioniert recht gut. Leider habe ich keine Erfahrungswerte über einen längeren Zeitraum hinweg, zwar wurden Event-Daten des Bewegungsmelders über die letzten Wochen erfasst, allerdings hat ein Stromausfall das Ganze zunichte gemacht – es ist mir nicht gelungen, die Daten wiederherzustellen, InfluxDB hat sich hier etwas, sagen wir mal “unkooperativ” (und unerwartet) verhalten.
    Eine Abfrage wie

    SELECT count(value) FROM pir where  time >= '2015-04-27' and time < '2015-05-04' group by time(10m)

    dauert - vom Web-Interface aus gemessen - ca. 150ms, was für meine Zwecke vollkommen ausreichend ist.

    Parallel zu OpenHAB auf dem ersten Raspi-Modell könnte vielleicht der Speicher etwas knapp werden - der OSGi-Stack bzw. die JVM schlucken ja schon einiges.

  3. Hallo! Werde die Anleitung in Kürze austesten, vielen Dank dafür! Habe seit Februar 2015 influxdb 0.8.6 auf einem Olinuxino A20 im Einsatz, vor kurzem ist mir aufgefallen, dass 100% CPU-Last nur für den influxdb-Prozess draufgeht (ich hab zwar noch einen zweiten Kern, aber dennoch…). Daher wollte ich mal ein Update ausprobieren. Fertige Pakete sind für ARM ja leider nicht zu bekommen, aber die Grafana-Auswertungen sind einfach zu schön, als dass ich drauf verzichten wollte. Ich speichere etwa 5-20 Datenpukte pro Minute, also nicht wirklich viel. Ich hoffe, dass die Datenbank irgendwie zur 0.9.x herüber gerettet werden kann.

  4. Danke für die Anleitung! Hat mir sehr geholfen. Die Konfigurationseinstellungen haben sich seit dem 9.0 release geändert, evtl. kannst Du die Anleitung ja für die Release Version updaten.

    Ich habe Influxdb auf Raspbian Jessie installiert, das systemd statt init-Skripte benutzt und habe deshalb statt init.sh das service-skript aus scripts/influxdb.service entsprechend modifiziert.

    Damit ich den ganzen Tanz nicht von vorne machen muss, wenn ich von meinem Model B auf etwas besseres migriere, habe ich die Installation mit einem Ansible Playbook geskripted: https://github.com/gbirke/openhab-ansible-setup/blob/master/tasks/install_influxdb_raspbian.yml

    1. Hallo Gabriel!

      Vielen Dank für Dein Feedback und Deine Hinweise, tatsächlich habe ich die Version länger nicht angefasst, seit Installation läuft InfluxDB einfach vor sich hin und sammelt munter Daten. 😉 Dein Playbook werde ich gerne mal ausprobieren!

      Beste Gruesse,
      Ralf

  5. Hallo Ralf

    Danke für die gute Anleitung. Es ist zwar schon ein halbes Jahr her aber dein Post schafft es immer noch auf die Top 3 meiner Websuche, Kompliment! Falls das noch jemand versucht:

    Mittlerweile gibt es von Influxdata fertig kompilierte Packages für armhf, im Moment hier:
    https://influxdata.com/downloads/#influxdb

    Gruss Florian

    1. Hallo Florian!

      Vielen Dank für Deinen Hinweis, ich muss zugeben, hier absolut nicht mehr auf dem aktuellen Stand zu sein, und bald wird der Artikel auch nur noch historischen Wert haben. 😉

      Beste Gruesse,
      Ralf

  6. Hi Ralf,
    danke für die tolle Anleitung. Leider habe ich ganz oben angefangen und enormes Yak-Shaving betreiben müssen, bis die Installation fertig war… nur um dann ganz unten zu sehen, dass es mittlerweile fertige ARM-Binaries gibt 😉 *facepalm*

    Schreib doch bitte oben noch ein kleines Update rein, damit anderen Leuten die Mühe wenigstens erspart bleibt 😉

    Danke und Gruß, Leo

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

Tags: