2013-03-20 23 views
7

Potrzebuję sposobu, aby mieć pozycje zamówione przez znacznik czasu, więc rozważam użycie wspólnego klucza hasha i znacznika czasu unix jako klucza zakresu.Dlaczego używanie wspólnego klawisza skrótu z AWS DynamoDB jest złe?

Według FAQ:

When storing data, Amazon DynamoDB divides a table into multiple partitions and 
distributes the data based on the hash key element of the primary key. The provisioned 
throughput associated with a table is also divided among the partitions; each 
partition's throughput is managed independently based on the quota allotted to it. 
There is no sharing of provisioned throughput across partitions. 

Ponieważ używam wspólny klucz hash, wówczas nie będzie nierównomierny rozkład obciążenia - ponieważ cała załaduje idzie do jednej partycji.

Kiedy więc zapiszę 100 write do tej partycji, wykorzystana zostanie cała pojemność, to przypuszczam, że to dobrze, ponieważ pojemność nie jest marnowana?

+0

Dla celów tego pytania pomyśl o DynamoDB, tak jak w przypadku problemu. Zastanów się, jak działa hashmap, gdy wiele produktów ma ten sam kod/klucz. – Unsigned

Odpowiedz

7

Udostępniasz zapisywanie i odczytywanie tabeli DynamoDB, a nie partycji. Twoja pojemność jest rozkładana/współdzielona na partycjach, ale każda partycja ma również stały limit stawki ze względu na podstawowy sprzęt.

Za pomocą jednego klawisza skrótu, będziesz mieć ustalony limit liczby odczytów i zapisów, które możesz faktycznie wykonać na stole, bez względu na to, ile zapewniłeś i zapłaciłeś.

Nie można przeskalować go powyżej tego limitu, ponieważ dynamodb nie może dalej dzielić stołu, aby zrównoważyć przetwarzanie obciążenia, jeden z podstawowych sposobów, w jaki system AWS skaluje system w miarę wzrostu liczby rezerw.

Możliwe, że nie osiągniesz tego limitu na początku, ale Amazon zaleca odstąpienie od tego podejścia, ponieważ Amazon chce, abyś używał AWS w sposób, który będzie skalowany.

+1

Cześć, dziękuję za odpowiedź. 1. Czy istnieje limit na jednej partycji, np. maksymalnie 2 TB, maksymalnie 1K zapisu może być zabezpieczone? Ponieważ czasami ten limit może być w porządku dla większości użytkowników (nie wszyscy muszą być w skali Google) 2. Kolejnym pytaniem jest, jak haszuje praca na wielu partycjach, np. jeśli dostarczę 10 zapisów, a mój klucz hashujący od 1 do 10, więc będą one w 10 partycjach? – Ryan

+2

Wątpię, by Amazon udostępniał takie informacje, ponieważ mogą one zmienić sposób działania nawet dla pojedynczego stołu DynamoDB. Na przykład, może skalować się częściowo w pionie, uruchamiając różne typy instancji, a następnie dodając skalowanie poziome poprzez partycjonowanie. Skalowanie poziome może być nieograniczone przez zmniejszanie i zmniejszanie partycji. Celem jest po prostu rozłożenie klucza, tak aby mógł skalować się skutecznie do dowolnego przydzielonego limitu. –

+0

Czy ktokolwiek z was znalazł lepsze rozwiązanie niż pojedynczy klucz skrótu? Stoimy w obliczu tego samego problemu i zastanawialiśmy się, czy rozwiązałeś go w międzyczasie. – mdiener

8

Trikiem w Twoim przypadku jest mieć

  • hash_key=%Y-%m-%d (dzień timestamp)
  • range_key=iso-8601_timestamp+uuid

ten sposób dane są podzielone partycje Accross w dzień (przy założeniu dość równomierne obciążenie od jednego dnia do drugiego), ale klucz zakresu pozwala na bardzo dokładne wywołania query z warunkiem BETWEEN. Część uuid jest tutaj, aby odróżnić rekordy, które zostały wywołane w (dokładnie) w tym samym czasie.

+1

Jest to dokładnie to, czego nie mówi dokumentacja dynamodb. Kończysz tylko zapisywanie do partycji odpowiadającej bieżącemu dniu, ale twoja wymagana przepustowość zapisu będzie rozłożona na wszystkie partycje. – Collin

+0

Pewnie. to "rozwiązanie" dla czasu zapytania, ale nieoptymalne dla czasu zapisu. Czy masz coś lepszego na myśli? – oDDsKooL

+1

Dokumentacja dynamodb wyraźnie odnosi się do danych szeregów czasowych: http://docs.aws.amazon.com/amazondynamodb/latest/developerguide/GuidelinesForTables.html#GuidelinesForTables.TimeSeriesDataAccessPatterns – Collin