2015-10-26 12 views
45

Nach dem Prometheus webpage besteht ein Hauptunterschied zwischen Prometheus und InfluxDB im Usecase: Während Prometheus nur Zeitreihen speichert, ist InfluxDB besser darauf ausgerichtet, einzelne Ereignisse zu speichern. Da es an der Speicher-Engine von InfluxDB einige wichtige Arbeiten gab, frage ich mich, ob das immer noch stimmt.Anwendungsfälle: InfluxDB vs. Prometheus

Ich möchte eine Zeitreihendatenbank einrichten und abgesehen vom Push/Push-Modell (und wahrscheinlich einem Unterschied in der Leistung) kann ich keine große Sache sehen, die beide Projekte trennt. Kann jemand den Unterschied in den Anwendungsfällen erklären?

Antwort

63

InfluxDB CEO und Entwickler hier. Die nächste Version von InfluxDB (0.9.5) wird unsere neue Speicher-Engine haben. Mit dieser Engine können wir entweder einzelne Ereignisdaten oder regelmäßig gesampelte Serien effizient speichern. d.h. unregelmäßige und regelmäßige Zeitreihen.

InfluxDB unterstützt die Datentypen int64, float64, bool und string, die jeweils unterschiedliche Komprimierungsschemata verwenden. Prometheus unterstützt nur float64.

Für die Komprimierung wird die Version 0.9.5 eine Komprimierung mit Prometheus aufweisen. In einigen Fällen sehen wir bessere Ergebnisse, da wir die Komprimierung von Zeitstempeln basierend auf dem, was wir sehen, variieren. Im besten Fall handelt es sich um eine regelmäßige Serie in exakten Intervallen. In diesen können wir standardmäßig 1k-Punkte-Zeitstempel als 8-Byte-Startzeit, ein Delta (Zick-Zack-codiert) und eine Zählung (auch Zick-Zack-kodiert) komprimieren.

Abhängig von der Form der Daten, die wir gesehen haben < 2,5 Bytes pro Punkt im Durchschnitt nach Kompaktierungen.

YMMV basierend auf Ihren Zeitstempeln, dem Datentyp und der Form der Daten. Zufällige Floats mit Zeitstempeln im Nanosekundenbereich mit großen variablen Deltas wären zum Beispiel die schlechtesten.

Die variable Genauigkeit in Zeitstempeln ist ein weiteres Merkmal, das InfluxDB hat. Sie kann Skalierungszeiten von Sekunden, Millisekunden, Mikrosekunden oder Nanosekunden darstellen. Prometheus ist auf Millisekunden festgelegt.

Ein weiterer Unterschied ist, dass Schreibvorgänge in InfluxDB dauerhaft sind, nachdem eine Erfolgsantwort an den Client gesendet wurde. Prometheus puffert Schreibvorgänge im Speicher und löscht sie standardmäßig alle 5 Minuten, wodurch ein Fenster mit potenziellem Datenverlust geöffnet wird.

Unsere Hoffnung ist, dass, sobald 0.9.5 von InfluxDB veröffentlicht wird, es eine gute Wahl für Prometheus-Benutzer sein wird, als Langzeitmetrik-Speicher (in Verbindung mit Prometheus) zu verwenden. Ich bin mir ziemlich sicher, dass die Unterstützung bereits in Prometheus ist, aber bis die Version 0.9.5 abstürzt, könnte es ein bisschen steinig sein. Natürlich müssen wir zusammenarbeiten und einige Tests durchführen, aber darauf hoffe ich.

Für die Aufnahme von Einzelserver-Metriken würde ich erwarten, dass Prometheus eine bessere Leistung hat (obwohl wir hier keine Tests durchgeführt haben und keine Zahlen haben), da sie keine Schreibvorgänge auf die Festplatte anhängen den Index ausschreiben.

Die Abfragesprache zwischen den beiden ist sehr unterschiedlich. Ich bin mir nicht sicher, was sie unterstützen, was wir noch nicht tun, oder umgekehrt, also müssten Sie in die Dokumente auf beiden graben, um zu sehen, ob es etwas gibt, was Sie tun können, das Sie brauchen. Längerfristig ist es unser Ziel, dass die Suchfunktion von InfluxDB eine Obermenge von Graphite, RRD, Prometheus und anderen Zeitreihenlösungen sein wird. Ich sage Superset, weil wir diese später zusätzlich zu analytischen Funktionen abdecken wollen. Es wird offensichtlich Zeit brauchen, um dorthin zu gelangen.

Schließlich ist ein langfristiges Ziel für InfluxDB die Unterstützung von hoher Verfügbarkeit und horizontaler Skalierbarkeit durch Clustering. Die aktuelle Clusterimplementierung ist noch nicht vollständig und nur in Alpha verfügbar. Wir arbeiten jedoch daran und es ist ein zentrales Designziel für das Projekt. Unser Clustering-Design besteht darin, dass die Daten letztendlich konsistent sind.

