Tworzę system, który sonduje urządzenia w poszukiwaniu danych o różnych parametrach, takich jak wykorzystanie procesora, wykorzystanie dysku, temperatura itp. W (prawdopodobnie) 5-minutowych odstępach przy użyciu SNMP. Ostatecznym celem jest zapewnienie wizualizacji użytkownikowi systemu w postaci wykresów szeregów czasowych.
W przeszłości patrzyłem na używanie RRDTool, ale odrzuciłem go, ponieważ przechowywanie przechwyconych danych w nieskończoność jest ważne dla mojego projektu i chcę wyższego poziomu i bardziej elastycznego dostępu do przechwyconych danych. Tak więc moje pytanie brzmi:
Co więcej, relacyjna baza danych (taka jak MySQL lub PostgreSQL) lub nierelacyjna lub NoSQL (taka jak MongoDB lub Redis) w odniesieniu do wydajności podczas wysyłania zapytań o dane do wykresów.
Relacyjny
Biorąc pod uwagę relacyjną bazę danych, użyłbym data_instances
tabeli, w której zapisano by każde wystąpienie danych przechwyconych dla każdej metryki mierzonej dla wszystkich urządzeń, z następującymi polami:
Pola: id
fk_to_device
fk_to_metric
metric_value
timestamp
Kiedy chcę narysować wykres dla konkretnej metryki na określonym urządzeniu, muszę wykonać zapytanie do tej pojedynczej tabeli, odfiltrowując inne urządzenia i inne metryki analizowane dla tego urządzenia:
SELECT metric_value, timestamp FROM data_instances
WHERE fk_to_device=1 AND fk_to_metric=2
Liczba wierszy w tej tabeli wynosiłaby:
d * m_d * f * t
gdzie d
jest liczbą urządzeń , m_d
oznacza łączną liczbę metryk rejestrowanych dla wszystkich urządzeń, f
jest to częstotliwość, z jaką dane są odpytywane i t
jest to całkowity czas, przez który system zbiera dane.
Dla użytkownika rejestrującego 10 wskaźników dla 3 urządzeń co 5 minut przez rok, mielibyśmy nieco mniej niż 5 milionów rekordów.
Indeksy
Bez indeksowania fk_to_device
i fk_to_metric
skanowania ta ciągle rozwijana tabela zajęłaby zbyt wiele czasu. Zatem indeksowanie wyżej wymienionych pól, a także timestamp
(do tworzenia wykresów ze zlokalizowanymi okresami) jest wymagane.
Nierelacyjny (NoSQL)
MongoDB ma koncepcję kolekcji , w przeciwieństwie do tabel, które można tworzyć programowo bez instalacji. Dzięki nim mogłem podzielić pamięć na dane dla każdego urządzenia, a nawet każdą metrykę zarejestrowaną dla każdego urządzenia.
Nie mam doświadczenia z NoSQL i nie wiem, czy zapewniają one funkcje zwiększające wydajność zapytań, takie jak indeksowanie, jednak w poprzednim akapicie zaproponowano wykonanie większości tradycyjnych relacyjnych zapytań w strukturze, w której dane są przechowywane w NoSQL.
Niezdecydowany
Czy rozwiązanie relacyjne z poprawnym indeksowaniem zredukuje się do indeksowania w ciągu roku? Czy też oparta na zbiorze struktura metod NoSQL (która pasuje do mojego modelu mentalnego przechowywanych danych) zapewnia zauważalną korzyść?