web-dev-qa-db-fra.com

Cassandra: générer un identifiant unique?

Je travaille sur une base de données distribuée. J'essaie de générer un identifiant unique qui servira de clé primaire de famille de colonnes dans cassandra .

J'ai lu quelques articles à ce sujet avec Java utilisant UUID mais il semble qu'il y ait une probabilité de collision (même si elle est très faible).

Je me demande s'il existe un moyen de générer un identifiant unique en fonction du temps, peut-être?

25
user2090879

Vous pouvez utiliser le type TimeUUID dans Cassandra, qui soutient un UUID de type 1 . Celui-ci utilise l'heure actuelle, l'adresse MAC du créateur et un numéro de séquence. Si le numéro TimeUUID est généré correctement, cela peut être fait avec zéro collision (vous pouvez utiliser la CQL now()méthode ou insérer la vôtre, la Java = Les SDK fournissent des implémentations thread-safe.) Le principal avantage de TimeUUIDs est que les ID peuvent être classés dans le temps. Voir http://wiki.Apache.org/cassandra/TimeBaseUUIDNotes pour plus d'informations.

Cependant, il est peu probable que l'ordre temporel soit utile pour les clés primaires de ligne, car l'ordre est inutile lors de l'utilisation d'un partitionneur de hachage, bien qu'il soit possible d'utiliser un clé de clustering . Et la complexité de générer un ID unique pourrait également être une source de bugs si vous lancez le vôtre. Cassandra prend également en charge les UUID de type 4 en utilisant le type UUID. Ce ne sont que des bits aléatoires. Il existe une probabilité de collision, mais la probabilité de collision (en supposant des sources de nombres aléatoires non corrélées, ce qu'elle sera si vous générez en Java) est extrêmement faible - si vous avez créé 1 milliard par seconde pendant 100 ans, la probabilité d'une collision est d'environ 50% (Voir http://en.wikipedia.org/wiki/Universally_unique_identifier#Random_UUID_probability_of_duplicates pour plus de détails.)

29
Richard

Vous devriez étudier l'utilisation de Twitter Snowflake . Extrait du fichier Lisezmoi du projet:

Alors que Twitter s'éloigne de Mysql vers Cassandra, nous avons eu besoin d'une nouvelle façon de générer des numéros d'identification. Il n'y a pas d'installation de génération d'identifiants séquentiels à Cassandra, et il ne devrait pas y en avoir.

Snowflake utilise un algorithme intuitif qui génère des longs qui sont à la fois ordonnés dans le temps et uniques. Puisque votre base de données est distribuée, ce service devrait bien répondre à vos besoins.

6
noahlz

Comme l'a dit Richard, vous pouvez utiliser TimeUUID, et générer de la valeur TimeUUID n'est pas un gros problème. Suivez simplement cassandra FAQ timeuuid .

6
abhi

Vous devez utiliser cassandra function now() pour générer le timeuuid et utiliser uuid() pour générer une chaîne de type uuid.

3
Ajai