Speichern von Zeitreihendaten, relational oder nicht?

Ich bin ein system zu erschaffen welches abfragt, Geräte für Daten auf unterschiedlichen Metriken wie CPU-Auslastung, disk-Auslastung, Temperatur usw. bei (wahrscheinlich) 5-Minuten-Intervallen mit Hilfe von SNMP. Das ultimative Ziel ist es, Visualisierungen zu einem Benutzer des Systems in form von Zeitreihen-Grafiken.

Ich habe mir mit Hilfe von RRDTool in der Vergangenheit aber abgelehnt, da die Speicherung der erfassten Daten auf unbestimmte Zeit ist wichtig für mein Projekt, und ich möchte eine höhere Ebene und flexibler Zugriff auf die erfassten Daten. Also meine Frage ist wirklich:

Was ist besser, eine relationale Datenbank (MySQL oder PostgreSQL) oder eine nicht-relationale oder NoSQL-Datenbank (z.B. MongoDB oder Redis) im Hinblick auf die performance bei der Abfrage von Daten in Diagrammen.

Relationalen

Angesichts einer relationalen Datenbank, die ich verwenden würde, ein data_instances Tabelle, in der gespeichert würde jede Instanz der erfassten Daten für jede Metrik, die gemessen wird, für alle Geräte, die mit den folgenden Feldern:

Felder: id fk_to_device fk_to_metric metric_value timestamp

Wenn ich will zeichnen Sie ein Diagramm für einen bestimmten Metrik auf einem bestimmten Gerät, ich muss die Abfrage dieser einzigartige Tisch herausfiltern die anderen Geräte, und die anderen Kennzahlen analysiert werden, die für dieses Gerät:

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

wo d ist die Anzahl der Gerätem_d ist die kumulierte Anzahl der Metriken aufgezeichnet für alle Geräte, die f ist die Frequenzin dem die Daten abgefragt und t ist die Summe des Zeit das system sammelt Daten.

Für einen Benutzer Aufnahme 10 Metriken für 3 Geräte, alle 5 Minuten für ein Jahr, wir hätten nur unter 5 Millionen records.

Indizes

Ohne Indizes auf fk_to_device und fk_to_metric Scannen dieses kontinuierlich wachsenden Tabelle würde zuviel Zeit in Anspruch nehmen. So indizieren die oben erwähnten Felder und auch timestamp (für das erstellen von Grafiken mit einem lokalen Zeit) ist Voraussetzung.

Nicht-Relationale (NoSQL)

MongoDB hat das Konzept einer Sammlungim Gegensatz zu Tabellen, diese können programmgesteuert erstellt werden, ohne setup. Mit diesen konnte ich die Partitionierung der Speicherung der Daten für jedes Gerät, oder sogar jede Metrik erfasst für jedes Gerät.

Habe ich keine Erfahrung mit NoSQL und weiß nicht, ob Sie bieten jede Abfrage leistungssteigernde Funktionen wie die Indizierung, jedoch der Vorherige Absatz schlägt dabei die meisten der traditionellen, relationalen Abfragen in der Struktur, durch die die Daten gespeichert werden, unter NoSQL.

Unentschlossen

Würden eine relationale Lösung mit der richtigen Indizierung zu reduzieren, um einen crawl innerhalb des Jahres? Oder macht die Sammlung basierte Struktur von NoSQL-Ansätze (welche passt zu meiner mentalen Modell der gespeicherten Daten) einen spürbaren Vorteil?

InformationsquelleAutor der Frage Marcus Whybrow | 2011-01-27

Schreibe einen Kommentar