Estoy creando un sistema que sondea los dispositivos en busca de datos sobre diferentes métricas, como la utilización de la CPU, la utilización del disco, la temperatura, etc. a (probablemente) intervalos de 5 minutos utilizando SNMP. El objetivo final es proporcionar visualizaciones a un usuario del sistema en forma de gráficos de series temporales.
He analizado el uso de RRDTool en el pasado, pero lo rechacé porque almacenar los datos capturados indefinidamente es importante para mi proyecto, y quiero un nivel más alto y un acceso más flexible a los datos capturados. Entonces mi pregunta es realmente:
Lo que es mejor, una base de datos relacional (como MySQL o PostgreSQL) o una base de datos no relacional o NoSQL (como MongoDB o Redis) con respecto al rendimiento al consultar datos para la representación gráfica.
Relacional
Dada una base de datos relacional, usaría una data_instances
tabla, en la que se almacenaría cada instancia de datos capturados para cada métrica que se mide para todos los dispositivos, con los siguientes campos:
Campos: id
fk_to_device
fk_to_metric
metric_value
timestamp
Cuando quiero dibujar un gráfico para una métrica particular en un dispositivo particular, debo consultar esta tabla singular que filtra los otros dispositivos y las otras métricas que se analizan para este dispositivo:
SELECT metric_value, timestamp FROM data_instances
WHERE fk_to_device=1 AND fk_to_metric=2
El número de filas en esta tabla sería:
d * m_d * f * t
donde d
es el número de dispositivos , m_d
es el número acumulativo de métricas que se registran para todos los dispositivos, f
es la frecuencia con la que se sondean los datos y t
es la cantidad total de tiempo que el sistema ha estado recopilando datos.
Para un usuario que registra 10 métricas para 3 dispositivos cada 5 minutos durante un año, tendríamos menos de 5 millones de registros.
Índices
Sin índices activados fk_to_device
y fk_to_metric
escaneando, esta tabla en continua expansión llevaría demasiado tiempo. Por lo tanto, timestamp
es obligatorio indexar los campos mencionados anteriormente y también (para crear gráficos con períodos localizados).
No relacional (NoSQL)
MongoDB tiene el concepto de una colección , a diferencia de las tablas, estas se pueden crear mediante programación sin configuración. Con estos podría particionar el almacenamiento de datos para cada dispositivo, o incluso cada métrica registrada para cada dispositivo.
No tengo experiencia con NoSQL y no sé si proporcionan alguna función de mejora del rendimiento de la consulta, como la indexación, sin embargo, el párrafo anterior propone hacer la mayor parte del trabajo de consulta relacional tradicional en la estructura mediante la cual los datos se almacenan en NoSQL.
Indeciso
¿Una solución relacional con una indexación correcta se reduciría a un rastreo dentro del año? ¿O la estructura basada en la recopilación de enfoques NoSQL (que coincide con mi modelo mental de los datos almacenados) proporciona un beneficio notable?