Я создаю систему, которая опрашивает устройства на предмет данных по различным показателям, таким как загрузка ЦП, использование диска, температура и т. Д. С (вероятно) 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
(для создания графиков с локализованными периодами) является обязательным требованием.
Non-Relational (NoSQL)
MongoDB имеет концепцию коллекции, в отличие от таблиц, они могут быть созданы программно без установки.С их помощью я могу разделить хранилище данных для каждого устройства или даже каждую метрику, записанную для каждого устройства.
У меня нет опыта работы с NoSQL, и я не знаю, предоставляют ли они какие-либо функции, повышающие производительность запросов, такие как индексирование,однако в предыдущем абзаце предлагается выполнять большую часть традиционной работы с реляционными запросами в структуре, в которой данные хранятся в NoSQL.
Undecided
Будет ли реляционное решение с правильной индексацией уменьшено до сканирования в пределахгод?Или же основанная на сборе структура подходов NoSQL (которая соответствует моей ментальной модели хранимых данных) дает заметное преимущество?