Jak mam przechowywać szeregi czasowe w mongodb


11

Muszę utworzyć bazę danych szeregów czasowych i wykonać następujące zadania:

  • utwórz nowe szeregi czasowe
  • zaktualizuj istniejące szeregi czasowe
  • sprawdzaj jeden lub kilka szeregów czasowych jednocześnie (na przykład wszystkie szeregi czasowe dla tej samej daty itp.)

Czy Mongo jest do tego przystosowane, a jeśli tak, to jak mam uporządkować bazę danych? (jednorazowa seria = jeden dokument? Lub jeden dokument = jeden wpis serii czasowej, a wszystkie te dokumenty tworzą kolekcję, która jest całym szeregiem czasowym?)

Trochę się tu zagubiłem i trudno mi znaleźć jakąkolwiek informację, ponieważ zazwyczaj Mongo jest prezentowane jako bardzo elastyczne, więc użytkownik ma wybór w infrastrukturze.

Wszelkie linki do samouczków, które konkretnie wyjaśniają, jak zarządzać szeregami czasowymi w Mongo, są bardzo mile widziane.

Dziękuję Ci!


Czytaj dziś projekt schematu dla danych szeregów czasowych w MongoDB . Bardzo dobrze napisz o tym.
akauppi

Istnieje zaktualizowana biała księga omawiająca szeregi czasowe w MongoDB. mongodb.com/collateral/time-series-best-practices
Robert Walters

Odpowiedzi:


6

Proponuję jednorazowe wprowadzenie szeregu czasowego na dokument. Istnieją pewne problemy z przechowywaniem wielu wpisów w dokumencie:

  • pojedynczy dokument jest ograniczony do określonego rozmiaru (obecnie 16 MB); ogranicza to liczbę wpisów, które można zapisać w jednym dokumencie
  • w miarę dodawania kolejnych wpisów do dokumentu, cały dokument (i szeregi czasowe) zostanie niepotrzebnie usunięty i przeniesiony do większej części pamięci
  • zapytania dotyczące dokumentów podrzędnych są ograniczone w porównaniu do zapytań dotyczących zwykłych dokumentów
  • dokumenty o bardzo płaskich strukturach (jak jeden poddokument na sekundę) nie są wydajne
  • wbudowana funkcja zmniejszania mapy nie działa tak dobrze w przypadku dokumentów podrzędnych

Należy również pamiętać, że znacznik czasu jest wbudowany w domyślny obiekt MongoDB ObjectId . Możesz tego użyć, jeśli precyzja szeregu czasowego jest mniejsza niż jedna sekunda.

Oto przykładowy dokument BSON z biblioteki rejestrowania zdarzeń korzystającej z MongoDB :

Example format of generated bson document:
{
    'thread': -1216977216,
    'level': 'ERROR',
    'timestamp': Timestamp(1290895671, 63),
    'message': 'test message',
    'fileName': '/var/projects/python/log4mongo-python/tests/test_mongo_handler.py',
    'lineNumber': 38,
    'method': 'test_emit_exception',
    'loggerName':  'testLogger',
    'exception': {
        'stackTrace': 'Traceback (most recent call last):
                       File "/var/projects/python/log4mongo-python/tests/test_mongo_handler.py", line 36, in test_emit_exception
                       raise Exception(\'exc1\')
                       Exception: exc1',
        'message': 'exc1',
        'code': 0
    }
}

Ponieważ dziennik zdarzeń jest podobny do szeregów czasowych, warto przestudiować resztę kodu . Istnieją wersje w Javie, C #, PHP i Python.

Oto inny podobny projekt typu open source: Zarkov


[aktualizacja] W odpowiedzi na komentarz @ RockScience dodałem kilka innych referencji:


to będzie DUŻO dokumentów, jeśli moje szeregi czasowe zawierają dane śróddzienne od kilku lat !!! czy nie jest problemem mieć tyle dokumentów? Pochodzę z sql tła, po prostu uważam, że nie bardzo efektywna pamięć. (Ponieważ będzie wiele powtórzeń dla wszystkich punktów danych w tej samej serii czasowej)
RockScience

@RockScience: MongoDB, podobnie jak wiele innych baz danych NoSQL, unika normalizacji i wydajności pamięci na rzecz innych rzeczy, takich jak elastyczność, szybkość i zmniejszone użycie procesora. Jeśli potrzebujesz wydajności pamięci, MongoDB może nie być dla Ciebie odpowiednim rozwiązaniem. MongoDB kopiuje pełną nazwę tekstową każdego pola do każdego dokumentu, aby głośno płakać! W każdym razie zaktualizowałem swoją odpowiedź o kilka dodatkowych zasobów, w tym studium przypadku dotyczące wykorzystania MongoDB do przechowywania bardzo dużych szeregów czasowych.
Leftium


2

Tak, zdecydowanie, baza danych NoSQL lepiej nadaje się do przechowywania danych szeregów czasowych niż tradycyjne RDBMS.

Tak MongoDB jest wyjątkowo dostosowany do tego przypadku użycia.

-Jak należy ustrukturyzować bazę danych? Jeden dokument = wprowadzenie jednego szeregu czasowego VS wiele szeregów czasowych.

Odpowiedzią jest przechowywanie w jednym dokumencie wielu szeregów czasowych. Mniejsza liczba dokumentów poprawi wydajność przy mniejszej liczbie odczytów. Jednym ze sposobów jest przygotowanie dokumentu ze wstępnie zdefiniowanymi wartościami. Pozwoli to zoptymalizować aktualizację dokumentu, unikając wypełniania rekordów .

Oto przykład schematu, w jaki sposób optymalnie przechowywać godzinowe serie czasowe w odstępach minutowych:

{
  timestamp_hour: ISODate("2015-07-02T23:00:00.000Z"),
  type: memory_used”,
  values: {
    0: 999999,
    1: 1000000, 
    …,
    58: 0,
    59: 0
  }
}

Inicjujesz go wartościami 0, a następnie aktualizacje zostaną zoptymalizowane. Odczyty są zoptymalizowane, ponieważ jeden dokument jest odczytywany zamiast 60. Jeśli chcesz przechowywać dane o wartości dziennej lub miesiąc, gdy będziesz postępować z tą samą techniką, masz pomysł.

Oto link do samouczka, który konkretnie wyjaśnia, jak zarządzać szeregami czasowymi w MongoDb z oficjalnego bloga MongoDb: http://blog.mongodb.org/post/65517193370/schema-design-for-time-series-data-in- mongodb


1
Grupowanie danych w dokumencie będzie lepsze od wydajności i wykorzystania zasobów. Istnieją trzy scenariusze schematu omówione w zaktualizowanym szeregu czasowym białej księgi najlepszych praktyk MongoDB. mongodb.com/collateral/time-series-best-practices
Robert Walters
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.