2017-01-20 3 views
0

Meine Anwendung speichert Performance-Zeitreihendaten in CrateDB, und um das Setup richtig zu machen, habe ich ein paar Fragen, da es rund 72M Datensätze pro Tag sein wird und es sollte richtig skalieren :). Mein Ziel ist es, die resultierenden Daten mit Grafana sichtbar zu machen und zur Zeit habe ich die folgende Struktur im Sinn:Wie speichern Sie die Leistungsdaten in CrateDB am besten?

CREATE TABLE metrics (
    ts TIMESTAMP, 
    hostname STRING, 
    servicename STRING, 
    perfdata OBJECT(DYNAMIC) 
) 

// for example 
{ 
    "hostname": "localhost", 
    "servicename": "ping", 
    "timestamp": 1483699527, 
    "perfdata": { 
     "rta": { 
      "current": 0.5, 
      "unit": "ms", 
      "warn": 100, 
      "critical": 200 
     }, 
     "pl": { 
      "current": 0, 
      "unit": "%", 
      "warn": 10, 
      "crit": 20 
     } 
    } 
} 

Die wichtigen Bits sind die Host-/Servicename, der Name der Metrik und Werte, und der Zeitstempel. Welches wäre auch das alternative Schema:

CREATE TABLE metrics (
    ts TIMESTAMP, 
    hostname STRING, 
    servicename STRING, 
    metric OBJECT(DYNAMIC) AS (
     unit STRING, 
     name STRING, 
     value DOUBLE, 
    )  
) 

Also welches wäre der bevorzugte Weg, um die Daten zu speichern? Muss ich auch partitionieren? Meine Aggregationen zeigen normalerweise die letzten 24h und selten den letzten Monat ...

Vielen Dank!

Antwort

0

Im Allgemeinen würde ich empfehlen, mit dem zweiten Tabellenschema zu gehen, da es einfacher ist und Sie die Rohdaten erfassen können (statt etwas vormontiert) und die Aggregation für das tun, was Sie tatsächlich brauchen.

Diese Frage ist jedoch ziemlich schwierig, da es sehr von den tatsächlichen Anforderungen abhängt. Also im Wesentlichen das kombinierte Schema macht Updates schwierig (Objekte können nur ersetzt und nicht aktualisiert werden) und erfordert daher die Daten zusammen gesendet werden (und vielleicht im gleichen Tempo gesammelt?).

Darüber hinaus kann die Einrichtung partitioning nützlich sein. Dies kann Abfragen beschleunigen und ermöglicht change the number of shards for future partitions (und ermöglicht es Ihnen, besser skalieren). Üblich ist die Partitionierung nach Monat oder Woche, in einigen Fällen auch nach Tag. Aber es muss darauf achten, dass die Anzahl der Splitter nicht explodiert, da Shards auch Systemressourcen erfordern.

CrateDB arbeitet sehr gut mit Grafana dank der datasource plugin :)

0

sah nur diese eine jetzt, und ich habe mit perdata (nagios) und cratedb herum spielen. Was wir getestet haben (basierend auf einer mongodb-Zeitreihen-Demo) war die Speicherung pro Stunde und ließ perfdata [ts] = {perf object} (wir haben tatsächlich perfdata getestet ['minute'] ['second'] = {})

So

ein 24-Stunden-Schema würde durch die Definition eines Primärschlüssel auf dem Host/Service/Sie tun perfdata [ 'Stunde'] [ 'Minute']

Also 'auf doppelte Schlüssel Update ..'

Eine Abfrage nach Host/Service/Stunde ist nur eine Abfrage :-)

Verwandte Themen