Estou criando um sistema que pesquisa dispositivos em busca de dados sobre diferentes métricas, como utilização da CPU, utilização do disco, temperatura etc. em (provavelmente) intervalos de 5 minutos usando SNMP. O objetivo final é fornecer visualizações para um usuário do sistema na forma de gráficos de séries temporais.
Eu observei o uso do RRDTool no passado, mas o rejeitei, pois armazenar os dados capturados indefinidamente é importante para o meu projeto, e quero acesso de nível mais alto e flexível aos dados capturados. Então, minha pergunta é realmente:
O que é melhor: um banco de dados relacional (como MySQL ou PostgreSQL) ou um banco de dados não relacional ou NoSQL (como MongoDB ou Redis) com relação ao desempenho ao consultar dados para gráficos.
Relacional
Dado um banco de dados relacional, eu usaria uma data_instances
tabela, na qual seriam armazenadas todas as instâncias de dados capturados para cada métrica medida em todos os dispositivos, com os seguintes campos:
Campos: id
fk_to_device
fk_to_metric
metric_value
timestamp
Quando quero desenhar um gráfico para uma métrica específica em um dispositivo específico, devo consultar esta tabela singular filtrando os outros dispositivos e as outras métricas analisadas para esse dispositivo:
SELECT metric_value, timestamp FROM data_instances
WHERE fk_to_device=1 AND fk_to_metric=2
O número de linhas nesta tabela seria:
d * m_d * f * t
onde d
é o número de dispositivos , m_d
é o número acumulado de métricas sendo registradas para todos os dispositivos, f
é a frequência com que os dados são pesquisados e t
é a quantidade total de tempo que o sistema coleta dados.
Para um usuário que grava 10 métricas para 3 dispositivos a cada 5 minutos durante um ano, teríamos pouco menos de 5 milhões de registros.
Índices
Sem índices ativados fk_to_device
e fk_to_metric
varredura, essa tabela em expansão contínua levaria muito tempo. Portanto, é necessário indexar os campos mencionados e também timestamp
(para criar gráficos com períodos localizados).
Não relacional (NoSQL)
O MongoDB tem o conceito de coleção , ao contrário das tabelas, elas podem ser criadas programaticamente sem configuração. Com eles, eu poderia particionar o armazenamento de dados para cada dispositivo, ou mesmo cada métrica registrada para cada dispositivo.
Não tenho experiência com o NoSQL e não sei se eles fornecem recursos de aprimoramento do desempenho da consulta, como a indexação; no entanto, o parágrafo anterior propõe a maior parte do trabalho tradicional de consulta relacional na estrutura pela qual os dados são armazenados no NoSQL.
Indeciso
Uma solução relacional com indexação correta reduziria a um rastreamento dentro de um ano? Ou a estrutura baseada em coleta das abordagens NoSQL (que corresponde ao meu modelo mental dos dados armazenados) oferece um benefício notável?