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