2015-04-24 11 views
5

Für meinen Fall muss ich 15 Leistungsmesswerte für Geräte erfassen und in InfluxDB speichern. Jedes Gerät hat eine eindeutige Geräte-ID.InfluxDB Leistung

Metriken werden auf folgende Weise in InfluxDB geschrieben. Hier zeige ich nur einen als Beispiel

new Serie.Builder("perfmetric1") 
    .columns("time", "value", "id", "type") 
    .values(getTime(), getPerf1(), getId(), getType()) 
    .build() 

Schreiben von Daten ist schnell und einfach. Aber ich sah eine schlechte Leistung, wenn ich eine Abfrage ausführte. Ich versuche, alle 15 metrischen Werte für die letzte Stunde zu erhalten.

select value from perfmetric1, perfmetric2, ..., permetric15 
where id='testdeviceid' and time > now() - 1h 

Für eine Stunde hat jede Metrik 120 Datenpunkte, es 1800 Datenpunkte insgesamt. Die Abfrage dauert ca. 5 Sekunden bei einer c4.4xlarge EC2-Instanz, wenn sie inaktiv ist.

Ich glaube, InfluxDB kann es besser machen. Ist das ein Problem meines Schemadesigns oder ist es etwas anderes? Würden die Abfragen in 15 parallele Anrufe aufgeteilt werden?

Antwort

2

Erstellen Sie einen Index für ID-Spalte. Scheint, dass die Engine den vollständigen Scan der Tabelle verwendet, um Daten abzurufen. Wenn Sie Ihre Abfrage in 15 Threads aufteilen, wird die Engine 15 vollständige Scans verwenden und die Leistung wird viel schlechter sein.

+0

Danke für die schnelle Antwort! Ich bin ziemlich neu bei InfluxDB, im Grunde nur experimentieren. Es macht alles Sinn. Ich bin ein wenig überrascht, weil dies ein sehr häufiger Anwendungsfall zu sein scheint. Tag-Indizierung ist etwas Neues in der Version 0.9.0 - ich betreibe derzeit den stabilen 0.8.8. "Um Dinge wie Tags und schnelle Suchvorgänge für bestimmte Spaltenwerte zu aktivieren, fügen wir jetzt Unterstützung für Spaltenindizes hinzu. Hier ist das Problem, Spaltenindizes zu verfolgen." –

+0

Die Software ist im Alpha-Zustand der Entwicklung, so dass eine Menge Dinge fehlen und viele Bugs – valentin

4

Wie @valentin antwortet, müssen Sie einen Index für die ID-Spalte für InfluxDB erstellen, um diese Abfragen effizient auszuführen.

In 0,8 stabil können Sie diese "Indizierung" mit continuous fanout queries tun. Zum Beispiel wird die folgende kontinuierliche Abfrage Ihre perfmetric1 Serie in mehrere Reihen der Form erweitern perfmetric1.id:

select * from perfmetric1 into perfmetric1.[id]; 

Später würden Sie tun:

select value from perfmetric1.testdeviceid, perfmetric2.testdeviceid, ..., permetric15.testdeviceid where time > now() - 1h 

Diese Abfrage dauert viel weniger Zeit seit InfluxDB abzuschließen muss keinen vollständigen Scan der Zeitreihen durchführen, um die Punkte für jede zu erhalten.