2011-10-10 14 views
7

Vorrei usare Cassandra per memorizzare le informazioni relative alla sessione. Non ho una vera sessione HTTP: è un protocollo diverso, ma lo stesso concetto.Cassandra come archivio di sessioni sotto carico

Memcached andrebbe bene, ma mi piacerebbe anche mantenere i dati. configurazione

Cassandra:

  • non replicato tasto spazio
  • sola famiglia Colonna, dove la chiave è l'ID di sessione e ogni colonna all'interno di negozi fila singola chiave/valore - (Map<String,Set<String,String>>)
  • colonna TTL = 10 minuti
  • CL scrittura = ONE
  • leggere CL = ONE
  • 2.000 scrive/s
  • 5.000 letture/s esempio

dati:

session1:{ // CF row key 
    {prop1:val1, TTL:10 min}, 
    {prop2:val2, TTL:10 min}, 
..... 
    {propXXX:val3, TTL:10 min} 
}, 
session2:{ // CF row key 
    {prop1:val1, TTL:10 min}, 
    {prop2:val2, TTL:10 min}, 
}, 
...... 
sessionXXXX:{ // CF row key 
    {prop1:val1, TTL:10 min}, 
    {prop2:val2, TTL:10 min}, 
} 

In questo caso la coerenza non è un problema, ma le prestazioni potrebbero essere, in particolare IO disco.

Dato che i dati nella mia sessione si interrompono per poco tempo, vorrei evitare di archiviarli sul disco rigido, ad eccezione del registro di commit.

Ho alcune domande:

  1. Se la colonna scade nel Memtable prima del lavaggio a SSTable, sarà Cassandra comunque conservare tale colonna nella SSTable (sciacquare a HDD)?
  2. La replica è disabilitata per il mio spazio chiave, in questo caso non sarebbe necessario memorizzare una colonna scaduta in SSTable, giusto?
  3. Ogni CF cappello max 10 colonne. In tal caso, abilitare la cache delle righe e disabilitare la cache delle chiavi. Ma mi aspetto che i miei dati siano ancora disponibili in Memtable, in questo caso potrei disabilitare la cache intera, giusto?
  4. Eventuali suggerimenti di configurazione Cassandra per tale caso d'uso sessione-store sarebbe molto apprezzato :)

Grazie, Maciej

+0

si dice di voler mantenere i dati, ma anche di TTL dopo 10 minuti. – sdolgy

+0

Questo è un processo importante e vorrei assicurarmi che non si rompa –

risposta

4

Ecco quello che ho fatto - e funziona bene:

  1. Set replication_factor a 1 - significa disabilitare la replica
  2. Set gc_grace to 0 - mezzi eliminare colonne in prima compattazione. Questo va bene, poiché i dati non sono replicati.
  3. Aumenta la dimensione dei memble e riduce la dimensione della cache. Vogliamo leggere i dati da memtable e omettere la cache: scaricare i dati sull'HDD e leggerli di nuovo dall'HDD nella cache.
  4. Inoltre commettere registro può essere disabilitata - durable_writes = falsi

In questa configurazione, i dati verranno letti da memtable e la cache non verranno utilizzati. Memtable può allocare abbastanza heap per mantenere i miei dati fino alla scadenza o anche più a lungo.

Dopo aver svuotato i dati su SSTable, la compattazione rimuoverà immediatamente le righe scadute, dal gc_grace=0.

+4

Non riesco a vedere il punto in questo. Se non stai replicando ottieni ciò che hai già con memcached. Se il nodo su cui risiedono i tuoi dati non funziona, i tuoi dati andranno persi. Sicuro è nel commitlog, ma ricostruire un nodo in 10 minuti? Mi sto perdendo qualcosa? –

1

Considerando il vostro caso d'uso, se non sbaglio si desidera avere tutto il valore della chiave [sessionID => sessionData] si accoppia in memoria e tali valori scadono ogni 10 minuti [Significa che non si desidera la persistenza].

Quindi perché non si può provare qualcosa di simile a redis che è un archivio in memoria.

Da Doc:

Redis è un open source, avanzata memoria dei valori-chiave. Viene spesso definito come un server di struttura dei dati poiché le chiavi possono contenere stringhe, hash, elenchi, set e serie ordinate.

Da u non ha bisogno Redis replica padroneggiare architettura schiavo anche potrebbe non influenzare

Redis supporta TTL anche

per quanto ne so Cassandra è un bene per file larghe grassi [Altre colonne meno righe] righe piuttosto magro [ trasposizione del precedente]. Il tuo caso d'uso non sembra così.

saluti, Tamil

+0

Abbiamo già memcached - questo sarebbe anche bene per tale caso d'uso. Ma diciamo che il mio processo è importante e vorrei assicurarmi che i dati non vadano persi durante quei 10 minuti - potrebbero anche essere 30 minuti. –

+0

Tutto ciò che ti interessa è l'implementazione del protocollo di commit in Cassandra. Spero che questo aiuti http://redis.io/topics/persistence, non so memcached comunque – Tamil

Problemi correlati