Nach meinem Wissen verwendet Prometheus Double-Writes für HA (daher gibt es keine Konsistenzgarantie) und Federation für horizontale Skalierbarkeit. Ich bin mir nicht sicher, wie die Abfrage über föderierte Server funktionieren würde.

Innerhalb eines InfluxDB-Clusters können Sie die Servergrenzen abfragen, ohne alle Daten über das Netzwerk zu kopieren. Das liegt daran, dass jede Abfrage in eine Art MapReduce-Job zerlegt wird, der im laufenden Betrieb ausgeführt wird.

Es gibt wahrscheinlich mehr, aber das ist, was ich im Moment denken kann.

+27

Prometheus Entwickler hier. Paul hat Recht, dass Prometheus immer float-only ist und bleibt (Strings sind nur begrenzt über Labels möglich), während InfluxDB viele Datentypen unterstützt. Ich würde annehmen, dass die Abfragesprachen in der Praxis ziemlich ähnlich sind (Prometheus ist Turing Complete). Unser HA-Ansatz besteht darin, redundante Server zu isolieren, der Alertmanager dedutiert Alerts von ihnen. Wir verwenden im Allgemeinen einen AP-Ansatz für das Monitoring und nicht für den CP, da es besser ist, ein wenig Daten zu verlieren, als wenn Ihr Monitoring untergeht. Prometheus möchte ein System sein, auf das Sie sich im Notfall verlassen können. –

+8

Das InfluxDB-Clustering-Design ist auch weitgehend AP, aber es soll schließlich konsistent sein. Das erreichen wir durch Hinted Handoff (verfügbar in der aktuellen Version) und Active Anti-Entroy (die wir in der 0.9 starten.6 Freigabezyklus). Offensichtlich sind wir noch nicht fertig mit dem Clustering, aber das ist das Designziel. Mehr Details hier: https://influxdb.com/blog/2015/06/03/InfluxDB_clustering_design.html –

+10

Ein anderer Prometheus Entwickler hier. Yep, Prometheus selbst zielt nicht darauf ab, ein dauerhafter Langzeitspeicher zu sein. Aber auf andere Weise ist sein Umfang größer und mehr über aktive Systeme und Service-Überwachung: von Client-Bibliotheken (die nicht nur einige Metriken ausgeben, sondern auch Metriken wie Zähler, Messgeräte, Histogramme und Zusammenfassungen verwalten). , über aktive Zielerkennung/Datenerfassung, Dashboarding, bis hin zur Alarmberechnung und Benachrichtigung. Die Abfragesprache ist ebenfalls nicht SQL-ähnlich, funktioniert aber sehr gut für Berechnungen von dimensionalen Zeitreihendaten. – Julius

5

IIRC aktuelle Prometheus-Implementierung ist rund um alle Daten auf einem einzigen Server eingerichtet. Wenn Sie riesige Datenmengen haben, passt vielleicht nicht alles in Prometheus.

+0

Guter Punkt! Aber lass uns sagen, ich werde meine Sachen auf einem Knoten haben und alles wird funktionieren :) – SpaceMonkey

+5

Prometheus Entwickler hier ist es möglich, Prometheus über einen einzelnen Server hinaus zu skalieren, obwohl selten benötigt. Wir legen Wert auf Zuverlässigkeit gegenüber Konsistenz, da dies für eine kritische Überwachung geeignet ist. Vermeiden Sie daher Clustering. Siehe http://www.robustperception.io/scaling-and-federating-prometheus/ –

+0

