Ich erstelle ein System, das Geräte mit (wahrscheinlich) 5-Minuten-Intervallen mithilfe von SNMP nach Daten zu unterschiedlichen Metriken wie CPU-Auslastung, Festplattenauslastung, Temperatur usw. abfragt. Das ultimative Ziel besteht darin, einem Benutzer des Systems Visualisierungen in Form von Zeitreihendiagrammen bereitzustellen.
Ich habe in der Vergangenheit die Verwendung von RRDTool in Betracht gezogen, es jedoch abgelehnt, da das unbegrenzte Speichern der erfassten Daten für mein Projekt wichtig ist. Ich möchte einen höheren und flexibleren Zugriff auf die erfassten Daten. Meine Frage lautet also wirklich:
Was ist besser, eine relationale Datenbank (wie MySQL oder PostgreSQL) oder eine nicht relationale oder NoSQL-Datenbank (wie MongoDB oder Redis) in Bezug auf die Leistung bei der Abfrage von Daten für die grafische Darstellung.
Relational
Bei einer relationalen Datenbank würde ich eine data_instances
Tabelle verwenden, in der jede Instanz von Daten gespeichert wird, die für jede Metrik erfasst wurden, die für alle Geräte gemessen wird, mit den folgenden Feldern:
Felder: id
fk_to_device
fk_to_metric
metric_value
timestamp
Wenn ich ein Diagramm für eine bestimmte Metrik auf einem bestimmten Gerät zeichnen möchte, muss ich diese einzelne Tabelle abfragen , um die anderen Geräte und die anderen für dieses Gerät analysierten Metriken herauszufiltern :
SELECT metric_value, timestamp FROM data_instances
WHERE fk_to_device=1 AND fk_to_metric=2
Die Anzahl der Zeilen in dieser Tabelle wäre:
d * m_d * f * t
wobei d
die Anzahl von IS - Geräte , m_d
ist die akkumulative Zahl der Messwerte für alle Geräte aufgezeichnet werden, f
ist die Frequenz , mit der Daten für die abgefragt wird , und t
ist die Gesamtmenge an Zeit , das System das Sammeln von Daten ist.
Für einen Benutzer, der ein Jahr lang alle 5 Minuten 10 Metriken für 3 Geräte aufzeichnet , hätten wir knapp 5 Millionen Datensätze.
Indizes
Ohne Indexe fk_to_device
und fk_to_metric
Scannen würde diese ständig wachsende Tabelle zu viel Zeit in Anspruch nehmen. Daher ist die Indizierung der oben genannten Felder und auch timestamp
(zum Erstellen von Diagrammen mit lokalisierten Zeiträumen) eine Voraussetzung.
Nicht relational (NoSQL)
MongoDB hat das Konzept einer Sammlung , im Gegensatz zu Tabellen können diese ohne Setup programmgesteuert erstellt werden. Mit diesen konnte ich die Speicherung von Daten für jedes Gerät oder sogar jede für jedes Gerät aufgezeichnete Metrik partitionieren.
Ich habe keine Erfahrung mit NoSQL und weiß nicht, ob sie Funktionen zur Verbesserung der Abfrageleistung wie die Indizierung bieten. Im vorherigen Absatz wird jedoch vorgeschlagen, den größten Teil der traditionellen relationalen Abfragearbeit in der Struktur auszuführen, in der die Daten unter NoSQL gespeichert werden.
Unentschieden
Würde sich eine relationale Lösung mit korrekter Indizierung innerhalb eines Jahres auf einen Crawl reduzieren? Oder bietet die sammlungsbasierte Struktur von NoSQL-Ansätzen (die meinem mentalen Modell der gespeicherten Daten entspricht) einen spürbaren Vorteil?