Nous savons qu'il est facile de créer des ID auto-incrémentés dans les bases de données SQL, existe-t-il une bonne solution pour cela dans Cassandra ? Les IDs doivent être pour la clé ou le nom de la colonne.
Réponses
Trop de publicités?La création d'une séquence séquentielle globale de numéros n'a pas vraiment de sens dans un système distribué. Utilisez UUIDs .
(Parce qu'il faudrait que tous les participants soient d'accord et acceptent l'évolution de la séquence - dans le cadre d'une mise en œuvre naïve).
Il n'y a pas de bonne solution.
- Créez une colonne avec un nombre, augmentez le nombre et sauvegardez-le sur toutes les répliques avec un identifiant temporaire, lisez toutes les répliques et vérifiez si l'identifiant temporaire est le "vôtre", sinon recommencez ce n'est pas une bonne solution et elle n'évoluera pas.
ou
- Créez votre propre service d'identification où vous récupérez votre prochaine identification. Ce service ne sera exécuté que dans une seule instance et ne sera pas un facteur d'échelle.
Dès que l'on va au-delà d'une seule instance, le séquençage des identifiants se complique, du moins si l'on veut que le système soit évolutif. Cela inclut les bases de données relationnelles.
Je pense qu'attendre de Cassandra qu'il fournisse un champ auto-incrémenté est une erreur.
Cassandra est une base de données élégamment décentralisée, donc s'attendre à ce qu'elle fournisse un champ d'auto-incrustation est difficile et va à l'encontre de l'objectif initial, car cette valeur doit être maintenue dans un endroit central.
Par conséquent, ne faites pas de solution basée sur la DB pour obtenir un nombre auto-incrémenté.
Au lieu de cela, générez l'identifiant dans le code ou le service de votre application, qui peut continuer à générer des identifiants uniques aléatoires et les utiliser pour les appliquer à votre modèle de données. De cette façon, l'objectif et les avantages de Cassandra ne seront pas compromis.
Cette question est assez ancienne mais j'aimerais la compléter par une autre solution.
Toute solution qui repose sur la synchronisation des nœuds est déraisonnable. Elle est pratiquement sûre de se briser soit en bloquant la génération d'identifiants, soit en créant des identifiants en double.
La méthode MySQL
Vous pouvez reproduire la façon dont cela est fait avec la réplication mysql master-master avec la méthode suivante auto_increment_increment
y auto_increment_offset
paramètres.
Pour le reproduire, vous devez connaître le nombre de nœuds ou le nombre maximum de nœuds attendus et vous devez créer un compteur (non Cassandra) (un fichier par exemple) sur chaque nœud.
Chaque fois que vous voulez générer un nouveau nombre, vous trouvez la valeur actuelle, vous ajoutez l'incrément et vous l'enregistrez. S'il n'existe pas encore, c'est le décalage.
Ainsi, pour 10 nœuds, vous auriez un incrément de 10 et un décalage de 1 pour le premier nœud, 2 pour le deuxième, etc. Le noeud 1 créerait les IDs 1, 11, 21. Le nœud 2 créerait les ID 2, 21, 22.
Si vous voulez que vos identifiants soient (approximativement) ordonnés entre les nœuds, vous devez maintenir un compteur partagé et vous assurer que chaque identifiant généré est supérieur au compteur partagé. De cette façon, à moins que vos nœuds/datacenters ne soient désynchronisés pendant une longue période, vous ne devriez pas remarquer une grande différence.
Préfixe
Vous pouvez faire à peu près la même chose en préfixant l'ID (si c'est une solution acceptable) avec le numéro (ou le nom) du nœud. Et vous n'avez pas besoin de connaître le nombre de nœuds. Le noeud 1 créerait 1_1, 1_2, 1_3. Le noeud 2 crée 2_1, 2_2, 2_3.
Edit : Cette solution n'est pas correcte. Voir le premier commentaire.
Ma solution :
1 - Créer la table des identifiants :
CREATE TABLE ids (
id_name varchar,
next_id counter,
PRIMARY KEY (id_name)
)
2 - Lorsque vous insérez dans une table où vous souhaitez utiliser une clé auto-incrémentée, procédez comme suit :
2.1 - Incrémenter le compteur (il sera créé s'il n'existe pas), en utilisant le niveau de cohérence le plus élevé.
UPDATE ids
SET next_id = next_id + 1
WHERE id_name = $AUTO_INCREMENTED_ID
USING CONSISTENCY ALL
2.2 - Obtenir la nouvelle valeur de l'identifiant :
SELECT next_id
FROM ids
WHERE id_name = $AUTO_INCREMENTED_ID
2.3 - Insérer la valeur avec l'id auto-incrémenté
INSERT INTO some_table ($AUTO_INCREMENTED_ID, ...)
VALUES ($RESULT_FROM_PREVIOUS_QUERY, ...)
Les mots commençant par '$' dans ma réponse sont des caractères de remplacement explicites (j'espère)...
Bien entendu, cette méthode n'est pas recommandée. Ne l'utilisez que si vous devez le faire.
- Réponses précédentes
- Plus de réponses