2013-05-14 8 views
11

So che ci sono TTL sulle colonne in Cassandra. Ma è anche possibile impostare un TTL su una riga? L'impostazione di un TTL su ogni colonna non risolve il mio problema come può essere visto nel seguente caso:Cassandra ttl su una riga

A un certo punto un processo vuole cancellare una riga completa con un TTL (diciamo la riga "A" con TTL 1 settimana). Potrebbe farlo sostituendo tutte le colonne esistenti con lo stesso contenuto ma con un TTL di 1 settimana.

Ma ci può essere un altro processo in esecuzione contemporaneamente su quella riga "A" che inserisce nuove colonne o sostituisce quelle esistenti senza un TTL perché questo processo non può sapere che la riga è da cancellare (che fa girare contemporaneamente!). Quindi dopo 1 settimana tutte le colonne della riga "A" saranno cancellate a causa del TTL ad eccezione di quelle appena inserite. E voglio anche che vengano cancellati.

Quindi c'è o ci sarà il supporto di Cassandra per questo caso d'uso o devo implementare qualcosa da solo?

Cordiali saluti
Stefan

+0

Come accennato in una risposta a Richard, non abbiamo davvero bisogno di un TTL su tutti i dati di una riga. Come si può vedere nella discussione per noi è sufficiente cancellare tutti i dati fino ad un determinato timestamp in futuro (cioè 1 settimana) e avere un ttl su una colonna. – std

risposta

10

Non c'è modo di impostare un TTL su una riga in Cassandra attualmente. I TTL sono progettati per l'eliminazione di singole colonne quando la loro durata è nota al momento della loro scrittura.

È possibile ottenere ciò che si desidera ritardando il processo. Invece di voler inserire un TTL di 1 settimana, eseguirlo una settimana dopo ed eliminare la riga. Le eliminazioni di riga hanno la seguente semantica: qualsiasi colonna inserita prima verrà cancellata ma le colonne inserite subito dopo non saranno.

Se le colonne che vengono inserite in futuro devono ancora essere eliminate, in futuro potresti inserire una cancellazione di riga con un timestamp per assicurarti di ciò, ma stai molto attento: se in seguito vuoi inserire in quella riga non potresti , le colonne scomparirebbero appena scritte su quella riga (fino a quando la lapide non sarà raccolta).

+0

L'idea di cancellare con un timestamp in futuro è interessante. Ma purtroppo non conosco il nome di tutte le colonne che potrebbero essere inserite. – std

+0

Non è necessario conoscere i nomi delle colonne quando si utilizzano le eliminazioni di riga. – Richard

+0

Aaah, ok :) L'ho appena controllato. Non sapevo che avrebbe funzionato. Penso che lo useremo in questo modo: Elimineremo la riga con un timestamp in futuro (1 settimana) e inseriremo un indicatore DELETED con lo stesso timestamp e un TTL che scade subito dopo. Quindi l'eliminazione in futuro elimina anche gli aggiornamenti dai processi simultanei e il contrassegno DELETED impedisce ad altri di inserirsi in una riga cancellata. E dopo che il marcatore DELETED è scaduto, la riga può essere riutilizzata. Bello. Grazie per questo suggerimento. – std

1

Anche se io non consiglio tale, c'è un modo Cassandra per risolvere il problema:

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

Prendi il TTL corrente di un primo valore, quindi utilizzare il risultato per impostare il TTL in un INSERT o UPDATE:

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

Allora ... penso che il SELECT TTL() è lento (per esperienza con TTL() e WRITETIME() in alcuni dei miei comandi CQL). Non solo, il TTL è corretto nel momento in cui i risultati selezionati vengono generati sul nodo Cassandra, ma nel momento in cui l'inserimento avviene, sarà spento. Cassandra avrebbe dovuto offrire un momento eliminare piuttosto che un tempo di vivere ...

Così come detto da Richard, avere il proprio processo di cancellare i dati dopo 1 settimana è probabilmente più sicuro. Dovresti avere una colonna per salvare la data di creazione o la data in cui i dati diventano obsoleti. Quindi un processo in background può leggere quella data e se i dati vengono visualizzati come obsoleti, rilasciare l'intera riga.

Altri processi possono anche utilizzare quella data per sapere se quella riga è considerata valida o no! (quindi, anche se non fosse stato ancora cancellato, è ancora possibile visualizzare la riga come non valida se la data è passata.)

4

È possibile impostare TTL per una riga in Cassandra 3 utilizzando

INSERT INTO Counter(key,eventTime,value) VALUES ('1001',dateof(now()),100) USING ttl 10; 
+1

non serve il caso d'uso del questionario. Se si aggiorna una colonna, verrà modificato ttl (sarà null se non si specifica alcun ttl nella query di aggiornamento). Di conseguenza, la riga esisterà con quelle colonne aggiornate dopo la scadenza ttl. –

Problemi correlati