2013-03-20 6 views
7

Ho bisogno di avere un modo per avere gli articoli ordinati per data e ora, quindi sto considerando l'utilizzo di una chiave hash comune e di un timestamp unix come chiave di intervallo.Perché utilizzare una chiave hash comune con AWS DynamoDB è una cosa negativa?

Secondo la 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. 

Come sto utilizzando una chiave hash comune, allora non ci sarà la distribuzione del carico non uniforme - dal momento che tutta la volontà di carico va in una singola partizione.

Quindi, quando fornisco 100 write in questa partizione, verrà utilizzata tutta la capacità, quindi suppongo che sia una buona cosa poiché la capacità non viene sprecata?

+0

Per gli scopi di questa domanda, pensare a DynamoDB come si farebbe con una hashmap. Pensa a come viene eseguita una hashmap quando molti articoli hanno lo stesso codice hash/chiave. – Unsigned

risposta

7

È possibile eseguire il provisioning di scritture e letture su una tabella DynamoDB, non su una partizione. La tua capacità viene distribuita/condivisa tra le partizioni, ma ogni partizione ha anche un limite di velocità fisso a causa dell'hardware sottostante.

Utilizzando una sola chiave hash, si avrà un limite fisso sul numero di letture e scritture effettivamente eseguibili sulla tabella, indipendentemente dal numero di provisioning e pagamento.

Non è possibile ridimensionarlo oltre tale limite poiché dynamodb non può ulteriormente partizionare la tabella per parallelizzare l'elaborazione del carico, uno dei modi principali in cui AWS scala il sistema man mano che aumentano i numeri di provisioning.

È possibile che all'inizio non si raggiunga tale limite, ma Amazon consiglia di non seguire questo approccio perché Amazon vuole che tu usi AWS in modi che si ridimensionino.

+1

Ciao, grazie per la risposta. 1. Ci sono limiti su una singola partizione, ad es. massimo 2 TB, è possibile eseguire il provisioning di massimo 1 KB di scrittura? Perché a volte questo limite potrebbe essere ok per la maggior parte degli utenti (non tutti devono essere in scala Google) 2. Un'altra domanda è come l'hashing funziona su più partizioni, ad es. se fornisco il provisioning 10 e il mio hash key da 1 a 10, quindi saranno in 10 partizioni? – Ryan

+2

Dubito che Amazon condivida informazioni come questa in quanto possono cambiare il modo in cui funziona anche per una singola tabella DynamoDB. Ad esempio, la scala potrebbe scalare part-verticalmente lanciando diversi tipi di istanze e quindi aggiungere in scala orizzontale mediante partizionamento. Il ridimensionamento orizzontale potrebbe essere illimitato rendendo le partizioni sempre più piccole. La linea guida è semplicemente quella di diffondere il tuo spazio chiave in modo che possano adattarsi in modo efficace a qualsiasi limite previsto. –

+0

Qualcuno di voi ha trovato una soluzione migliore di una singola chiave hash? Siamo di fronte allo stesso problema e ci siamo chiesti se lo aveste risolto nel frattempo. – mdiener

8

Un trucco comune nel tuo caso è quello di avere

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

In questo modo i vostri dati sono partizioni attraversavano raggruppati per giorno (supponendo un carico abbastanza anche da un giorno all'altro), ma il tasto intervallo consente chiamate query molto belle con una condizione BETWEEN. La parte uuid è qui per differenziare i record che sarebbero stati inseriti esattamente nello stesso momento (esattamente).

+1

Questo è esattamente ciò che la documentazione di dynamodb dice di non fare. Finirai solo a scrivere sulla partizione corrispondente al giorno corrente, ma il throughput di scrittura fornito sarà distribuito su tutte le partizioni. – Collin

+0

Sicuro. è una "soluzione" per il tempo di interrogazione ma subottimale per il tempo di scrittura. Hai qualcosa di meglio in mente? – oDDsKooL

+1

La documentazione dynamodb si riferisce esplicitamente ai dati delle serie temporali: http://docs.aws.amazon.com/amazondynamodb/latest/developerguide/GuidelinesForTables.html#GuidelinesForTables.TimeSeriesDataAccessPatterns – Collin