Benutzer-Werkzeuge

Webseiten-Werkzeuge


howto:datenmengen

Dies ist eine alte Version des Dokuments!


Umgang mit den Datenmengen

Im Laufe der Zeit sammeln sich im Volkszähler die Daten an. Diese Seite soll Verfahren zeigen, wie man mit den Mengen umgehen kann.

Problem

Ein D0/SML-Zähler kann je nach Last mehrmals pro Sekunde die aktuelle Leistung ausgeben. Ein S0-Eingang kann mehrere Impulse pro Sekunde erzeugen. Diese Daten werden alle in der Datenbank gespeichert und benötigen Platz.

Jeder weitere Kanal benötigt zusätzlich Platz, da er seine eigenen Daten mitbringt.

Es gibt die Möglichkeit, die Anzeige im Frontend durch Aggregation von Daten zu Beschleunigen. Dabei werden Daten errechnet, die weiterhin Platz benötigen.

Zusätzlich wird eine Datenbank umso langsamer je mehr Datensätze sie beinhaltet. Dieser Effekt tut vor allem dann „weh“, wenn auch die Hardware weniger leistungsfähig ist- wie z.B. die des beliebten Raspberry Pi.

Erfahrungen zeigen, dass so innerhalb von 2 Jahren ca 180 Mio Datensätze gesammelt werden können die ca 19GB Platz benötigen.

Lösungen

Daten externalisieren

  • Frontend und Datenbank auf einem leistungsfähigen Rechner installieren
  • Nur Datenbank auf einem leistungsfähigen Rechner installieren
Man kann die Daten auch auf http://demo.volkszaehler.org/ ablegen.

Daten löschen

Die Frage wie viel Daten man entfernen kann ist oft ein Kompromiss welche Daten man jetzt braucht und wie viel davon in der Zukunft noch von Interesse ist. Ein Ansatz die Aktualdaten zu haben ohne die Datenbank zu nutzen ist der Push-Server.

hart

Wen die Vergangenheit nicht interessiert, der kann die Daten dafür löschen. Ein harter Ansatz wäre einfach alles älter als ein gewisser Zeitraum zu löschen. Mit SQL könnte dies z.B. so aussehen:

delete FROM `data` where timestamp< (unix_timestamp(current_timestamp)-24*60*60)*1000 ;

Das Beispiel löscht alle Daten die vor den letzten 24h liegen. Läßt man das Script einmal am Tag laufen so hat man lediglich die Daten der letzten Stunden.

weich

Bei diesem Ansatz werden auch die Daten gelöscht. Die Daten werden immer mehr ausgedünnt je weiter man in die Vergangenheit geht. So behält man z.B. alle Daten von heute, behält von den letzten 2 Wochen nur eine Messung pro Minute und von der Zeit davor nur eine pro Viertelstunde. Dazu steht das Script vzcompress2 zur Verfügung. Von Haus aus hat der lokale User vz keine Rechte zum Löschen in der Datenbank, das muss man vorher ändern:

mysql --user=root -praspberry
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 37217 [..]

mysql> grant select, update, insert, delete on volkszaehler.* to vz@localhost;
Query OK, 0 rows affected (0.03 sec)

mysql> flush privileges;
Query OK, 0 rows affected (0.01 sec)

mysql> exit

Dann kann das vzcompress2 Skript folgendermaßen per crontab aufgerufen werden:

0 3 * * * cd /var/www/volkszaehler.org/bin ; php vzcompress2 >> /var/log/vzcompress.log

Die Anzahl der Daten die gelöscht werden soll, sowie die Zeiträume sind frei konfigurierbar am Ende des Scriptes.

Performance der Middleware erhöhen: Datenaggregation / Cache

Bleiben die Daten in voller Auflösung erhalten, wird mit der Zeit die Middleware immer langsamer, da es aus den Daten die zur Anzeige benötigten suchen muss. Gerade bei grossen Zoomstufen (z.B. auf ein Jahr) kann es dann notwendig werden, dass die gesamte Datenbank eingelesen werden muss. Abhilfe schafft hier die Daten ganzer Zeiträume, wie z.B. eines Tages, in einzelnen Datenpunkten zusammenzufassen (etwa Durchschnittstemperatur an diesem Tag). Dies erzeugt zwar mehr Daten in der Datenbank und benötigt somit mehr Platz auf der Festplatte. Allerdings kann auf die Daten effizienter zugegriffen werden, so dass sich unter dem Strich die Geschwindigkeit erhöht.