Bei Weave Cloud haben wir [eine Multi-Tenant-Version von Prometheus] implementiert (https://www.weave.works/features/prometheus) -Monitoring /), die für einige von Ihnen von Interesse sein könnten. – errordeveloper

21

Wir haben die Marketing-Botschaft von den beiden Unternehmen in den anderen Antworten. Jetzt wollen wir es ignorieren und zurück zur traurigen realen Welt der Zeitdatenreihen kommen.

Einige Geschichte

InfluxDB und prometheus gemacht wurden alte Werkzeuge aus der Vergangenheit Ära (RRDtool, Graphit) zu ersetzen.

InfluxDB ist eine Zeitreihen-Datenbank. Prometheus ist eine Art Sammlung von Metriken und Alarmierungs-Tool, mit einer Speicher-Engine, die nur dafür geschrieben wurde. (Ich bin wirklich nicht sicher, Sie könnten [oder sollten] wiederverwenden die Speicher-Engine für etwas anderes)

Einschränkungen

Leider eine Datenbank zu schreiben ist eine sehr komplexe Angelegenheit. Die einzige Möglichkeit, mit der beide Tools etwas verschicken, besteht darin, alle harten Funktionen, die sich auf Hochverfügbarkeit und Clustering beziehen, fallen zu lassen.

Um es unverblümt zu sagen, ist es eine einzelne Anwendung, die nur einen einzigen Knoten ausführt.

Prometheus hat kein Ziel, Clustering und Replikation zu unterstützen. Der offizielle Weg, Failover zu unterstützen, besteht darin, "2 Knoten auszuführen und Daten an beide zu senden.". Autsch. (Beachten Sie, dass es ernstlich der einzige existierende Weg ist, der unzählige Male in der offiziellen Dokumentation geschrieben wurde).

InfluxDB seit Jahren über Clustering reden ... bis es offiziell März aufgegeben wurde. Clustering ist nicht mehr auf dem Tisch für InfluxDB. Vergiss es einfach. Wenn dies der Fall ist, wird es nur in der Enterprise Edition verfügbar sein.

https://influxdata.com/blog/update-on-influxdb-clustering-high-availability-and-monetization/

In den nächsten Jahren werden wir hoffentlich haben eine ausgereifte Zeitreihen-Datenbank, die alle die harten Probleme im Zusammenhang mit Datenbanken sind der Umgang: Replikation, Failover, Datensicherheit, Skalierbarkeit , backup ...

Im Moment gibt es keine Wunderwaffe.

Was

Auswerten der Datenmenge zu tun zu erwarten.

100 Messwerte * 100 Quellen * 1 Sekunde => 10000 Datenpunkte pro Sekunde => 864 Mega-Datenpunkte pro Tag.

Das schöne an Times Databases ist, dass sie ein kompaktes Format verwenden, sie gut komprimieren, Datenpunkte aggregieren und alte Daten bereinigen. (Hinzu kommen Funktionen, die für Zeitreihen relevant sind.)

Angenommen, ein Datenpunkt wird als 4 Byte behandelt, sind das nur ein paar Gigabyte pro Tag. Glücklicherweise stehen uns Systeme mit 10 Kernen und 10 TB Festplatten zur Verfügung. Das könnte wahrscheinlich auf einem einzigen Knoten laufen.

Die Alternative besteht darin, eine klassische NoSQL-Datenbank (Cassandra, ElasticSearch oder Riak) zu verwenden und dann die fehlenden Bits in der Anwendung zu entwickeln. Diese Datenbanken sind möglicherweise nicht für diese Art von Speicher optimiert (oder sind sie? Moderne Datenbanken sind so komplex und optimiert, kann nicht sicher wissen, es sei denn Benchmarking).

Sie sollten die von Ihrer Anwendung benötigte Kapazität auswerten. Schreiben Sie einen Proof of Concept mit diesen verschiedenen Datenbanken und messen Sie Dinge.

Sehen Sie, wenn es innerhalb der Beschränkungen von InfluxDB fällt. Wenn ja, ist es wahrscheinlich die beste Wette. Wenn nicht, müssen Sie Ihre eigene Lösung zusätzlich zu etwas anderem machen.

+1

Nur zur Info: Bei DalmainerDB gibt es bereits einen Versuch (?) Für eine verteilte Metrik-Datenbank basierend auf riak_core. Aber ich bin mir nicht sicher, wie fortgeschritten dieses Projekt ist. – SpaceMonkey

+1

Wir verwenden ElasticSearch zum Speichern von Metriken in der Produktion unter hoher Belastung. Ich kann bestätigen, dass es für diesen Anwendungsfall alles andere als ideal ist: keine integrierte Retention (wir verwenden den Kurator von Elastic an der Seite), keine eingebaute Komprimierung von alten Daten (wir führen eine benutzerdefinierte ETL auf der Seite) und keine integrierte in Alarmierung (wir führen Yelp ElastAlert auf der Seite). –

12

InfluxDB kann die Produktionslast (Messwerte) von 1000 Servern einfach nicht halten. Es hat einige echte Probleme mit der Datenaufnahme und endet am Ende/hängt und unbrauchbar. Wir haben versucht, es für eine Weile zu verwenden, aber sobald die Datenmenge ein kritisches Niveau erreicht hat, konnte es nicht mehr verwendet werden. Keine Speicher oder CPU-Upgrades geholfen. Daher ist unsere Erfahrung definitiv vermeiden, es ist kein ausgereiftes Produkt und hat ernsthafte architektonische Probleme. Und ich spreche nicht einmal über eine plötzliche Verlagerung auf den Handel von Influx.

Als nächstes recherchierten wir Prometheus und obwohl es erforderlich war, Abfragen neu zu schreiben, nimmt es jetzt 4 mal mehr Metriken auf, ohne irgendwelche Probleme im Vergleich zu dem, was wir versucht haben, Influx zu füttern. Und all diese Last wird von einem einzelnen Prometheus-Server übernommen, der schnell, zuverlässig und zuverlässig ist. Das ist unsere Erfahrung, einen großen internationalen Internet-Shop unter ziemlich starker Last laufen zu lassen.