Sto creando un sistema che esegue il polling dei dispositivi per i dati su metriche variabili come l'utilizzo della CPU, l'utilizzo del disco, la temperatura, ecc. A (probabilmente) intervalli di 5 minuti utilizzando SNMP. L'obiettivo finale è quello di fornire visualizzazioni a un utente del sistema sotto forma di grafici di serie temporali.
Ho esaminato l'utilizzo di RRDTool in passato, ma l'ho rifiutato poiché la memorizzazione indefinita dei dati acquisiti è importante per il mio progetto e desidero un livello superiore e un accesso più flessibile ai dati acquisiti. Quindi la mia domanda è davvero:
Cosa c'è di meglio, un database relazionale (come MySQL o PostgreSQL) o un database non relazionale o NoSQL (come MongoDB o Redis) per quanto riguarda le prestazioni quando si interrogano i dati per la rappresentazione grafica.
relazionale
Dato un database relazionale, utilizzerei una data_instancestabella, in cui verrebbero archiviate tutte le istanze di dati acquisiti per ogni metrica misurata per tutti i dispositivi, con i seguenti campi:
campi: id fk_to_device fk_to_metric metric_value timestamp
Quando voglio disegnare un grafico per una particolare metrica su un particolare dispositivo, devo interrogare questa singolare tabella filtrando gli altri dispositivi e le altre metriche analizzate per questo dispositivo:
SELECT metric_value, timestamp FROM data_instances
WHERE fk_to_device=1 AND fk_to_metric=2
Il numero di righe in questa tabella sarebbe:
d * m_d * f * t
dove dè il numero di dispositivi , m_dè il numero cumulativo di metriche registrate per tutti i dispositivi, fè la frequenza con cui i dati vengono sottoposti a polling ed tè il tempo totale in cui il sistema ha raccolto i dati.
Per un utente che registra 10 metriche per 3 dispositivi ogni 5 minuti per un anno, avremmo poco meno di 5 milioni di record.
indici
Senza gli indici attivi fk_to_devicee la fk_to_metricscansione di questa tabella in continua espansione richiederebbe troppo tempo. Pertanto, timestampè obbligatorio l'indicizzazione dei suddetti campi e anche (per la creazione di grafici con periodi localizzati).
Non relazionale (NoSQL)
MongoDB ha il concetto di una raccolta , a differenza delle tabelle che possono essere create a livello di programmazione senza impostazione. Con questi ho potuto partizionare la memorizzazione dei dati per ciascun dispositivo, o anche ogni metrica registrata per ciascun dispositivo.
Non ho esperienza con NoSQL e non so se forniscono funzionalità di miglioramento delle prestazioni della query come l'indicizzazione, tuttavia il paragrafo precedente propone di eseguire la maggior parte del lavoro di query relazionale tradizionale nella struttura in cui i dati sono archiviati in NoSQL.
indeciso
Una soluzione relazionale con una corretta indicizzazione si ridurrebbe a una scansione entro l'anno? Oppure la struttura basata sulla raccolta di approcci NoSQL (che corrisponde al mio modello mentale dei dati memorizzati) offre un notevole vantaggio?