Mein Dienst hat eine große Anzahl von Benutzerereignissen, und wir möchten Dinge wie "Zählen des Auftretens des Ereignistyps T seit Datum D " ausführen .
Wir versuchen zwei grundlegende Entscheidungen zu treffen:
Was soll man aufbewahren? Speichern jedes Ereignisses oder nur Speichern von Aggregaten
- (Ereignisprotokollstil) Protokolliere jedes Ereignis und zähle sie später, vs.
- (Zeitreihenstil) Speichern Sie eine einzelne aggregierte "Anzahl von Ereignissen E für Datum D " für jeden Tag
Wo sollen die Daten gespeichert werden?
- In einer relationalen Datenbank (insbesondere MySQL)
- In einer nicht relationalen (NoSQL) Datenbank
- In Flatlog-Dateien (zentral über das Netzwerk gesammelt
syslog-ng
)
Was ist die Standardpraxis / wo kann ich mehr über den Vergleich der verschiedenen Systemtypen lesen?
Zusätzliche Details:
- Der gesamte Ereignisstrom ist groß, möglicherweise Hunderttausende von Einträgen pro Tag
- Derzeit müssen wir jedoch nur bestimmte Arten von Ereignissen zählen
- Wir benötigen nicht unbedingt Echtzeitzugriff auf die Rohdaten oder Aggregationsergebnisse
IMHO ist "Alle Ereignisse in Dateien protokollieren, sie zu einem späteren Zeitpunkt crawlen, um den Stream zu filtern und zu aggregieren" ein ziemlich standardmäßiger UNIX-Weg, aber meine Rails-y-Landsleute scheinen zu glauben, dass nichts real ist, es sei denn, es ist in MySQL.
SELECT...GROUP BY
, speichert problemlos die Ergebnisse von SELECT
s), 2) Graphite für einfache Aggregation und Visualisierung in großem Maßstab und 3) Protokollieren vollständiger Ereignisse als Referenz und zum Beobachten von Details des Datenflusses in Echtzeit. Jedes war auf unterschiedliche Weise wertvoll.