Wie soll ich Zeitreihen in Mongodb speichern?


11

Ich muss eine Datenbank mit Zeitreihen erstellen und die folgenden Aufgaben ausführen:

  • neue Zeitreihen erstellen
  • Aktualisieren Sie vorhandene Zeitreihen
  • eine oder mehrere Zeitreihen gleichzeitig abfragen (zum Beispiel alle Zeitreihen für dasselbe Datum usw.)

Ist Mongo daran angepasst und wenn ja, wie soll ich die Datenbank strukturieren? (Einmalige Serie = ein Dokument? Oder ein Dokument = ein Eintrag der Zeitserie, und alle diese Dokumente bilden die Sammlung, die die gesamte Zeitreihe darstellt?)

Ich bin hier etwas verloren und finde es schwierig, Informationen zu finden, da Mongo normalerweise als sehr flexibel dargestellt wird, sodass der Benutzer die Wahl in der Infrastruktur hat.

Jeder Link zu einem Tutorial, in dem speziell erklärt wird, wie Zeitreihen in Mongo verwaltet werden, ist sehr willkommen.

Vielen Dank!


Lesen Sie noch heute das Schemadesign für Zeitreihendaten in MongoDB . Sehr gut darüber schreiben.
Akauppi

Es gibt ein aktualisiertes Whitepaper, in dem Zeitreihen in MongoDB behandelt werden. mongodb.com/collateral/time-series-best-practices
Robert Walters

Antworten:


6

Ich schlage einen einzelnen Zeitreiheneintrag pro Dokument vor. Es gibt einige Probleme beim Speichern mehrerer Einträge pro Dokument:

  • Ein einzelnes Dokument ist auf eine bestimmte Größe (derzeit 16 MB) beschränkt. Dies begrenzt, wie viele Einträge in einem einzelnen Dokument gespeichert werden können
  • Wenn einem Dokument weitere Einträge hinzugefügt werden, wird das gesamte Dokument (und die Zeitreihen) unnötigerweise gelöscht und einem größeren Speicherplatz zugewiesen
  • Abfragen zu Unterdokumenten sind im Vergleich zu Abfragen zu regulären Dokumenten begrenzt
  • Dokumente mit sehr flachen Strukturen (wie ein Unterdokument pro Sekunde) sind nicht performant
  • Die integrierte Kartenreduzierung funktioniert bei Unterdokumenten nicht so gut

Beachten Sie auch, dass ein Zeitstempel in die Standard-MongoDB-Objekt-ID integriert ist . Sie können dies verwenden, wenn die Zeitreihengenauigkeit weniger als eine Sekunde beträgt.

Hier ist ein Beispiel für ein BSON-Dokument aus einer Ereignisprotokollierungsbibliothek, die MongoDB verwendet :

Example format of generated bson document:
{
    'thread': -1216977216,
    'level': 'ERROR',
    'timestamp': Timestamp(1290895671, 63),
    'message': 'test message',
    'fileName': '/var/projects/python/log4mongo-python/tests/test_mongo_handler.py',
    'lineNumber': 38,
    'method': 'test_emit_exception',
    'loggerName':  'testLogger',
    'exception': {
        'stackTrace': 'Traceback (most recent call last):
                       File "/var/projects/python/log4mongo-python/tests/test_mongo_handler.py", line 36, in test_emit_exception
                       raise Exception(\'exc1\')
                       Exception: exc1',
        'message': 'exc1',
        'code': 0
    }
}

Da ein Ereignisprotokoll einer Zeitreihe ähnelt, kann es sich lohnen, den Rest des Codes zu studieren . Es gibt Versionen in Java, C #, PHP und Python.

Hier ist ein weiteres ähnliches Open Source-Projekt: Zarkov


[Update] Als Antwort auf den Kommentar von @ RockScience habe ich einige weitere Referenzen hinzugefügt:


Das wird eine Menge Dokumente sein, wenn meine Zeitreihe mehrere Jahre lang Intraday-Daten enthält !!! Ist es nicht ein Problem, so viele Dokumente zu haben? Ich komme aus einem SQL-Hintergrund und finde es einfach nicht sehr speichereffektiv. (Da es viele Wiederholungen für alle Datenpunkte derselben Zeitreihe geben wird)
RockScience

@RockScience: MongoDB verzichtet wie viele andere NoSQL-Datenbanken auf Normalisierung und Speichereffizienz zugunsten anderer Dinge wie Flexibilität, Geschwindigkeit und reduzierter CPU-Auslastung. Wenn Sie Speichereffizienz benötigen, ist MongoDB möglicherweise nicht die richtige Lösung für Sie. MongoDB kopiert den vollständigen Textnamen jedes Feldes in jedes Dokument, um laut zu schreien! Wie auch immer, ich habe meine Antwort mit ein paar weiteren Ressourcen aktualisiert, einschließlich einer Fallstudie darüber, wie MongoDB zum Speichern einer sehr großen Zeitreihe verwendet wurde.
Leftium

2

Ich habe diese Frage auf SO ( /programming/4814167/storing-time-series-data-relational-or-non ) gefunden, wo das OP fragt, wie eine Zeitreihe gespeichert werden soll. Obwohl seine Frage eher auf der Verwendung einer NoSQL-Datenbank oder eines RDBMS basiert und Sie ziemlich darauf eingestellt zu sein scheinen, eine NoSQL-Datenbank zu verwenden.

Außerdem wurde dieser Artikel zu " Die eindeutigen Datenbankanforderungen für Zeitreihendaten " gefunden, der möglicherweise hilfreich ist.

Hoffe das hilft.


2

Ja, definitiv, die NoSQL-Datenbank eignet sich besser zum Speichern von Zeitreihendaten als herkömmliches RDBMS.

Ja, MongoDB ist außergewöhnlich an diesen Anwendungsfall angepasst.

-Wie sollten Sie die Datenbank strukturieren? Ein Dokument = eine Zeitreiheneingabe im Vergleich zu mehreren Zeitreihen.

Die Antwort besteht darin, mehrere Zeitreihen in einem Dokument zu speichern. Weniger Dokumente verbessern die Leistung bei weniger Lesevorgängen. Ein Trick besteht darin, Ihr Dokument mit den vordefinierten Werten vorzubereiten. Dadurch wird die Aktualisierung des Dokuments optimiert, indem das Auffüllen von Datensätzen vermieden wird .

Hier ist ein Schemabeispiel zum optimalen Speichern von Zeitreihen im Wert von einer Stunde mit einem Minutenintervall:

{
  timestamp_hour: ISODate("2015-07-02T23:00:00.000Z"),
  type: memory_used”,
  values: {
    0: 999999,
    1: 1000000, 
    …,
    58: 0,
    59: 0
  }
}

Sie initiieren es mit 0 Werten und dann werden die Updates optimiert. Die Lesevorgänge werden optimiert, da ein Dokument anstelle von 60 gelesen wird. Wenn Sie Daten im Wert von einem Tag speichern müssen oder einen Monat, in dem Sie mit derselben Technik fortfahren, haben Sie die Idee.

Hier ist der Link zu einem Tutorial, in dem speziell erklärt wird, wie Zeitreihen in MongoDb im offiziellen MongoDb-Blog verwaltet werden: http://blog.mongodb.org/post/65517193370/schema-design-for-time-series-data-in- mongodb


1
Das Zusammenfassen von Daten in einem Dokument ist aufgrund der Leistung und der Ressourcennutzung besser. In der aktualisierten Zeitreihe für das Whitepaper zu den Best Practices von MongoDB werden drei Schemaszenarien erläutert. mongodb.com/collateral/time-series-best-practices
Robert Walters
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.