Die Lösung besteht aus zwei Komponenten. Die eine ist bereits im Frontend eingebaut und aktiviert sich automatisch, sobald sie passende Daten findet. Die andere besteht aus einer weiteren Tabelle mit Scripten die diese füllen.

Zunächst muss die Option in der volkszaehler.conf.php aktiviert werden: (die findet ihr unter: /var/www/volkszaehler.org/etc )

$config['aggregation'] = true;

Die folgende Zeile aggregiert alle bestehenden Daten. Der Vorgang kann daher einige Stunden benötigen:

php /var/www/volkszaehler.org/bin/aggregate run -m full -l day -l hour -l minute

Einschränken auf eine einzelne UUID mittels:

php /var/www/volkszaehler.org/bin/aggregate run <UUID> -m full -l day -l hour -l minute

Mit den folgenden Einträgen in einer crontab hält man den Cache aktuell. Erstellt wird die crontab mit: 'crontab -e'.
Das Script legt nur an, was noch nicht angelegt wurde und läuft daher nur kurz:

*/10 * * * *  php /var/www/volkszaehler.org/bin/aggregate run -m delta -l minute >/dev/null
1 * * * *  php /var/www/volkszaehler.org/bin/aggregate run -m delta -l hour >/dev/null
0 1 * * *  php /var/www/volkszaehler.org/bin/aggregate run -m delta -l day >/dev/null

Anmerkung: wenn die Last auf dem System hoch ist, kann die Aggregation schon mal länger dauern als das Intervall zwischen zwei Aufrufen. Das kann dazu führen, dass die Last weiter ansteigt, da die Aggregation dann ein weiteres Mal aufgerufen wird etc. In diesem Fall empfiehlt sich der Einsatz eines Wrappers, der verhindert, dass die Aggregation mehrfach läuft, z.B. „flock“.

Hierzu werden obige Cron-Einträge ergänzt um:

flock -n /tmp/flock-vz_aggregate.lock

der Eintrag für „minute“ sieht dann also so aus:

*/10 * * * *  flock -n /tmp/flock-vz_aggregate.lock php /var/www/volkszaehler.org/bin/aggregate run -m delta -l minute >/dev/null

Anm.: Die Einträge für „hour“ und „day“ werden nicht mit sich selbst kollidieren (…); wenn diese also kollidieren, dann mit „minute“; so laufen also höchstens 3 Aggregate-Jobs gleichzeitig (minute, hour, day)

Aggregation prüfen

Den aktuellen Zustand der Aggregation (aktiv, Anzahl der Datensätze, Ratio) kann man mit dieser Middleware-Abfrage prüfen:

http://IP-ADRESSE/middleware.php/capabilities/database.json?

Geringere Auflösung durch selteneres Messen

Wer keine feine Auflösung der Messungen im Sekundenbereich braucht, kann die Anzahl der Messungen verringern. Dies reduziert die Datenmenge, macht den Verlauf jedoch ungenauer, da kurze Vorgänge eventuell nicht mehr erfasst werden. Die Kurven verändern sich dann in etwa so, als würde man im Frontend raus zoomen. Da die Daten auch nicht indirekt erfasst wurden, können sie auch nachträglich nicht wieder hergestellt werden.

Das Frontend interpoliert selbständig die Daten, passend zum jeweilgen Kanal.

Skript bzw. cronjob

Falls eine Messung per Script vorgenommen wird wird das Script einfach seltener aufgerufen, z.B. nur noch einmal pro Minute anstatt einmal pro Sekunde, so ist die Auflösung und Datenmenge geringer.

vzlogger

Der vzlogger bietet zwei Möglichkeiten die Zahl der Datensätzen zu reduzieren.

duplicates

Es kann vorkommen das sich ein Zählerstand oder Momentanwert über längere Zeit nicht verändert. Dennoch geht vzlogger davon aus das jeder gleich wichtig ist und schickt ihn an die Middleware weiter was zu aufeinander folgenden Datensätzen mit identischem Wert führt. duplicates ist ein Parameter in der Kategorie channels der vzlogger.conf der diese Folgedaten reduziert.

