Cassandra ttl sur une rangée

je sais qu'il y a TTLs sur les colonnes de Cassandra. Mais est-il également possible de mettre un TTL sur une rangée? Définir un TTL sur chaque colonne ne résout pas mon problème comme on peut le voir dans la prochaine usecase:

à un moment donné un processus veut supprimer une rangée complète avec un TTL (disons la rangée "A" avec TTL 1 semaine). Il pourrait le faire en remplaçant toutes les colonnes avec le même contenu mais avec un TTL de 1 semaine.

Mais il peut y avoir un autre processus en cours concurremment sur cette ligne "A" qui insère de nouvelles colonnes ou remplace des colonnes existantes sans TTL parce que ce processus ne peut pas savoir que la ligne doit être supprimée (il court concurremment!). Ainsi, après une semaine, toutes les colonnes de la rangée "A" seront supprimées à cause de la TTL, à l'exception de celles nouvellement insérées. Et je tiens aussi à être supprimé.

alors y a-t-il ou y aura-t-il un support de Cassandra pour ce cas d'utilisation ou dois-je implémenter quelque chose par moi-même?

Genre Ce qui concerne

Stefan

11
demandé sur snd 2013-05-14 17:07:22

3 réponses

il n'y a aucun moyen de mettre un TTL sur une rangée de Cassandra actuellement. Les ttl sont conçus pour supprimer des colonnes individuelles lorsque leur durée de vie est connue lorsqu'elles sont écrites.

vous pouvez obtenir ce que vous voulez en retardant votre processus - au lieu de vouloir insérer un TTL d'une semaine, lancez-le une semaine plus tard et supprimez la rangée. Les suppressions de ligne ont la sémantique suivante: n'importe quelle colonne insérée juste avant sera supprimée mais les colonnes insérées juste après ne seront pas.

si les colonnes qui sont insérées dans le futur ont encore besoin d'être effacées vous pouvez insérer une suppression de ligne avec un timestamp dans le futur pour assurer ceci mais soyez très prudent: si vous vouliez plus tard insérer dans cette ligne vous ne pouviez pas, les colonnes disparaîtraient tout simplement quand écrit à cette ligne (jusqu'à ce que la pierre tombale est des ordures collectées).

11
répondu Richard 2013-05-15 07:42:24

Vous pouvez définir ttl pour une ligne dans Cassandra 3 en utilisant

INSERT INTO Counter(key,eventTime,value) VALUES ('1001',dateof(now()),100) USING ttl 10;
5
répondu Mahesh Reddy 2016-08-22 09:15:02

bien que je ne recommande pas un tel, il y a un Cassandra pour résoudre le problème:

SELECT TTL(value) FROM table WHERE ...;

Obtenez le courant TTL d'une valeur d'abord, puis utiliser le résultat pour définir la durée de vie dans une instruction INSERT ou UPDATE:

INSERT ... USING TTL ttl-of-value;

... Je pense que le SELECT TTL() est lent (d'après L'expérience avec TTL () et WRITETIME () dans certaines de mes commandes CQL). Non seulement cela, le TTL est correct au moment où les résultats select sont générés sur le noeud Cassandra, mais au moment où l'insertion il arrive, il sera désactivé. Cassandra aurait dû offrir un supprimer plutôt que temps de vivre...

comme L'a mentionné Richard, avoir votre propre processus pour supprimer des données après une semaine est probablement plus sûr. Vous devriez avoir une colonne pour enregistrer la date de création ou la date à laquelle les données deviennent obsolètes. Ensuite, un processus de fond peut lire cette date et si les données sont considérées comme obsolètes, supprimez la ligne entière.

d'Autres processus peuvent également utilisez cette date pour savoir si cette rangée est considérée valide ou non! (donc, même si elle n'a pas encore été effacée, vous pouvez toujours voir la ligne comme invalide si la date est passée.)

1
répondu Alexis Wilke 2016-07-05 18:56:25