Update : Attention cette documentation est obsolète
Comme indiqué dans la documentation Prometheus :
(**) Traduit par www.DeepL.com/Translator
[..]
Notez qu'une limitation du stockage local est qu'il n'est pas en "cluster" ou répliqué.
Ainsi, il n'est pas arbitrairement extensible ou durable face aux pannes de disque ou de noeud et devrait être traité
comme vous le feriez pour n'importe quel autre type de base de données à noeud unique. L'utilisation du RAID pour la
disponibilité des disques, les instantanés pour les sauvegardes, la planification de la capacité, etc. est recommandée pour
améliorer la durabilité. Avec une durabilité de stockage appropriée et une planification, il est possible de stocker des années de données dans le stockage local.
Il est également possible d'utiliser un stockage externe via les API de lecture/écriture à distance.
Une évaluation minutieuse est nécessaire pour ces systèmes car ils varient grandement en termes de durabilité, de performances et
d'efficacité.
[..]
Comprenez que le système de stockage n’est pas extensible comme le peut un système de base de données. Prometheus supporte plusieurs moteurs de base de données. J’ai essayé Postgres, peu concluant sur des unités de type Raspberry Pi ou Rock64 (manque de performances évidentes). Tandis que le moteur InfluxDB fait le travail à merveille.
Cet article explique comment installer le système InfluxDB sur Rock64, comment coupler Prometheus avec Influxdb et comment vérifier le bon fonctionnement. Cette procédure devrait aussi fonctionner sur un Raspberry PI4 et facilement être adaptée à d’autres plateformes supportées par InfluxDB. InfluxDB n’est pas prévu pour fonctionner sur Raspberry PI3.
Notez bien : Grafana ne nécessite aucune modifications
Installation du service InfluxDB
Sur le futur serveur InfluxDB (Rock64 ou Raspberry PI4), copier le contenu qui suit dans le fichier /tmp/installinflux.sh. Ce shell installe la version 1.7.9 de moteur InfluxDB :
#!/bin/bash
######################################################################
## Built with mytinydc-automation process - https://www.mytinydc.com
######################################################################
export APT_KEY_DONT_WARN_ON_DANGEROUS_USAGE="DontWarn"
export DEBIAN_FRONTEND="noninteractive"
apt-get update
apt-get -y install curl net-tools
########################################################
UserExec=influxdb
LINK="https://dl.influxdata.com/influxdb/releases/influxdb-1.7.9_linux_armhf.tar.gz"
SERVICEFILE="/etc/systemd/system/influxdb.service"
INFLUXDBDIR="/var/lib/influxdb"
INFLUXDBFILESLISTINSTALLED="/tmp/influxdbfileslistinstalled"
SERVER="`uname -n`"
ERR=$?
if [ "$ERR" != "0" ];then
echo "[Code Erreur] $ERR" >&2
echo "[Commande] SERVER=`uname -n`" >&2
exit $ERR
fi
ARCH="`uname -m`"
ERR=$?
if [ "$ERR" != "0" ];then
echo "[Code Erreur] $ERR" >&2
echo "[Serveur] $SERVER" >&2
echo "[Commande] ARCH=`uname -m`" >&2
exit $ERR
fi
if [ -f "/usr/bin/influxd" ];then
echo "[ERR] Une installation existe deja "
exit 1
fi
cd /tmp
ERR=$?
if [ "$ERR" != "0" ];then
echo "[Code Erreur] $ERR" >&2
echo "[Serveur] $SERVER" >&2
echo "[Commande] cd /tmp" >&2
exit $ERR
fi
curl "$LINK" | tar xvfz -
ERR=$?
if [ "$ERR" != "0" ];then
echo "[Code Erreur] $ERR" >&2
echo "[Serveur] $SERVER" >&2
echo "[Commande] curl $LINK | tar xvfz -" >&2
exit $ERR
fi
cd influxdb-1.7.9*
ERR=$?
if [ "$ERR" != "0" ];then
echo "[Code Erreur] $ERR" >&2
echo "[Serveur] $SERVER" >&2
echo "[Commande] cd influxdb-1.7.9*" >&2
exit $ERR
fi
# Map list files
find . > $INFLUXDBFILESLISTINSTALLED
cat $INFLUXDBFILESLISTINSTALLED
echo "-----"
echo ""
echo "[INFO] Ci-avant, la liste des fichiers installes sur votre systeme"
echo " Conserver une copie de cette liste"
echo " pour permettre une suppression de ce service"
echo " Cette liste est aussi disponible dans le fichier : "
echo " $INFLUXDBFILESLISTINSTALLED"
echo "-----"
cp -rp * /.
ERR=$?
if [ "$ERR" != "0" ];then
echo "[Code Erreur] $ERR" >&2
echo "[Serveur] $SERVER" >&2
echo "[Commande] cp -rp service /." >&2
exit $ERR
fi
ISGROUPEXISTS=`getent group $UserExec` #DONTCATCH
if [ "$ISGROUPEXISTS" = "" ];then
addgroup $UserExec
ERR=$?
if [ "$ERR" != "0" ];then
echo "[Code Erreur] $ERR" >&2
echo "[Serveur] $SERVER" >&2
echo "[Commande] addgroup $UserExec" >&2
exit $ERR
fi
fi
ISUSEREXISTS=`getent passwd $UserExec` #DONTCATCH
if [ "$ISUSEREXISTS" = "" ];then
adduser --system --home /var/lib/infludb --no-create-home --disabled-password --shell /bin/nologin --ingroup $UserExec $UserExec
ERR=$?
if [ "$ERR" != "0" ];then
echo "[Code Erreur] $ERR" >&2
echo "[Serveur] $SERVER" >&2
echo "[Commande] adduser --system --home /var/lib/infludb --no-create-home --disabled-password --shell /bin/nologin --ingroup $UserExec $UserExec" >&2
exit $ERR
fi
fi
# InfluxDB data directory Debian compliance
mkdir -p $INFLUXDBDIR
ERR=$?
if [ "$ERR" != "0" ];then
echo "[Code Erreur] $ERR" >&2
echo "[Serveur] $SERVER" >&2
echo "[Commande] mkdir -p $INFLUXDBDIR" >&2
exit $ERR
fi
# permissions
chown -R $UserExec:$UserExec $INFLUXDBDIR
ERR=$?
if [ "$ERR" != "0" ];then
echo "[Code Erreur] $ERR" >&2
echo "[Serveur] $SERVER" >&2
echo "[Commande] chown -R $UserExec:$UserExec /var/lib/influxdb" >&2
exit $ERR
fi
chmod 750 /var/lib/influxdb
ERR=$?
if [ "$ERR" != "0" ];then
echo "[Code Erreur] $ERR" >&2
echo "[Serveur] $SERVER" >&2
echo "[Commande] chmod 750 /var/lib/influxdb" >&2
exit $ERR
fi
# Nettoyage
rm -rf /tmp/influxdb-1.7.9*
ERR=$?
if [ "$ERR" != "0" ];then
echo "[Code Erreur] $ERR" >&2
echo "[Serveur] $SERVER" >&2
echo "[Commande] rm -f /tmp/influxdb-1.7.9*" >&2
exit $ERR
fi
## Service File
cat << 'EOT' > $SERVICEFILE
[Unit]
Description=InfluxDB service - #ARCH#
After=network.target syslog.target
[Service]
User=influxdb
Group=influxdb
Type=simple
ExecStart=/usr/bin/influxd -config /etc/influxdb/influxdb.conf
Restart=on-failure
StandardOutput=syslog
StandardError=syslog
SyslogIdentifier=influxdb
[Install]
WantedBy=multi-user.target
EOT
ERR=$?
if [ "$ERR" != "0" ];then
echo "[Code Erreur] $ERR" >&2
echo "[Serveur] $SERVER" >&2
echo "[Commande] creation du fichier service $SERVICEFILE" >&2
exit $ERR
fi
# permission service file
chmod 644 $SERVICEFILE
ERR=$?
if [ "$ERR" != "0" ];then
echo "[Code Erreur] $ERR" >&2
echo "[Serveur] $SERVER" >&2
echo "[Commande] chmod 644 $SERVICEFILE" >&2
exit $ERR
fi
# Replace #ARCH# fichier service
sed -i "s/#ARCH#/$ARCH/" $SERVICEFILE
ERR=$?
if [ "$ERR" != "0" ];then
echo "[Code Erreur] $ERR" >&2
echo "[Serveur] $SERVER" >&2
echo "[Commande] sed -i "s/#ARCH#/$ARCH/" $SERVICEFILE" >&2
exit $ERR
fi
systemctl daemon-reload
ERR=$?
if [ "$ERR" != "0" ];then
echo "[Code Erreur] $ERR" >&2
echo "[Serveur] $SERVER" >&2
echo "[Commande] systemctl daemon-reload" >&2
exit $ERR
fi
echo "[OK] Installation terminee"
Rendre ce shell exécutable :
chmod 755 installinflux.sh
Exécutez l’installation :
./installinflux.sh
Modification de la configuration influxDB
L’adresse IP de mon serveur est 172.21.0.11
vi /etc/influxdb/influxdb.conf
# Ne pas envoyer la télémétrie ajoutez cette ligne
reporting-disabled = true
# Chemin des donnéees
[meta]
# Where the metadata/raft database is stored
dir = "/var/lib/influxdb/meta"
[data]
# The directory where the TSM storage engine stores TSM files.
dir = "/var/lib/influxdb/data"
# The directory where the TSM storage engine stores WAL files.
wal-dir = "/var/lib/influxdb/wal"
[http]
# Adresse d'écoute indiquer l'adresse IP de serveur sur le réseau
bind-address = "172.21.0.11:8086"
# Desactiver les logs http
log-enabled = false
write-tracing = false
[logging]
# Log uniquement les erreurs
level = "error"
[continuous_queries]
# Desactiver les logs
log-enabled = false
Démarrage du service InfluxDB
systemctl start influxdb
Vérification fonctionnement du service
# Service démarré ?
systemctl status influxdb
# Réponse type :
● influxdb.service - InfluxDB service - armhf
Loaded: loaded (/etc/systemd/system/influxdb.service; disabled; vendor preset: enabled)
Active: active (running) since Sat 2020-01-18 10:32:29 CET; 4s ago
Main PID: 8394 (influxd)
Tasks: 6 (limit: 1150)
Memory: 22.6M
CGroup: /system.slice/influxdb.service
└─8394 /usr/bin/influxd -config /etc/influxdb/influxdb.conf
Vérification écoute sur les ports 8086 et 8088
L’adresse IP de mon serveur est 172.21.0.11, le port 8086 est en écoute sur l’interface connéctée au réseau, pour être joignable par le serveur Prometheus, le port “8088” est en écoute sur localhost uniquement.
netstat -ant|grep -E "8088|8086"
# Réponse type
tcp 0 0 172.21.0.11:8086 0.0.0.0:* LISTEN
tcp 0 0 127.0.0.1:8088 0.0.0.0:* LISTEN
Création de la base prometheus
Sur le serveur InfluxDB
$ influx -precision rfc3339
Connected to http://localhost:8086 version 1.7.x
InfluxDB shell 1.7.x
>
tapez
CREATE DATABASE "prometheus"
exit
Firewall
- Sur le serveur InfluxDB :
Port | sens | Etat | Source |
---|---|---|---|
8086 | Input | Ouvert | Serveur prometheus |
- Sur le serveur Prometheus :
Port | sens | Etat | Destination |
---|---|---|---|
8086 | Output | Ouvert | Serveur InfluxDB |
Paramétrage du serveur Prometheus
modifier le fichier de configuration /opt/prometheus/prometheus.yaml en ajoutant après la propriété “global”
global:
[..]
remote_write:
- url: "http://[Adresse IP ou FQDN serveur InfluxDB]:8086/api/v1/prom/write?db=prometheus"
remote_read:
- url: "http://[Adresse IP ou FQDN serveur InfluxDB]:8086/api/v1/prom/read?db=prometheus"
[..]
Exemple pour le serveur InfluxDB avec le FQDN “infludb.mtdc”
global:
[..]
remote_write:
- url: "http://infludb.mtdc:8086/api/v1/prom/write?db=prometheus"
remote_read:
- url: "http://infludb.mtdc:8086/api/v1/prom/read?db=prometheus"
[..]
Exemple pour le serveur InfluxDB avec l’adresse IP “172.21.0.11”
global:
[..]
remote_write:
- url: "http://172.21.0.11:8086/api/v1/prom/write?db=prometheus"
remote_read:
- url: "http://172.21.0.11:8086/api/v1/prom/read?db=prometheus"
[..]
Démarrage de l’affichage des logs de démarrage Prometheus en arrière plan :
tail -f /var/log/syslog &
Redémarrage du service Prometheus
systemctl restart prometheus
Prometheus injecte les données dans le moteur InfluxDB :
Nov 10 00:05:00 raspi4 influxdb[10898]: [httpd] 127.0.0.1 - username [10/Nov/2019:00:05:00 +0100] "POST /api/v1/prom/write?db=prometheus&p=%5BREDACTED%5D&u=username HTTP/1.1" 204 0 "-" "Prometheus/2.6.0" 5b14d2df-0345-11ea-818f-b827eb69fd03 29699
Nov 10 00:05:00 raspi4 influxdb[10898]: [httpd] 127.0.0.1 - username [10/Nov/2019:00:05:00 +0100] "POST /api/v1/prom/write?db=prometheus&p=%5BREDACTED%5D&u=username HTTP/1.1" 204 0 "-" "Prometheus/2.6.0" 5b1a8954-0345-11ea-8190-b827eb69fd03 26346
Nov 10 00:05:00 raspi4 influxdb[10898]: [httpd] 127.0.0.1 - username [10/Nov/2019:00:05:00 +0100] "POST /api/v1/prom/write?db=prometheus&p=%5BREDACTED%5D&u=username HTTP/1.1" 204 0 "-" "Prometheus/2.6.0" 5b1fbeb1-0345-11ea-8191-b827eb69fd03 25807
Nov 10 00:05:00 raspi4 influxdb[10898]: [httpd] 127.0.0.1 - username [10/Nov/2019:00:05:00 +0100] "POST /api/v1/prom/write?db=prometheus&p=%5BREDACTED%5D&u=username HTTP/1.1" 204 0 "-" "Prometheus/2.6.0" 5b24cd98-0345-11ea-8192-b827eb69fd03 29254
Arrêtez la visualisation des logs :
fg
CTRL+C
Laisser tourner 3 heures en vérifiant vos dashboard Grafana.
Vérification du bon fonctionnement
Pour vérifier, ouvrez un Dashboard Grafana, avec les données des 3 dernières heures.
# Arret du service prometheus
systemctl stop prometheus
cd /opt/prometheus/
# Copie du répertoire data vers data.old
cp -rp data data.old
# Suppression des données situées dans le répertoire **data**
rm -rf data/*
systemctl start prometheus
Vérifiez que votre tableau de bord Grafana affiche bien les données des 3 dernières heures.
Les données Prometheus n’étant plus accessibles, ce sont donc les données InfluxDB qui alimentent les tableaux de bord Grafana.
Vous pouvez supprimer le répertoire /opt/prometheus/data.old
Sauvegarde des données InfluxDB
Ajouter un fichier d’ordonnancement : /etc/cron.d/backup-influxDB
#INFLUXDB à 23h tous les jours dans le répertoire /var/lib/backup-influxdb/
0 23 * * * root /usr/bin/influxd backup -portable -database prometheus /var/lib/backup-influxdb/
# Nettoyage des backups influxDB à 1h tous les jours
0 1 * * * root /opt/mytinydc/sbin/backup-influxdb-nettoyage.sh
Créer le répertoire /var/lib/backup-influxdb/
mkdir /var/lib/backup-influxdb/
Créer le fichier /opt/mytinydc/sbin/backup-influxdb-nettoyage.sh
mkdir -p /opt/mytinydc/sbin/
# Créer le fichier /opt/mytinydc/sbin/backup-influxdb-nettoyage.sh avec ce contenu :
#!/bin/bash
DIRBACKUP=/var/lib/backup-influxdb/
NBRJOURRETENTION=5
## Functions
function end_success {
echo ""
echo "*****************************************************************"
echo " Traitement terminé avec succès"
echo "*****************************************************************"
exit 0
}
function end_unsuccess {
echo ""
echo "*****************************************************************"
echo " Une erreur s'est produite : $ERR"
echo "*****************************************************************"
}
# Suppression des backup de + de $NBREJOURRETENTION
echo "*****************************************************************"
echo " Traitement de nuit - Influxdb - Nettoyage des sauvegardes"
echo "*****************************************************************"
echo " Parametres :"
echo " - Répertoire : $DIRBACKUP"
echo " - Nbre de jours (retention) : $NBRJOURRETENTION"
echo ""
echo " Liste des fichiers qui vont être supprimés : "
FILES=`find $DIRBACKUP -type f -mtime +$NBRJOURRETENTION`
if [ "$FILES" = "" ];then
echo " Aucun"
end_success
else
for F in $FILES
do
echo " * $F"
done
fi
echo ""
find $DIRBACKUP -type f -mtime +$NBRJOURRETENTION -exec /bin/rm -f {} \;
ERR=$?
if [ "$ERR" = "0" ];then
end_success
else
end_unsuccess
exit $ERR
fi
Rendre ce fichier exécutable :
chmod 755 /opt/mytinydc/sbin/backup-influxdb-nettoyage.sh
L’utilisateur “root” recevra deux emails tous les jours, mentionnant le déroulement de ces opérations.
Liens interressants
Licence de ce document : Creative Commons (CC BY-NC-ND 4.0)
CETTE DOCUMENTATION EST LIVRÉE “EN L’ÉTAT”, SANS GARANTIE D’AUCUNE SORTE ET DISTRIBUÉE DANS UN BUT ÉDUCATIF EXCLUSIVEMENT. L’AUTEUR, CONTRIBUTEURS DE CETTE DOCUMENTATION OU ©MYTINYDC.COM NE SAURAIENT EN AUCUN CAS ÊTRE TENUS RESPONSABLES DES DOMMAGES DIRECTS OU INDIRECTS POUVANT RÉSULTER DE L’APPLICATION DES PROCÉDURES MISES EN ŒUVRE DANS CETTE DOCUMENTATION, OU DE LA MAUVAISE INTERPRÉTATION DE CE DOCUMENT.