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_instancestabeli, 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 djest liczbą urządzeń , m_doznacza łączną liczbę metryk rejestrowanych dla wszystkich urządzeń, fjest to częstotliwość, z jaką dane są odpytywane i tjest 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_devicei fk_to_metricskanowania 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ść?