2011-09-12 4 views
5

Je souhaite stocker des compteurs dans un document CouchDB, incrémenté sur chaque page. CouchDB créera une révision complète de ce document pour seulement 1 mise à jour du compteur.Comment empêcher CouchDB de créer des révisions de document lors de la mise à jour de compteurs simples

Est-ce que cela ne consommerait pas trop d'espace? Étant donné que j'ai 1 million de résultats par jour, il se peut que je consulte des révisions 1M du document en une journée.

Toute réflexion sur ce ...

Merci!

Répondre

7

CouchDB est très explicite sur les compromis qu'il fait. Dans ce cas particulier, nous parlons d'avoir une base de données de crash-preuve qui, malheureusement, peut et va utiliser beaucoup de disque jusqu'à compactage.

Vous obtenez avec cette fiabilité et beaucoup de concurrence pour les lectures. Vous aurez également la possibilité de répliquer de manière transparente avec tous les autres nœuds. C'est le lard de celui-ci. Avoir à compacter à cause des compteurs heurtés, c'est le sucer. Oubliez les environs avec _rev_limit. Vous allez vous visser de le faire parce que les révisions sont si fondamentales pour Couch.

Une possibilité que vous avez est la journalisation de certaines informations, la date et l'heure, IP et d'autres choses. Vous pouvez ensuite créer une vue en émettant les données dont vous avez besoin et en utilisant _count comme fonction de réduction. Vous obtiendrez les informations dont vous avez besoin et d'autres informations potentiellement utiles pour l'analyse. C'est la solution "juste créer une vue".

La deuxième possibilité serait d'utiliser redis (http://redis.io/commands/incr). Redis est assez sympa et conviendrait parfaitement à ce cas d'utilisation (http://ai.mee.nu/is_couchdb_the_anti-redis). Ce serait la solution «le bon outil pour le bon travail».

La troisième possibilité serait simplement de l'ignorer. Cela pourrait ne pas être un problème du tout (si vous compactez souvent). Ce serait la solution "juste relax".

Vous devez prendre le bien avec le mauvais et assurez-vous que les avantages l'emportent sur les inconvénients. Mesurez tout deux fois avant de couper/optimiser.

3

Je ne pense pas que ce soit possible.

Une solution alternative serait de placer le compteur dans un petit document, et exécuter compaction sur elle périodiquement. Ce n'est pas optimal, mais cela minimise l'espace occupé.

+0

Je suis d'accord, mais je pense qu'il devrait y avoir un meilleur moyen de contourner ce problème. J'explore la possibilité de limiter les révisions à un document donné. Va mettre à jour cette question avec mes conclusions ... –

+0

Certaines recherches révèlent ce fil - http://www.mail-archive.com/[email protected]/msg01974.html –

+0

Si une base de données est configurée avec _revs_limit = 1, le flux de résolution et de modification des conflits fonctionne-t-il toujours? Hypothétiquement, pour maintenir un compteur incrémentiel, nous pouvons avoir une telle paire clé/valeur dans le document dont la base de données est configurée avec _revs_limit = 1 Réflexions? Merci! –

1

Vous pouvez également envisager d'utiliser quelque chose comme memcached (ou Membase) pour servir de "compteur de stockage". Cela vous permettra de mettre à jour ces compteurs sans créer de révisions supplémentaires dans CouchDB. Je suppose que vous n'avez pas vraiment besoin de garder tous les états intermédiaires du compteur (puisque vous dites que vous ne voulez pas que les révisions soient conservées), les mettre dans quelque chose de mieux adapté à ce cas d'utilisation semble logique.

0

Nous avons fait une petite expérience ...

Le document avait limite par défaut 1000 tours, avait environ 100Ko de pièces jointes, 1 compteur entier, que nous avons continué incrémenter

Nous avons fini avec environ 4 Go de disque utilisé pour environ 200 000 incréments. Le compactage utilisé & s'est réduit à environ 6KB.

Maintenant, c'est un bummer!Mes inquiétudes sérieuses sont maintenant - exécutant la compaction fréquente (peut-être heure/deux fois par jour/etc) sur une instance lourde de pièce d'écriture!

Questions connexes