Ein Großteil der Antwort hängt davon ab, was Sie damit tun möchten, nachdem es gesammelt wurde. Das Speichern vieler Daten ist einfach: Legen Sie sie einfach in Protokolldateien ab, ohne dass eine Datenbank erforderlich ist. Wenn Sie dagegen komplexe Analysen und Data Mining durchführen möchten, ist eine Datenbank hilfreich.
Die nächste Frage ist, welche Art von Analyse Sie durchführen werden. Wird es für eine Teilmenge der Daten ausgeführt, die eine bestimmte Eigenschaft haben, nur die letzte Stunde / Tag / Woche / Monat, können die Daten aggregiert oder irgendwie vorberechnet werden? Mit anderen Worten: Benötigen Sie Zugriff auf den gesamten Datensatz in der Form, in der er erfasst wird? Können Sie Daten archivieren, wenn sie zu alt werden, um interessant zu sein? Können Sie die Daten aggregieren und die Analyse für die Aggregation durchführen?
Nach meiner Erfahrung aus der Arbeit mit Werbeanalysen (Sammeln von Milliarden von Datenpunkten zu Anzeigenrisiken) ist die Aggregation der Schlüssel. Sie sammeln Rohdaten, bereinigen sie und speichern sie in einer Datenbank wie MongoDB, Cassandra oder sogar MySQL, mit der Sie Aktualisierungen und Abfragen durchführen können. Anschließend aggregieren Sie die Daten regelmäßig und entfernen sie aus der Datenbank (aber archivieren Sie die Rohdaten, möglicherweise benötigen Sie sie später).
Die Aggregation stellt im Wesentlichen alle Fragen, die Sie zu den Daten stellen möchten, und speichert sie in einer Form, die das Abrufen der Antwort auf eine bestimmte Frage erleichtert. Angenommen, Sie möchten wissen, an welchem Wochentag das meiste X vorhanden ist. Die naive Implementierung besteht darin, alle aufgezeichneten Signale in einer großen Tabelle zu speichern und eine Abfrage durchzuführen, die alle Zeilen mit X summiert. Als Anzahl der gesammelten Signale wachsen Diese Abfrage wird immer länger dauern. Dabei hilft keine Indizierung, kein Sharding oder keine Optimierung. Stattdessen sehen Sie sich jeden Tag / jede Stunde / Minute (abhängig vom genauen Anwendungsfall und der Aktualität Ihrer Berichterstellung) die neuen Signale an, die Sie aufgezeichnet haben, und erhöhen für jedes X den Zähler, der festhält, wie viele X gab es am Montag, wenn es ein Montag ist, Dienstag, wenn es ein Dienstag ist und so weiter. Auf diese Weise können Sie später die Anzahl für jeden Wochentag abrufen und vergleichen. Sie tun dies für alle Fragen, die Sie beantworten möchten, und entfernen dann die Signale aus der Datenbank (behalten jedoch die Rohdaten bei).
Der Datenbanktyp, in dem Sie die Aggregate aufzeichnen, kann mit dem identisch sein, in dem Sie die eingehenden Signale speichern, muss jedoch nicht sehr ausgefallen sein. Es werden Schlüssel gespeichert, die eine bestimmte Antwort darstellen, und Werte, die normalerweise nur Zahlen sind.
Im Data Warehousing der alten Schule wird die Datenbank, in der Sie die eingehenden Signale speichern, als OLTP (für die Online-Transaktionsverarbeitung) und die Datenbank, in der Sie die Aggregate speichern, als OLAP (für die Online-Analyseverarbeitung) bezeichnet. OLTP ist für das Einfügen optimiert und OLAP ist für das Abfragen optimiert. Die Begriffe sind alt und wenn die Leute sie hören, neigen sie dazu, sofort an SQL und Starschemas und all das zu denken. Vielleicht sollte ich sie nicht verwenden, aber sie sind bequeme Begriffe.
Auf jeden Fall möchten Sie für OLTP etwas, das sich schnell in Daten einfügen lässt, aber auch etwas, das das Indizieren der Daten und das Suchen nach Dingen unterstützt. Die Aggregation wird durch eine Datenbank erheblich unterstützt, die die Hälfte der Arbeit zum Summieren und Finden von Maxima und Minima erledigt. Ich mag MongoDB wirklich, weil es so einfach einzurichten und damit zu arbeiten ist. Die Daten, mit denen ich arbeite, sind in der Regel unübersichtlich und nicht alle Elemente haben die gleichen Eigenschaften. Daher ist die verzeihende Unschärfe von Mongo ein Segen. Auf der anderen Seite klingen Ihre Daten viel einheitlicher, sodass Mongo Ihnen möglicherweise nicht so viele Vorteile bietet. Übersehen Sie jedoch noch nicht die guten alten relationalen Datenbanken. Wenn Sie viel summieren und so weiter, dann ist SQL großartig, dafür ist es gebaut.
Für OLAP funktioniert etwas viel Einfacheres, ein Schlüsselwertspeicher ist alles, was Sie brauchen. Ich benutze Redis, weil es auch sehr einfach ist, damit zu arbeiten und es einzurichten. Außerdem können Sie mehr als skalare Werte speichern, was praktisch ist. Manchmal ist Ihr Wert tatsächlich eine Liste oder ein Hash. In den meisten Schlüsselwertspeichern müssen Sie solche Werte codieren, aber Redis behandelt sie nativ. Der Nachteil von Redis ist, dass Sie keine Abfragen durchführen können ("wie in" Geben Sie mir alle Zeilen, die diesen Wert für Y haben "). Sie müssen die Indizes für Ihre Daten selbst beibehalten. Auf der anderen Seite benötigen Sie nicht viel Indizes, da die Antworten auf alle Ihre Fragen vorberechnet wurden. Sie müssen lediglich die Antwort mit einem Schlüssel nachschlagen, der durch die Frage definiert wird. Für die obige Frage, welcher Wochentag das meiste X hat, suchen Sie die Anzahl der X-Arbeiten am Montag, Dienstag usw. nach.
Fazit: MongoDB und Redis funktionieren hervorragend für mich. Ich denke nicht, dass MongoDB für Ihren Anwendungsfall sehr gut ist, stattdessen denke ich, dass Sie tatsächlich mehr von einer herkömmlichen SQL-Datenbank profitieren könnten (aber es hängt davon ab, ob Ihre Daten wirklich einfach sind, Sie könnten Redis möglicherweise vollständig verwenden). Das Wichtigste ist, nicht den Fehler zu machen, zu denken, dass Sie die Daten in einer Datenbank haben und für immer aufbewahren müssen. Aggregation und Wegwerfen alter Daten ist der Schlüssel.