vzlogger.conf
      "duplicates": 3600,

Die Zahl gibt die Zeit in Sekunden an bis der vzlogger einen gleichbleibendem Wert erstmals wieder an die Middleware sendet. Im Beispiel wären das eine Stunde. Bei Einspeisezählern von PV-Anlagen (die Nachts keine Änderung registrieren) zu empfehlen.
Für Zähler mit geringer Auflösung (z.B. 0,1kWh) wären 60s passend.

aggregate

Der vzlogger bietet die Option, mehrere Messungen zu einer Messung zusammenzufassen. Der vzlogger liest dann zwar noch häufiger, bzw. nimmt die Daten häufiger an, errechnet jedoch über den Zeitraums einen Wert und gibt diesen dann an die Middleware weiter. Dies entlastet sowohl die Middleware und somit den Rechner an sich und hält auch die Datenmenge kleiner.
Die Konfiguration wird mit den Parametern „aggtime“, „aggfixedinterval“ in der Kategorie meters und „aggmode“ bei den channels vorgenommen.

vzlogger.conf
      "aggtime": 60,
      "aggfixedinterval": true,
[...]      
                "aggmode": "max",
  • „aggtime“ bestimmt dabei die Zeit in Sekunden über die der vzlogger sammelt um daraus den Wert zu bestimmen. Sie gilt für alle channel des meter für die eine aggmode definiert wurde.
  • „aggfixedintervall“ bewirkt das mehrere meter synchron aggregieren (schönere Darstellung im Graph und in Verbindung mit Skripten wie „direktverbrauch.php“ zu empfehlen).
  • „aggmode“ bestimmt die Art wie die gesammelten Werte verrechnet werden, sie ist von der Art der Rohdaten abhängig und wird daher für jeden channel seperat definiert.
„avg“ Durchschnitt zu verwenden bei Aktualwerten wie Strom, Spannung oder Temperatur
„max“ Maximalwert zu verwenden bei Zählerständen
„sum“ Summe zu verwenden bei Impulsen (S0)
„none“ keine Aggreagtion vornehmen, alle Daten des channel gehen an die Middleware

Aufrüstung: Hardware

Es gibt mehrere Möglichkeiten durch Einsatz von mehr Hardware das System zu beschleunigen: * Das System hat ein n-Tier-Architektur. Dies bedeutet, dass jede einzelne Komponente (Messung, Middleware, Datenbank) beliebig auf das Netzwerk oder ins Internet verlegt werden kann. Beispiele:

  • Man könnte z.B. die Datenbank von einem Raspi auf ein NAS verlegen. Der Einsatz von Festplatten gegenüber einer SD-Karte beschleunigt das System schon erheblich.
  • Wer in seinem Netz einen eigenen Server betreibt kann auch diesen nutzen. Die Datenmengen die anfallen sind für ein aktuelles System normalerweise kein Problem. Wer z.B. 32GB Hauptspeicher erübrigen kann hält einen Großteil der Daten im Hauptspeicher und hat so immer einen schnellen Zugriff.
  • Denkbar ist auch Middleware und Datenbank auf ein Webhosting oder einen angemieteten Server zu verlegen. Installation auf Webhoster

Einsatz und Konfiguration anderer Software

Es gibt zahlreiche Möglichkeiten im Bereich der Konfiguration anzusetzen. Diese sind jedoch von den individuellen Gegebenheiten abhängig. Ein paar Anregungen:

  • Einsatz einer Ramdisk an geschickter Stelle
  • Einsatz von diskless Clients die von einem schnellen Server das Filesystem beziehen
  • schlankere Webserver wie lighttpd oder ngnix sparen gegenüber apache Hauptspeicher und performen teilweise schneller
  • passende Konfiguration des apache wie Anzahl der Clients kann Durchsatz erhöhen
  • Einsatz von php-Caches wie hier beschrieben.
  • Konfiguration der Datenbank z.B. zur besseren Nutzung des Hauptspeichers
  • Einsatz von speziellen Datenbankfeatures wie der Partitionierung
howto/datenmengen.1544459694.txt.gz · Zuletzt geändert: 2018/12/10 17:34 von jau