Moja usługa ma dużą liczbę bieżących zdarzeń użytkowników i chcielibyśmy robić takie rzeczy, jak „policzenie wystąpienia typu T od daty D ”.
Staramy się podjąć dwie podstawowe decyzje:
Co przechowywać? Przechowywanie każdego zdarzenia a tylko gromadzenie agregatów
- (Styl dziennika zdarzeń) rejestruj każde zdarzenie i policz je później, vs.
- (Styl szeregów czasowych) przechowuj pojedynczą zagregowaną „liczbę zdarzeń E dla daty D ” dla każdego dnia
Gdzie przechowywać dane
- W relacyjnej bazie danych (szczególnie MySQL)
- W nierelacyjnej bazie danych (NoSQL)
- W płaskich plikach dziennika (gromadzonych centralnie przez sieć za pośrednictwem
syslog-ng
)
Co to jest standardowa praktyka / gdzie mogę przeczytać więcej na temat porównywania różnych typów systemów?
Dodatkowe Szczegóły:
- Całkowity strumień zdarzeń jest duży, potencjalnie setki tysięcy wpisów dziennie
- Ale naszą obecną potrzebą jest zliczanie tylko niektórych rodzajów zdarzeń
- Nie potrzebujemy dostępu w czasie rzeczywistym do nieprzetworzonych danych lub wyników agregacji
IMHO, „rejestruj wszystkie zdarzenia w plikach, przeszukuj je później, aby filtrować i agregować strumień” to dość standardowy sposób UNIX, ale moi rodacy z Rails-y wydają się myśleć, że nic nie jest prawdziwe, chyba że jest w MySQL.
SELECT...GROUP BY
, można łatwo przechowywać wyniki SELECT
s), 2) korzystanie z Grafitu do prostej agregacji i wizualizacji na dużą skalę, oraz 3) rejestrowanie pełnych zdarzeń w celach informacyjnych i oglądanie szczegółów przepływu danych w czasie rzeczywistym. Każda z nich była naprawdę cenna na różne sposoby.