collectd Daten im RAM anstatt im Flash + Backup
Die private Temperaturmessung und -überwachung ist bereits weiter fortgeschritten. Aktuell verwende ich Collectd mit einem eigenen Script auf einem Router und einem AP. Hier werden noch weitere Daten mit aufgezeichnet. Einziger Nachteil war, dass die Daten auf Flash gespeichert werden, was bei den vielen kleinen Zugriffen die Haltbarkeit der SD-Karte stark verkürzt. Eine Abhilfe wäre der Einsatz des Collectd-Cache-Daemons, der die Daten bündelt und bei Bedarf in einem Rutsch schreibt. Eine andere Möglichkeit ist es, die Daten im RAM zu halten, dh. es wird eine RAM-Disk verwendet. Zur Bestimmung der RAM-Disk Größe kann man das Kommando ´du´ verwenden.
# du --max-depth=1 /var/lib/collectd/
6592 /var/lib/collectd/rrd
6596 /var/lib/collectd/
Es werden also gute 6,5MB benötigt. Zur Sicherheit habe ich 12MB verwendet. Die RAM-Disk soll in /mnt/ramdisk angelegt werden. Der Parameter -p erstellt alle benötigten Unterverzeichnisse.
mkdir -p /mnt/ramdisk
Die RAM-Disk soll automatisch eingebunden werden, deshalb habe ich einen Eintrag in der fstab unter /etc/fstab eingetragen.
tmpfs /mnt/ramdisk tmpfs defaults,relatime,size=12M 0 0
Die RAM-Disk wird damit automatisch beim Booten geladen. Um die RAM-Disk zu aktivieren, kann man entweder mount /mnt/ramdisk oder mount -a verwenden. Mit mount kann man dies überprüfen.
Zum initialen Laden der Daten nach dem Booten in die RAM-Disk und das Wegspeichern beim Shutdown benutze ich folgendes Script welches an das von gzone.com angelehnt ist. Es ist unter /etc/init.d/collecd-ramdisk abgelegt. Die Daten werden aus /mnt/data/backup/rrd geladen und auch dort wieder abgelegt.
#! /bin/sh
# /etc/init.d/collectd-ramdisk
#
# cron entry to backup collectd rrd files every 15 minutes. use flock to prevent 2nd instance from
# starting if the previous has not finished running.
#
# >> http://gzone.com/blog/persistent-ram-disk-storage-for-collectd-rrd-files-on-debian-linux/
#
# */15 * * * * root /usr/bin/flock -w 0 /var/lock/collectd-ramdisk.lock /etc/init.d/collectd-ramdisk sync >> /dev/null 2>&1
#
RAM_DISK_PATH=/mnt/ramdisk
HD_PATH=/mnt/data/backup/rrd
LOG=/mnt/data/backup/rrd/collectd_ramdisk_sync.log
case "$1" in
start)
echo "Copying files to ramdisk"
cd "${RAM_DISK_PATH}"
cp ${HD_PATH}/collectd-backup.tar.lzop ${RAM_DISK_PATH}/ && tar --lzop -xvf collectd-backup.tar.lzop && rm -f collectd-backup.tar.lzop
echo [`date +"%Y-%m-%d %H:%M"`] Ramdisk Synched from HD >> ${LOG}
;;
sync | stop)
echo "Synching files from ramdisk to Harddisk"
echo [`date +"%Y-%m-%d %H:%M"`] Ramdisk Synched to HD >> ${LOG}
cd "${RAM_DISK_PATH}"
[ -f "${HD_PATH}/collectd-backup.tar.lzop" ] && mv -f ${HD_PATH}/collectd-backup.tar.lzop ${HD_PATH}/collectd-backup-old.tar.lzop
tar --lzop -cvf collectd-backup.tar.lzop collectd
[ -f collectd-backup.tar.lzop ] && mv collectd-backup.tar.lzop ${HD_PATH}/
;;
*)
echo "Usage: /etc/init.d/collectd-ramdisk {start|stop|sync}"
exit 1
;;
esac
exit 0
Damit die Daten automatisch geladen werden, sind entsprechende Scripte im /etc/rc2.d/ verlinkt. Hier bitte auf die Reihenfolge achten.
lrwxrwxrwx 1 root root 26 Dec 21 10:55 S06collectd-ramdisk -> ../init.d/collectd-ramdisk
lrwxrwxrwx 1 root root 18 Mar 25 2013 S07collectd -> ../init.d/collectd
Das Herunterfahren und Sichern auf Flash erledigen die Scripte in /etc/rc6.d/ . Auch hier bitte auf die Reihenfolge achten.
lrwxrwxrwx 1 root root 18 Mar 25 2013 K01collectd -> ../init.d/collectd
lrwxrwxrwx 1 root root 26 Dec 21 10:56 K01collectd-ramdisk -> ../init.d/collectd-ramdisk
Zusätzlich werden die Daten noch einmal am Tag auf USB-Stick weggeschrieben. Das Script rrd_backup.sh liegt bei mir unter /root/scripts/
rrd_backup.sh
#!/bin/bash
DATA=/mnt/data/backup/rrd
BACKUP=/mnt/data/backup/rrd/data
FILE=collectd-backup.tar.lzop
# get date from ramdisk
/etc/init.d/collectd-ramdisk sync
# save it
cp $DATA/${FILE} ${BACKUP}/collect_`date +%Y-%m-%d`.tar.lzop
Crontabeintrag zum Backup:
# m h dom mon dow command
41 0 * * * /root/scripts/rrd_backup.sh
Damit collectd die neue Position der Daten findet und diese auch unter /mnt/ramdisk ablegt muss noch die Datei /etc/collectd/collectd.conf editiert werden.
<Plugin rrdtool>
# DataDir "/var/lib/collectd/rrd"
DataDir "/mnt/ramdisk/collectd/rrd"
</Plugin>
Nach dem Restart bzw. Neustart von Collectd sollte alles wie gewünscht laufen.