2011-09-12 2 views
5

Desidero memorizzare i contatori in un documento CouchDB, incrementato in ogni visualizzazione di pagina. CouchDB creerà una revisione completa di questo documento per un solo aggiornamento del contatore.Come evitare che CouchDB crei revisioni di documenti durante l'aggiornamento di contatori semplici

Questo non consumerebbe troppo spazio? Considerando che ho 1 milione di visite in un giorno, potrei guardare alle revisioni 1M del documento in un giorno.

Qualsiasi opinione su questo ...

Grazie!

risposta

7

CouchDB è molto esplicito sui compromessi che effettua. In questo caso specifico, stiamo parlando di avere un database a prova di crash che, purtroppo, può e utilizzerà un sacco di disco fino alla compattazione.

Si ottiene con questa affidabilità e molta concorrenza per le letture. Avrai anche la possibilità di replicare perfettamente con qualsiasi altro nodo. Questo è il bacon di esso. Il fatto di dover compattare a causa dei contatori sbattuti ne fa schifo. Dimentica di andare in giro con _rev_limit. Ti fotterai facendolo perché le revisioni sono così fondamentali per Couch.

Una possibilità che si ha è la registrazione di alcune informazioni, la data e l'ora, IP e altre cose. Dovresti quindi creare una vista che emetta i dati necessari e utilizzare _count come funzione di riduzione. Otterrai le informazioni di cui hai bisogno e altre informazioni utili per l'analisi. Questa è la soluzione "basta creare una vista".

La seconda possibilità sarebbe l'utilizzo di redis (http://redis.io/commands/incr). Redis è abbastanza carino e si adatta bene a questo caso d'uso (http://ai.mee.nu/is_couchdb_the_anti-redis). Questa sarebbe la soluzione "lo strumento giusto per il lavoro giusto".

La terza possibilità sarebbe semplicemente ignorarlo. Potrebbe non essere affatto un problema (se compatti spesso). Questa sarebbe la soluzione "just relax".

Devi prendere il buono con il cattivo e assicurarti che i vantaggi superino gli svantaggi. Misura tutto due volte prima di tagliare/ottimizzare.

3

Non credo sia possibile.

Una soluzione alternativa sarebbe quella di posizionare il contatore in un documento di piccole dimensioni ed eseguire periodicamente compaction su di esso. Questo non è ottimale, ma riduce al minimo lo spazio occupato.

+0

Sono d'accordo, ma penso che ci dovrebbe essere un modo migliore per risolvere questo problema. Sto esplorando limitando le revisioni a un determinato documento. Aggiornerà questa domanda con i miei risultati ... –

+0

Alcune ricerche rivelano questo thread - http://www.mail-archive.com/[email protected]/msg01974.html –

+0

Se un database è configurato con _revs_limit = 1, il feed Risoluzione conflitti e modifiche funzionerà ancora? Ipoteticamente, per mantenere un contatore incrementale, possiamo avere una coppia chiave/valore nel documento il cui database è configurato con _revs_limit = 1 Pensieri? Grazie! –

1

Si potrebbe anche voler considerare l'utilizzo di qualcosa come memcached (o Membase) da utilizzare come "contatore di archiviazione". Questo ti permetterà di aggiornare questi contatori senza creare revisioni extra in CouchDB. Suppongo che tu non abbia realmente bisogno di mantenere tutti gli stati intermedi del contatore (dal momento che dici che non vuoi che le revisioni vengano mantenute in giro), quindi inserirle in qualcosa di più adatto per questo caso d'uso sembra avere un senso.

0

Stavamo facendo un piccolo esperimento ...

il documento era di default 1000 giri limite, aveva circa 100 KB di allegati, 1 contatore intero, che abbiamo tenuto incrementali

Abbiamo finito con circa 4 GB di disco utilizzato per circa 200.000 incrementi. Compattazione usata & ridotta a circa 6 KB.

Ora è un peccato!

Le mie serie preoccupazioni ora sono: eseguire una compattazione frequente (forse ogni ora/due volte al giorno/ecc.) Su un'istanza di scrittura pesante.