2013-08-13 21 views
9

Chciałbym przechowywać 1M + różne serie czasowe w bazie danych DynamoDb Amazon. Każda seria czasowa będzie miała około 50K punktów danych. Punkt danych składa się ze znacznika czasu i wartości.Przechowywanie szeregów czasowych w AWS DynamoDb

Aplikacja będzie dodawać nowe punkty danych do szeregów czasowych często (przez cały czas) i pobierze (zwykle cały szereg czasowy) serie czasowe od czasu do czasu, dla analityki.

Jak mam zbudować bazę danych? Czy powinienem utworzyć oddzielną tabelę dla każdej serii czasu? Czy powinienem umieścić wszystkie punkty danych w jednej tabeli?

+4

Czego używałeś w końcu? – Hugo

+3

jaki projekt wykorzystałeś? – Narayan

Odpowiedz

12

Zakładając, że twoje dane są niezmienne i mają rozmiar, możesz rozważyć Amazon Redshift; jest napisany dla rozwiązań do raportowania wielkości petabajtów.

W Dynamo mogę wymyślić kilka wykonalnych projektów. W pierwszym można użyć jednej tabeli, z mieszanym hash/kluczem zakresu (oba ciągi). Kluczem skrótu będzie nazwa serii czasowej, kluczem zakresu będzie znacznik czasu jako ciąg ISO8601 (który ma przyjemną właściwość, że kolejność alfabetyczna jest również porządkiem chronologicznym), a każdy element ma dodatkowy atrybut; wartość'. Daje to możliwość wyboru wszystkiego, począwszy od szeregów czasowych (Kwerenda na równości hashKey) i podzestawu szeregów czasowych (Zapytanie o równość hashKey i klauzulę rangeKey BETWEEN). Jednak głównym problemem jest problem "hotspot": wewnętrznie, Dynamo podzieli dane przez hashKey i rozproszy Twoje ProvisionedReadCapacity na wszystkie partycje. Więc możesz mieć 1000 KB odczytów na sekundę, ale jeśli masz 100 partycji, to masz tylko 10 KB na sekundę dla każdej partycji, a odczytanie wszystkich danych z pojedynczej serii czasu (pojedynczego klawisza skrótu) spowoduje tylko jedną partycję. Więc możesz myśleć, że twoje 1000 KB odczytów daje 1 MB na sekundę, ale jeśli masz 10 MB danych, może to potrwać znacznie dłużej, ponieważ twoja pojedyncza partycja będzie cię dławić znacznie mocniej.

Z drugiej strony DynamoDB ma bardzo wysoką, ale kosztowną górną granicę skalowania; jeśli chcesz, możesz zapłacić za 100 000 jednostek mocy obliczeniowej i mieć podsekwencyjne czasy odpowiedzi na wszystkie te dane.

Innym teoretycznym projektem byłoby przechowywanie każdej serii czasowej w oddzielnej tabeli, ale nie sądzę, że DynamoDB ma skalować do milionów tabel, więc to prawdopodobnie nie jest.

Możesz spróbować rozłożyć serie czasowe na 10 tabel, w których dane "bardzo dobrze odczytane" znajdują się w tabeli 1, "prawie nigdy nie czyta się danych" w tabeli 10, a wszystkie inne dane znajdują się gdzieś pomiędzy. Umożliwiłoby to "pogrupowanie" reguł dotyczących przepustowości/partycjonowania partycji, ale przy wysokim stopniu złożoności projektu. Ogólnie rzecz biorąc, prawdopodobnie nie jest tego warte; gdzie masz nową serię czasową? Jak pamiętasz, gdzie oni wszyscy są? Jak przenieść serię czasową?

Myślę, że DynamoDB obsługuje niektóre wewnętrzne "pęknięcia" na tego typu czytaniach z mojego własnego doświadczenia i możliwe jest, że moje liczby są wyłączone, a otrzymasz odpowiednią wydajność. Jednak moim werdyktem jest zaglądanie do Redshift.

+0

Potrafię obsłużyć serie czasowe 100K na jednej małej instancji EC2 w bazie danych MySQL. Który jest bardzo tani. Redshift wymaga bardzo dużych instancji EC2, które są bardzo drogie ... – jQguru

0

Co powiesz na ociekanie każdej serii czasowej do JSON lub podobnego i zapisanie w S3. Co najwyżej potrzebujesz wyszukiwania z miejsca takiego jak Dynamo.

Nadal może być potrzebne przesunięcie ku czerwieni w celu przetworzenia danych wejściowych.

Powiązane problemy