Я создаю систему, которая опрашивает устройства на предмет данных по различным показателям, таким как загрузка ЦП, использование диска, температура и т. Д. С (вероятно) 5-минутными интервалами, используя SNMP. Конечная цель - предоставить пользователю системы визуализации в виде графиков временных рядов.
В прошлом я рассматривал использование RRDTool, но отклонил его, поскольку хранение захваченных данных на неопределенный срок важно для моего проекта, и я хочу более высокий уровень и более гибкий доступ к захваченным данным. Итак, мой вопрос действительно:
Что лучше, реляционная база данных (такая как MySQL или PostgreSQL) или нереляционная база данных или база данных NoSQL (такая как MongoDB или Redis) с точки зрения производительности при запросе данных для построения графиков.
реляционный
Учитывая реляционную базу данных, я бы использовал data_instances
таблицу, в которой будут храниться каждый экземпляр данных, собранных для каждой измеряемой метрики для всех устройств, со следующими полями:
Поля: id
fk_to_device
fk_to_metric
metric_value
timestamp
Когда я хочу нарисовать график для определенной метрики на определенном устройстве, я должен запросить эту единственную таблицу, отфильтровывая другие устройства и другие метрики, анализируемые для этого устройства:
SELECT metric_value, timestamp FROM data_instances
WHERE fk_to_device=1 AND fk_to_metric=2
Количество строк в этой таблице будет:
d * m_d * f * t
где d
- количество устройств , m_d
накопленное количество метрик , записываемых для всех устройств, f
- частота, с которой опрашиваются данные, и t
общее количество времени, в течение которого система собирала данные.
Для пользователя, записывающего 10 показателей для 3 устройств каждые 5 минут в течение года, у нас будет чуть менее 5 миллионов записей.
Индексы
Без включения индексов fk_to_device
и fk_to_metric
сканирования этой постоянно расширяющейся таблицы потребуется слишком много времени. Поэтому индексация вышеупомянутых полей, а также timestamp
(для создания графиков с локализованными периодами) является обязательным требованием.
Нереляционный (NoSQL)
MongoDB имеет концепцию коллекции , в отличие от таблиц, они могут быть созданы программно без установки. С их помощью я могу разделить хранилище данных для каждого устройства или даже каждую метрику, записанную для каждого устройства.
У меня нет опыта работы с NoSQL, и я не знаю, предоставляют ли они какие-либо функции, повышающие производительность запросов, такие как индексирование, однако в предыдущем параграфе предлагается выполнять большую часть традиционных реляционных запросов в структуре, с помощью которой данные хранятся в NoSQL.
нерешительный
Будет ли реляционное решение с правильной индексацией уменьшено в течение года? Или же основанная на сборе структура подходов NoSQL (которая соответствует моей ментальной модели хранимых данных) дает заметное преимущество?