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_instances
tabella, 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_device
e la fk_to_metric
scansione 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?