Comment créer incrément automatique des Id dans Cassandra
Nous savons qu'il est facile de créer incrément automatique des Id dans les bases de données SQL, est-il une bonne solution pour elle de Cassandra? L'Id doit être pour les clés ou le nom de la colonne.
- Connexes: Cassandra: Générer un ID unique
- Le moment où vous demandez-vous, "comment puis-je répliquer X fonctionnalité de XYZsql de la base de données", vous êtes presque assuré d'être à l'aide de cassandra mal. En arrière et d'examiner vos besoins.
- Sans doute veut juste des id uniques comme suggéré
Vous devez vous connecter pour publier un commentaire.
Comment sur les éléments suivants, à l'aide de Cassandra Léger transactions
1 - Créer des Id de tableau:
2 - Insérer tous les id que vous souhaitez utiliser une approche globale de la séquence avec
Par exemple:
3 - Ensuite, lors de l'insertion d'une table à l'endroit où vous souhaitez utiliser un auto-incrémenté clé, procédez de la manière suivante:
3.1 - Obtenir le next_id à partir de l'id de tableau:
Disons que le résultat est next_id = 1
3.2 - Incrément next_id, la manière suivante:
Le résultat devrait ressembler à ceci:
Si elle a été correctement mis à jour, OU
Si quelqu'un a déjà mis à jour.
Donc, si vous avez la Vraie, l'utilisation id '1' - c'est le vôtre. Sinon, incrémenter next_id (ou utilisez simplement le retour de l'next_id) et répétez le processus.
La création d'un mondial séquentielle séquence de nombre n'a pas vraiment de sens dans un système distribué. Utilisation Uuid.
(Parce que vous avez à faire tous les participants reconnaissent et acceptent l'évolution de la séquence -- en vertu d'une implémentation naïve)
Il n'y a pas de bonne solution.
ou
Dès que quelque chose va au-delà d'une seule instance à la séquence de l'id devient compliqué, au moins si vous le voulez à l'échelle. Qui comprend des bases de données relationnelles.
il y a un compteur de type de données qui peuvent être utilisés. Considérons l'exemple ci-dessous.
Créer une table pour le compteur de colonne.
Charge les données dans la colonne compteur.
Prendre un coup d'oeil à la valeur du compteur.
De sortie est:
Augmentation de la valeur du compteur.
Prendre un coup d'oeil à la valeur du compteur.
Consulter ce pour plus de détails: http://docs.datastax.com/en/cql/3.1/cql/cql_using/use_counter_t.html
Cette question est assez vieux, mais j'aimerais le compléter avec une autre solution.
Toute solution qui s'appuie sur les nœuds de synchronisation est déraisonnable. Il est assez sûr de rompre soit par blocage de générer des Identifiants ou par la création d'Id en double.
MySQL façon
Vous pouvez reproduire la façon dont c'est fait avec mysql maître-maître de réplication avec le
auto_increment_increment
etauto_increment_offset
paramètres.À le reproduire, vous avez besoin de savoir le nombre de nœuds ou au max le nombre de nœuds et que vous avez besoin pour créer un (non-cassandra) compteur (un fichier par exemple) sur chaque nœud.
Chaque fois que vous voulez générer un nouveau numéro, vous trouverez la valeur actuelle, ajoutez la valeur de l'échelon et de l'enregistrer. Si il n'existe pas encore, c'est le décalage.
Donc pour 10 nœuds, vous auriez un incrément de 10 et un décalage de 1 pour le premier noeud, 2 pour le deuxième noeud, etc. Le nœud 1 permettrait de créer l'Id 1, 11, 21. Le nœud 2, serait de créer l'Id 2, 21, 22.
Si vous voulez que vos Identifiants pour être (approximativement) a ordonné entre les nœuds, vous avez besoin pour maintenir une partagée compteur et assurez-vous que chaque ID généré est supérieur au partagée compteur. De cette façon, à moins que votre nœuds/centres de données de synchronisation pour une longue période, vous ne devriez pas remarquer une grande différence.
Préfixant
Vous pouvez faire quasiment la même chose en préfixant l'ID (si c'est une solution acceptable) avec le numéro de nœud (ou le nom). Et vous n'avez pas à connaître le nombre de nœuds.
Le nœud 1, serait de créer des 1_1, 1_2, 1_3. Le nœud 2, serait de créer des 2_1, 2_2, 2_3.
Edit: Cette solution n'est pas bonne. Voir le premier commentaire.
Ma solution:
1 - Créer des Id de tableau:
2 - Lors de l'insertion d'une table à l'endroit où vous souhaitez utiliser un auto-incrémenté clé, procédez de la manière suivante:
2.1 - Incrémentation du compteur (il sera créé si il n'existe pas encore), en utilisant le plus haut niveau de consistance
2.2 - Obtenir la nouvelle valeur de l'id:
2.3 - l'Insertion de la valeur avec l'auto-incrémenté id
Mots commençant par '$' dans ma réponse est évidente (je l'espère) des espaces réservés...
Bien sûr, ce n'est pas une méthode recommandée. Ne l'utilisez que si vous avez à.
Je pense à mon humble avis attend à Cassandra pour fournir un champ d'incrémentation automatique est MAL
Cassandra est un élégant décentralisée de base de données, d'où l'attend fournir une auto-incrmenting domaine est, de la taxation et de défaites le but, à l'origine, car cette valeur doit ensuite être conservé dans un endroit central de
Donc, ne faites pas de solution à la DB de base pour obtenir un numéro d'incrémentation automatique
Au lieu de générer le code dans le code ou le service dans votre application, qui peut garder la génération aléatoire d'Identifiants uniques et l'utiliser pour appliquer sur votre modèle de données, de cette façon l'objectif & de profiter de Cassandra ne sera pas vaincu
- Ils vraiment doivent être séquentielle, ou avez-vous juste besoin de compter le nombre de qui sont beaucoup plus petit qu'un UUID qui sont facilement saisies par une personne?
Si vous avez vraiment besoin d'un numéro séquentiel, alors vous devrez effectuer l'une des opérations suivantes.
Avoir une table de cassandra, où le/la touche id est un champ pour le générateur, et la valeur est un nombre... ne conditionnelle mises à jour dans une boucle jusqu'à ce que vous avez réussi à incrémenter le compteur. (mauvaise idée)
Ont un générateur de service qui vous donnera le numéro suivant. Cela ne peut s'exécuter sur un système unique et être un point de défaillance unique, mais en fonction de vos besoins, ce pourrait être la meilleure.
Sinon... Semblable à la première, mais d'obtenir des lots de 100 ou les numéros à la fois, et de traiter les personnes à l'intérieur de votre processus/thread... Cela aura moins de demande, mais pas de garantie de l'ordre, seulement l'unicité... Si vous ne voulez plus courte numéros qui sont uniques pour l'affichage, il peut être votre meilleur pari.