Cassandra: Générer un IDENTIFIANT unique?

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

j'ai lu quelques articles sur le fait de faire cela avec Java en utilisant UUID mais il semble qu'il y ait une probabilité de collision (même si c'est très faible).

je me demande s'il y a un moyen de générer un ID unique basé sur le temps peut-être?

22
demandé sur Beryllium 2013-04-18 17:39:12

4 réponses

vous pouvez utiliser le type TimeUUID dans Cassandra, qui soutient un Type 1 UUID . Cela utilise l'heure courante et L'adresse MAC du créateur et un numéro de séquence. Si le numéro de TimeUUID est généré correctement, cela peut être fait avec zéro collision (vous pouvez utiliser la méthode CQL now() 151980920 "ou insérer la vôtre, les SDK java fournissent quelques implémentations sans fil). Le principal avantage de TimeUUIDs est que l'IDs peut être le temps commander. Voir http://wiki.apache.org/cassandra/TimeBaseUUIDNotes pour plus d'info.

cependant, l'ordre de temps est peu susceptible d'être utile pour les clés primaires de ligne, puisque l'ordre est inutile lorsque vous utilisez un partitionneur de hachage, bien que possible en utilisant une clé de regroupement . Et aussi la complexité de générer un ID unique pourrait être une source de bugs si vous roulez votre propre. Cassandra supporte aussi Type 4 UUIDs en utilisant le type UUID . Ce ne sont que des morceaux aléatoires. Il y a une probabilité de collision, mais la probabilité de collision (en supposant des sources de nombres aléatoires non corrélés, ce qui sera le cas si vous générez en Java) est extrêmement faible - si vous créez 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.)

25
répondu Richard 2018-02-09 19:38:14

vous devriez enquêter en utilisant Twitter Snowflake . Du projet readme:

alors que nous sur Twitter nous éloignons 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 séquentielle de carte d'identité à Cassandra, et il ne devrait pas y en avoir.

Snowflake utilise un algorithme intuitif qui génère des longueurs à la fois ordonnées et uniques. Depuis votre base de données est distribué,ce service devrait répondre à vos besoins.

5
répondu noahlz 2013-04-18 15:18:33

comme L'a dit Richard, Vous pouvez utiliser Timeuid, et générer de la valeur Timeuid n'est pas une grosse affaire. Il suffit de suivre cassandra FAQ timeuid .

5
répondu abhi 2013-04-18 17:06:26

vous devez utiliser la fonction cassandra now() pour générer le timeuuid et utiliser la fonction uuid() pour générer la chaîne de type uuid.

3
répondu Ajai 2014-11-27 10:37:19