2013-04-18 22 views
20

Sto lavorando su un database distribuito. Sto cercando di generare un ID univoco che fungerà da chiave primaria della famiglia in .Cassandra: genera un ID univoco?

Ho letto alcuni articoli su come farlo con Java usando UUID ma sembra che ci sia una probabilità di collisione (anche se è molto bassa).

Mi chiedo se c'è un modo per generare un ID univoco basato sul tempo forse?

risposta

23

È possibile utilizzare il tipo TimeUUID in Cassandra, che supporta un UUID Tipo 1. Questo utilizza l'ora corrente e l'indirizzo MAC del creatore e un numero di sequenza. Se il numero TimeUUID è generato correttamente, questo può essere fatto senza collisioni (è possibile utilizzare il CQL now()method o inserire il proprio, l'SDK java fornisce alcune implementazioni thread-safe). Il vantaggio principale di TimeUUIDs è che gli ID possono essere ordinati in base all'ora. Vedi http://wiki.apache.org/cassandra/TimeBaseUUIDNotes per maggiori informazioni.

Tuttavia, è improbabile che l'ordine temporale sia utile per le chiavi primarie di riga, poiché l'ordine è inutile quando si utilizza un partizionatore hash, sebbene sia possibile utilizzare un clustering key. Inoltre, la complessità della generazione di un ID univoco potrebbe essere una fonte di bug se si esegue il rollover. Cassandra supporta anche UUID di tipo 4 utilizzando il tipo UUID. Questi sono solo bit casuali. Esiste una probabilità di collisione, ma la probabilità di collisione (supponendo che le fonti di numeri casuali non correlate, che sarà se generate in Java) è estremamente bassa - se si crea 1 miliardo al secondo per 100 anni la probabilità di una collisione è di circa il 50% . (Per ulteriori dettagli, vedere http://en.wikipedia.org/wiki/Universally_unique_identifier#Random_UUID_probability_of_duplicates.)

+0

Grazie per la risposta. Se ad esempio utilizzo un UUID di tipo 1: Timeline CREATE TABLE (riduci, PRIMARY KEY (rid)) Come posso generare il rid e inserirlo nel CF? (Ho letto di un metodo chiamato ora() in Cassandra, ma non so come usarlo) – user2090879

+2

Si dovrebbe usare il tipo timeuuid se si sta usando UUID di tipo 1. Questo dovrebbe funzionare: Timeline CREATE TABLE (riduisci timeuuid, PRIMARY KEY (rid)); inserire in valori di timeline (rid) (now()); – Richard

+0

Ho ricevuto questo errore: manca EOF a ')'. è come se non riconoscesse il metodo ora(). ps: Sto usando Cassandra 1.2.0 – user2090879

2

Si consiglia di effettuare una ricerca utilizzando Twitter Snowflake. Dal progetto readme:

As we at Twitter move away from Mysql towards Cassandra, we've needed a new way to generate id numbers. There is no sequential id generation facility in Cassandra, nor should there be.

Snowflake utilizza un algoritmo intuitivo che genera anela che sono sia a tempo ordinato e unico. Poiché il tuo database è distribuito, questo servizio dovrebbe soddisfare le tue esigenze.

+0

grazie mille! – user2090879

5

Come detto da Richard, è possibile utilizzare TimeUUID e generare un valore TimeUUID non è un grosso problema. Basta seguire le domande frequenti su cassandra timeuuid.

+0

grazie per l'aiuto :) – user2090879

2

È necessario utilizzare la funzione cassandra now() per generare timeuuid e utilizzare la funzione uuid() per generare la stringa del tipo uuid.