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
Du musst angemeldet sein, um einen Kommentar abzugeben.
Definitiv Relationalen. Unbegrenzte Flexibilität und expansion.
Beiden Korrekturen, sowohl in Konzept und Anwendung, gefolgt von einer Erhöhung.
Korrektur
Ist es nicht "heraus filtern, die un-nötig Daten"; es ist Auswahl nur die benötigten Daten. Ja, natürlich, wenn Sie einen Index zum unterstützen der Säulen identifiziert, die in der WHERE-Klausel, es ist sehr schnell, und die Abfrage hängt nicht von der Größe der Tabelle (grabbing 1.000 Zeilen aus einer 16 Milliarden Zeile der Tabelle ist momentaner).
Ihre Tabelle hat ein ernstes Hindernis. Angesichts Ihrer Beschreibung, die eigentliche PK ist (Gerät, Metrisch, DateTime). (Bitte nennen Sie es nicht TimeStamp, das heißt etwas anderes, aber das ist ein kleineres Problem.) Die Einzigartigkeit der Zeile ist gekennzeichnet durch:
Den
Id
Spalte bringt nichts, es ist voll und ganz überflüssig.Id
Spalte ist noch nie ein Schlüssel (doppelte Zeilen, die nicht in einer Relationalen Datenbank muss durch andere Maßnahmen vermieden werden).Den
Id
Spalte erfordert einen zusätzlichen Index, die offensichtlich behindert die Geschwindigkeit derINSERT/DELETE
und fügt, um den Speicherplatz verwendet.Können Sie es loswerden. Bitte.
Höhe
Nun, das Sie entfernt haben, die Behinderung, die Sie möglicherweise nicht erkannt haben es, aber deine Tabelle ist in der Sechsten Normalform. Sehr hohe Geschwindigkeit, mit nur einem Index für den PK. Für das Verständnis, Lesen die Antwort aus der Was ist Sechster, Normale Form ? überschrift ab.
(Ich habe nur einen index haben, nicht drei; auf dem Nicht-SQL müssen Sie möglicherweise die drei Indizes).
Ich habe genau die gleiche Tabelle (ohne die
Id
"Schlüssel", natürlich). Ich habe eine zusätzliche SpalteServer
. Ich unterstütze mehrere Kunden aus der Ferne.(Server, Device, Metric, DateTime)
Die Tabelle kann verwendet werden, um die Pivot-Daten (ie.
Devices
über die Spitze undMetrics
unten auf der Seite, oder geschwenkt) mit genau dem gleichen SQL-code (ja, den Schalter der Zellen). Ich benutze die Tabelle zu errichten, eine unbegrenzte Vielzahl von Grafiken und Diagrammen für den Kunden wieder, die Ihre server-performance.Statistiken-Daten-Modell.
(Zu groß für inline; einige Browser nicht laden kann inline; klicken Sie auf den link. Auch das ist die veraltete demo-version, aus offensichtlichen Gründen, die ich nicht zeigen kann, kommerzielles Produkt, - DM.)
Erlaubt es mir zu produzieren Diagrammesechs Tastenanschläge nach Erhalt einer roh-überwachung stats-Datei aus dem Kunden, mit der eine einzelnen SELECT-Befehl. Beachten Sie die mix-and-match; OS und server auf dem gleichen chart ein; eine Vielzahl der Drehpunkte. Natürlich, es gibt keine Begrenzung für die Anzahl der stats-Matrizen, und damit die charts. (Verwendet mit dem Kunden freundlicher Genehmigung.)
Leser, die nicht vertraut sind mit dem Standard für die Modellierung von Relationalen Datenbanken, finden die IDEF1X-Notation hilfreich.
Eine Weitere Sache, Die
Nicht zuletzt, SQL ist eine IEC/ISO/ANSI-Standard. Die freeware ist eigentlich Non-SQL; es betrügerisch ist, den Begriff SQL, wenn Sie nicht den Standard. Sie bieten "extras", aber Sie fehlen die Grundlagen.
InformationsquelleAutor der Antwort PerformanceDBA
Gefunden, sehr interessant, die oben genannten Antworten.
Versuchen, fügen Sie ein paar mehr überlegungen hier.
1) Daten-aging
Time-series-management in der Regel erstellen müssen aging-Maßnahmen. Ein typisches Szenario (z.B. monitoring server-CPU) benötigt zum speichern:
1-Sek raw-samples für einen kurzen Zeitraum (z.B. 24 Stunden)
5-min detail-Aggregat-Proben für einen mittleren Zeitraum (z.B. 1 Woche)
1-Stunden - detail über, die (z.B. bis 1 Jahr)
Obwohl relationale Modelle machen es möglich, dass mein Unternehmen implementiert riesige zentrale Datenbanken für einige große Kunden mit Zehntausenden von Datenreihen) zu verwalten, ist es angemessen, die neue Generation der datenspeicher hinzufügen von interessanten Funktionalitäten, die erkundet werden wie:
automatisierte Datenbereinigung (siehe Redis " VERFALLEN Befehl)
mehrdimensionale Aggregationen (z.B. map-reduce-jobs a-la-Splunk)
2) Real-time-Sammlung
- Noch wichtiger-einige nicht-relationale datenspeicher sind von Natur aus verteilt und ermöglichen eine sehr viel effizientere Echtzeit-(oder nahezu Echtzeit) Daten-Sammlung, die ein problem sein könnte bei RDBMS, weil die Schaffung von hotspots (die Verwaltung die Indexierung während dem einsetzen in einer einzelnen Tabelle). Dieses problem in der RDBMS-Raum ist in der Regel gelöst, die Rückkehr zum batch-import-Verfahren (wir schafften es auf diese Weise in der Vergangenheit) während der no-sql Technologien gelungen, die massive Echtzeit-Erfassung und aggregation (siehe Splunk zum Beispiel, erwähnt in den vorherigen Antworten).
InformationsquelleAutor der Antwort Paolo Bozzola
Sie Tabelle Daten in eine einzige Tabelle. So relationalen vs nicht relational ist nicht die Frage. Im Grunde müssen Sie sehr viel Lesen von sequenziellen Daten. Nun, wenn Sie haben genug RAM zur Speicherung von einem Jahr im Wert von Daten, dann nichts wie mit Redis/MongoDB, etc.
Meist NoSQL-Datenbanken speichern Ihre Daten auf denselben Speicherort auf der Festplatte und in komprimierter form zu vermeiden, mehrere Datenträger zuzugreifen.
NoSQL-nicht die gleiche Sache wie das erstellen des Indexes auf die device-id und Metrik-id, aber auf seine eigene Weise. Mit der Datenbank-auch wenn Sie dies tun, werden der index und Daten werden möglicherweise an verschiedenen Orten, und es wäre ein viel disk-IO.
Tools wie Splunk sind mit NoSQL-Backend zum speichern von Zeitreihendaten und dann mit Karte reduzieren zu erstellen Aggregate (was könnte das sein, was Sie möchten später). Also meiner Meinung nach zu verwenden NoSQL ist eine option, die Menschen haben es schon versucht für ähnliche Anwendungsfälle. Wird aber eine million Zeilen, um die Datenbank zu durchsuchen (vielleicht auch nicht , mit anständiger hardware und richtiger Konfiguration).
InformationsquelleAutor der Antwort Ravindra
Wenn Sie auf der Suche bei GPL-Pakete, RRDTool ist gut zu sehen.
Es ist ein gutes Werkzeug für die Speicherung, extrahieren und abbilden der mal-Serie von Daten.
Ihre use-case sieht genau so aus wie time-series data.
InformationsquelleAutor der Antwort sunil
Erstellen Sie eine Datei, nennen Sie es, 1_2.Daten. weired Idee? was Sie bekommen:
=> timestamp Abfragen ausführen erstaunlich schnell, da können Sie binäre Suche zum finden der richtigen Stelle in der Datei zu Lesen.
wenn Sie es mögen, sogar noch mehr optimiert Gedanken zum teilen Ihrer Dateien, wie, dass;
oder verwenden kdb+ von http://kx.comweil Sie tun all dies für Sie:) spaltenorientiert ist, was Ihnen helfen kann.
Es ist eine cloud-basierte Spalten-orientierte Lösung auftauchen, so möchten Sie vielleicht einen Blick auf haben: http://timeseries.guru
InformationsquelleAutor der Antwort hellomichibye
Dies ist ein problem, das wir haben, zu lösen hatte, an ApiAxle. Wir schrieb einen blog-postwie wir es Taten mit Redis. Es wurde nicht für sehr lange, aber es ist zu beweisen, um wirksam zu sein.
Habe ich auch verwendet RRDTool für ein anderes Projekt, das ausgezeichnet war.
InformationsquelleAutor der Antwort Phil Jackson
Ich denke, dass die Antwort für diese Art von Frage sollte rotieren hauptsächlich über die Art und Weise Ihrer Datenbank nutzen Lagerung.
Einige Datenbank-Server mit RAM und Festplatte, einige verwenden den Arbeitsspeicher (Optional Datenträger für die Persistenz), etc.
Die meisten gemeinsamen SQL-Datenbank-Lösungen mit Speicher+Festplatte Speicher und schreibt die Daten in eine Zeile basiertes layout (alle eingefügt raw ist geschrieben in der gleichen physischen Standort.
Für timeseries Läden, in den meisten Fällen die Arbeitsbelastung ist so etwas wie: Relativ-geringe Intervall der Menge der Einsätze, während Lesevorgänge Spalte basiert (in den meisten Fällen werden Sie wollen, Lesen Sie eine Reihe von Daten aus einer bestimmten Spalte, die eine Metrik)
Habe ich gefunden Spaltenorientierter Datenbanken (google es, du wirst finden, MonetDB, InfoBright, parAccel, etc) tun tollen job für die Zeit-Serie.
Als für Ihre Frage, die ich persönlich denke, dass etwas ungültig ist (wie alle Diskussionen über die Schuld Begriff NoSQL - IMO):
Sie können einen Datenbank-server, der sprechen kann SQL auf der einen Seite, so dass Ihr Leben sehr einfach, wie jeder weiß, der SQL für viele Jahre, und diese Sprache wurde perfektioniert und immer wieder für Daten Abfragen, aber immer noch nutzen, RAM, CPU-Cache und Festplatte in einem Säulenartig ausgerichteten Weise, so dass Ihre Lösung am besten passen Zeitreihen
InformationsquelleAutor der Antwort Shay
5 Millionen Zeilen ist nichts für die heutige sintflutartigen Daten. Erwarten, dass die Daten in der TB oder PB in nur wenigen Monaten. An dieser Stelle RDBMS nicht skalieren zu der Aufgabe, und wir müssen die lineare Skalierbarkeit von NoSql-Datenbanken. Wäre die Leistung erreicht, die für die säulenförmig-partition zum speichern der Daten verwendet, hinzufügen von mehr Spalten und weniger Zeilen, die Art von Konzept, um die Leistung zu steigern. Nutzen Sie die Open TSDB Arbeit oben auf HBASE-oder MapR_DB, etc.
InformationsquelleAutor der Antwort Juan Asenjo
Ich vor ähnlichen Anforderungen regelmäßig, und haben vor kurzem angefangen mit Zabbix zu sammeln und zu speichern, diese Art von Daten. Zabbix hat seine eigene Grafik-Fähigkeit, aber es ist leicht genug, um zu extrahieren die Daten aus der Zabbix - Datenbank und verarbeiten Sie es wie Sie wollen. Wenn Sie nicht bereits aktiviert ist Zabbix, könnten Sie finden es Ihre Zeit Wert, dies zu tun.
InformationsquelleAutor der Antwort monch1962
Sollten Sie schauen, in Zeitreihen-Datenbank. Es war für diesen Zweck erstellt.
Populäres Beispiel für die Zeitreihen-Datenbank InfluxDB
InformationsquelleAutor der Antwort Adam