Я создаю систему, которая проверяет устройства на данные по различным показателям, таким как загрузка процессора, использование диска, температура и т.д. (возможно) с 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 (которая соответствует моей ментальной модели сохраненных данных)?