¿Almacenar datos de series temporales, relacionales o no?


Estoy creando un sistema que sondea los dispositivos para obtener datos sobre diferentes métricas, como la utilización de la CPU, la utilización del disco, la temperatura, etc. a intervalos (probablemente) de 5 minutos usando SNMP. El objetivo final es proporcionar visualizaciones al usuario del sistema en forma de gráficos de series temporales.

He visto el uso de RRDtool en el pasado, pero lo rechacé ya que almacenar los datos capturados indefinidamente es importante para mi proyecto, y quiero un acceso de mayor nivel y más flexible al datos capturados. Así que 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 graficar.

Relacional

Dada una base de datos relacional, usaría una tabla data_instances, en la que se almacenaría cada instancia de datos capturados para cada métrica que se mide para todos los dispositivos, con lo siguiente campos:

Campos: id fk_to_device fk_to_metric metric_value timestamp

Cuando quiero dibujar un gráfico para una métrica en particular en un dispositivo en particular, debo consultar esta tabla singular filtrando 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 acumulativo número de métricas siendo grabada para todos dispositivos, fes la frecuencia a la que se encuestan los datos y tes 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 un poco menos de 5 millones de registros.

Índices

Sin índices en fk_to_device y fk_to_metric escanear esta tabla en continua expansión tomaría demasiado tiempo. Así que la indexación de los campos antes mencionados y también timestamp (para crear gráficos con períodos localizados) es un requisito.

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 grabada para cada dispositivo.

No tengo experiencia con NoSQL y no sé si proporcionan alguna función de mejora del rendimiento de las consultas, como la indexación, el párrafo anterior propone hacer la mayor parte del trabajo de consulta relacional tradicional en la estructura por la cual los datos se almacenan bajo NoSQL.

Indecisos

¿Una solución relacional con 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?


Warning: Undefined property: agent_blog_content::$date_asked in /var/www/agent_etc/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 32

Warning: Undefined property: agent_blog_content::$count_answers in /var/www/agent_etc/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 52