howto:datenmengen
Unterschiede
Hier werden die Unterschiede zwischen zwei Versionen angezeigt.
Beide Seiten der vorigen RevisionVorhergehende ÜberarbeitungNächste Überarbeitung | Vorhergehende ÜberarbeitungNächste ÜberarbeitungBeide Seiten der Revision | ||
howto:datenmengen [2016/07/24 10:31] – vz User braucht Delete-Recht auf DB -> ergänzt heiko | howto:datenmengen [2021/08/11 13:30] – docker besonderheiten eingefügt mr.gosh | ||
---|---|---|---|
Zeile 1: | Zeile 1: | ||
- | ==== Umgang mit den Datenmengen ==== | + | ======= 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. | 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 === | + | ====== Problem |
Ein D0/ | Ein D0/ | ||
Jeder weitere Kanal benötigt zusätzlich Platz, da er seine eigenen Daten mitbringt. | Jeder weitere Kanal benötigt zusätzlich Platz, da er seine eigenen Daten mitbringt. | ||
- | Es gibt die Möglichleit, die Anzeige im Frontend durch Aggregation von Daten zu Beschleunigen. Dabei werden Daten errechnet, die weiterhin Platz benötigen. | + | 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 " | Zusätzlich wird eine Datenbank umso langsamer je mehr Datensätze sie beinhaltet. Dieser Effekt tut vor allem dann " | ||
Zeile 14: | Zeile 14: | ||
Erfahrungen zeigen, dass so innerhalb von 2 Jahren ca 180 Mio Datensätze gesammelt werden können die ca 19GB Platz benötigen. | 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 === | + | ====== Lösungen |
- | == Daten externalisieren == | + | ===== Daten externalisieren |
* Frontend und Datenbank auf einem leistungsfähigen Rechner installieren | * Frontend und Datenbank auf einem leistungsfähigen Rechner installieren | ||
* Nur Datenbank auf einem leistungsfähigen Rechner installieren | * Nur Datenbank auf einem leistungsfähigen Rechner installieren | ||
<note tip>Man kann die Daten auch auf [[http:// | <note tip>Man kann die Daten auch auf [[http:// | ||
- | == Daten löschen: hart == | + | ===== 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 [[software: | ||
+ | |||
+ | === hart === | ||
Wen die Vergangenheit nicht interessiert, | Wen die Vergangenheit nicht interessiert, | ||
Ein harter Ansatz wäre einfach alles älter als ein gewisser Zeitraum zu löschen. Mit SQL könnte dies z.B. so aussehen: | Ein harter Ansatz wäre einfach alles älter als ein gewisser Zeitraum zu löschen. Mit SQL könnte dies z.B. so aussehen: | ||
Zeile 26: | Zeile 29: | ||
delete FROM `data` where timestamp< | delete FROM `data` where timestamp< | ||
</ | </ | ||
- | Das Beispiel löscht alle Daten die vor den letzten 24h liegen. | + | Das Beispiel löscht alle Daten die vor den letzten 24h liegen. |
- | == Daten löschen: | + | |
+ | === 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. | 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 [[https:// | + | Dazu steht das Script [[https:// |
< | < | ||
- | mysql --user=root -praspberry | + | sudo mysql --user=root -praspberry |
Welcome to the MySQL monitor. | Welcome to the MySQL monitor. | ||
Your MySQL connection id is 37217 [..] | Your MySQL connection id is 37217 [..] | ||
Zeile 46: | Zeile 50: | ||
< | < | ||
- | 0 3 * * * cd / | + | 0 3 * * * cd / |
</ | </ | ||
Die Anzahl der Daten die gelöscht werden soll, sowie die Zeiträume sind frei konfigurierbar am Ende des Scriptes. | Die Anzahl der Daten die gelöscht werden soll, sowie die Zeiträume sind frei konfigurierbar am Ende des Scriptes. | ||
- | == Performance | + | ===== Performance |
- | Bleiben die Daten in voller Auflösung erhalten, wird mit der Zeit das Frontend | + | Bleiben die Daten in voller Auflösung erhalten, wird mit der Zeit die Middleware |
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. | 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, | Die Lösung besteht aus zwei Komponenten. Die eine ist bereits im Frontend eingebaut und aktiviert sich automatisch, | ||
- | Zunächst muss die Option in der volkszaehler.conf.php aktiviert werden: (die findet ihr unter: / | ||
- | < | ||
- | Die folgende | + | |
+ | Die folgende | ||
+ | < | ||
+ | php / | ||
+ | </ | ||
+ | |||
+ | Einschränken auf eine einzelne UUID mittels: | ||
< | < | ||
- | php / | + | php / |
- | php / | + | |
</ | </ | ||
- | Mit den folgenden Einträgen in einer crontab hält man den Cache aktuell. Erstellt wird die crontab mit: ' | + | Mit den folgenden Einträgen in einer crontab hält man den Cache aktuell. Erstellt wird die crontab mit: '' |
Das Script legt nur an, was noch nicht angelegt wurde und läuft daher nur kurz: | Das Script legt nur an, was noch nicht angelegt wurde und läuft daher nur kurz: | ||
< | < | ||
- | */10 * * * * php / | + | */10 * * * * php / |
- | 1 * * * * php / | + | 1 * * * * php / |
- | 0 1 * * * php / | + | 0 1 * * * php / |
</ | </ | ||
Zeile 84: | Zeile 91: | ||
der Eintrag für " | der Eintrag für " | ||
< | < | ||
- | */10 * * * * flock -n / | + | */10 * * * * flock -n / |
</ | </ | ||
Anm.: Die Einträge für " | Anm.: Die Einträge für " | ||
- | == Geringere Auflösung durch selteneres Messen == | + | === Im Falle eines Docker-Setups zu beachten === |
+ | Bei dem Einsatz von docker funktionieren bestimmte Teile der Anleitung etwas anders. Es muss z.B. erstmal der Docler Container betreten werden. Welceh ID der Docker-Container hat findet Ihr mittels des folgenden Befehls heraus: | ||
+ | < | ||
+ | docker ps | grep volkszaehlerorg_volkszaehler | ||
+ | </ | ||
+ | |||
+ | danach könnt ihr den docker Container betreten mittels des folgenden Befehls: | ||
+ | < | ||
+ | docker exec -it --user root hier-die-id-von-eben-eintragen sh | ||
+ | </ | ||
+ | |||
+ | hier kann die aggregation dann mittels des leicht angepassten Befehls von oben durchgeführt werden: | ||
+ | < | ||
+ | php / | ||
+ | </ | ||
+ | |||
+ | === Aggregation prüfen === | ||
+ | Den aktuellen Zustand der Aggregation (aktiv, Anzahl der Datensätze, | ||
+ | < | ||
+ | |||
+ | ===== 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. | 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. | Das Frontend interpoliert selbständig die Daten, passend zum jeweilgen Kanal. | ||
- | Umsetzung: | + | ==== 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. | + | 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, dass sich ein Zählerstand oder Momentanwert über längere Zeit nicht verändert. Dennoch geht vzlogger davon aus, dass jeder gleich wichtig ist und schickt ihn an die Middleware weiter was zu aufeinander folgenden Datensätzen mit identischem Wert führt. // | ||
+ | <code | vzlogger.conf> | ||
+ | " | ||
+ | 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 " | ||
+ | <code | vzlogger.conf> | ||
+ | " | ||
+ | " | ||
+ | [...] | ||
+ | " | ||
+ | * " | ||
+ | * " | ||
+ | * " | ||
- | * Der vzlogger bietet eine entsprechende Option, mehrere Messungen | + | ^ " |
+ | ^ "max" | ||
+ | ^ "sum" | ||
+ | ^ "none"| | keine Aggreagtion vornehmen, alle Daten des //channel// gehen an die Middleware | ||
- | == Aufrüstung: | + | ===== Aufrüstung: |
Es gibt mehrere Möglichkeiten durch Einsatz von mehr Hardware das System zu beschleunigen: | 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: | * 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 | * Man könnte | ||
* 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. | * 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, wie [[howto/ | + | * Denkbar ist auch Middleware und Datenbank auf ein Webhosting oder einen angemieteten Server zu verlegen. [[howto/ |
- | == Einsatz und Konfiguration | + | ===== Einsatz und Konfiguration |
Es gibt zahlreiche Möglichkeiten im Bereich der Konfiguration anzusetzen. Diese sind jedoch von den individuellen Gegebenheiten abhängig. Ein paar Anregungen: | 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 einer Ramdisk an geschickter Stelle |
howto/datenmengen.txt · Zuletzt geändert: 2024/05/18 10:16 von jau