2010-11-01 4 views
1

J'utilise mongo-db pour l'analyse en temps réel, je reçois 5 millions de points de données par jour qui augmenteront à l'avenir à 10 millions à moins.mongodb comme round-robin-base de données

ma question est:

collections sont plafonnés circulaire pour que mes données seront écrasées après il atteint le plafond et je ne veux pas perdre ces données.

Alors, quelle approche dois-je suivre pour conserver les anciennes données et éviter que ces données ne soient écrasées, tout en étant capables d'utiliser les données bloquées car elles sont rapides?

je pensais dans un algorithme comme:

  • renomme collection actuelle à l'ancienne et baisse actuelle.
  • append à une collection ancienne de recherche convivial (non plafonné)
+0

Est-ce que celui-ci a répondu? Y a-t-il plus de données requises? –

+0

les nouvelles collections de TTL à expiration automatique pourraient-elles aider ce cas d'utilisation? http://docs.mongodb.org/manual/tutorial/expire-data/ http://blog.mongodb.org/post/25933713094 – RubyTuesdayDONO

Répondre

5

Je pense que vous allez peut-être sur ce dans le mauvais sens. Au lieu d'essayer de "pirater" la collection plafonnée, pourquoi ne pas simplement créer une nouvelle collection pour chaque période? Par conséquent, si vous pouvez gérer 5 à 10 millions de points de données par jour, créez simplement une collection avec le jour comme partie du nom. Vous obtiendrez quelque chose comme db.data20101001 pour le 1er novembre, puis db.data20101002 pour le 2 novembre. Lorsque vous arrêtez d'écrire des données anciennes, celles-ci «tombent» en mémoire et cessent d'utiliser la mémoire vive (RAM). Dans la même mesure, l'index pour le jour en cours (et peut-être la veille) sera probablement toujours en RAM, les insertions continueront donc à être rapides tout en conservant l'historique.

étape supplémentaire requise par cette solution:

  • Vous devez écrire une logique dans votre code à insérer dans le bon jour (notez que les nouvelles collections créent eux-mêmes, c'est donc assez simple)
  • Vous aurez besoin de configurer une routine pour la suppression des anciennes données, généralement quelque chose qui remonte à N jours et cela: db.data20100901.drop(). Vous ne récupérerez pas d'espace, mais Mongo commencera à utiliser des fichiers de données "plus anciens".

Ainsi, vous gérez efficacement la taille de votre collection en choisissant le nombre de jours actifs.

+0

Salut, je ne veux pas pirater la collection plafonnée. Je veux juste avoir une collection à utiliser comme RRD pour mon "network sensor" et une autre collection qui sera utilisée pour faire des recherches, pour générer des statistiques et ainsi de suite. J'ai mis à jour mon algorithme. Cela a-t-il un sens ou avez-vous toujours la même idée à ce sujet? :-) –

+0

OK, donc l'un des problèmes avec la collection plafonnée est que vous n'avez aucun moyen de savoir ce qui va "tomber". L'exigence de "ne pas perdre de données" n'a donc aucun sens. Vous ne pouvez pas utiliser une collection couverte * et * ne pas perdre de données. Vous dites que "les collections plafonnées sont rapides", mais elles ne sont pas plus rapides que les collections régulières de la même taille. Donc vous avez deux options ici: 1. la façon dont je l'ai fait ci-dessus. 2. Ecrire des données à deux collections: plafonné et archivé. Renommer et supprimer ne fonctionnera pas, vous détruirez vos données. –

+0

Je testais, j'utilise C et mongo et je viens de terminer vendredi. Capped est plus rapide que la collection normale. J'ai ajouté mon code de test ici https://github.com/vpereira/pcapreader si vous créez la collection en tant que plafonné puis normal vous verrez. plafonné 20% plus vite. –