MongoDB en tant que fichier de stockage
j'essaie de trouver la meilleure solution pour créer un stockage évolutif pour les gros fichiers. La taille du fichier peut varier de 1 à 2 mo et jusqu'à 500 ou 600 gigaoctets.
J'ai trouvé quelques informations sur Hadoop et c'est de la SF, mais il a l'air un peu compliqué, parce que je n'ai pas besoin de la Carte/réduction des emplois et de nombreuses autres fonctionnalités. Maintenant, je suis en train de penser à utiliser MongoDB et c'est GridFS comme solution de stockage de fichiers.
Et maintenant, les questions:
- Ce qui va arriver avec gridfs quand j'essaye d'écrire quelques fichiers
en même temps. Il y aura tout de verrouillage pour les opérations de lecture/écriture? (Je vais l'utiliser comme fichier de stockage) - Seront des fichiers à partir de gridfs être mis en cache dans la ram et la façon dont il aura une incidence sur le lire-écrire perfomance?
- Peut-être il y a d'autres solutions qui peuvent résoudre mon problème de manière plus efficace?
Grâce.
Vous devez vous connecter pour publier un commentaire.
Je ne peux répondre pour MongoDB ici, je ne prétends pas, je sais que beaucoup de SF et d'autres technologies.
La GridFs mise en œuvre est totalement à côté client dans le pilote lui-même. Cela signifie qu'il n'existe pas de chargement spéciales ou de compréhension du contexte de fichier servant dans MongoDB lui-même, effectivement MongoDB lui-même n'a même pas comprendre qu'ils sont des fichiers ( http://docs.mongodb.org/manual/applications/gridfs/ ).
Cela signifie que l'interrogation d'une partie de la
files
ouchunks
collection entraînera le même processus, comme il le ferait pour toute autre requête, en vertu de laquelle il charge les données dont il a besoin dans votre jeu de travail ( http://en.wikipedia.org/wiki/Working_set ) qui représente un ensemble de données (ou toutes les données chargées à l'époque) requis par MongoDB dans un laps de temps donné pour maintenir la performance optimale. Il le fait par la pagination dans la RAM (enfin, techniquement, le système d'exploitation n').Un autre point à prendre en considération, c'est que ce pilote est mis en œuvre. Cela signifie que les spécifications peuvent varier, cependant, je ne le pense pas. Tous les pilotes vous permettent d'interroger un ensemble de documents à partir de la
files
collection qui ne renferme que les fichiers de méta-données permettant de vous servir plus tard le fichier lui-même à partir de lachunks
collection avec une seule requête.Cependant ce n'est pas la chose la plus importante, vous voulez servir le fichier lui-même, y compris ses données, ce qui signifie que vous serez chargement de la
files
de la collection et de sonchunks
collection dans votre travail.Avec cela à l'esprit, nous avons déjà atteint le premier hic:
Les performances en lecture de fichiers de petite taille pourrait être génial, directement à partir de la mémoire; l'écrit serait tout aussi bon.
Pour les gros fichiers, pas le cas. La plupart des ordinateurs ne disposent pas de 600 GO de RAM et il est probable, tout à fait normal en fait, à la maison de 600 GO de la partition d'un fichier unique sur un seul
mongod
instance. Cela crée un problème depuis ce fichier, pour être servi, doit rentrer dans votre jeu de travail toutefois, il est incroyablement plus grand que votre RAM; à ce stade, vous pourriez avoir de la page raclée ( http://en.wikipedia.org/wiki/Thrashing_%28computer_science%29 ) en vertu de laquelle le serveur est juste la page défaillant 24/7 essayez de charger le fichier. L'écrit ici ne sont pas mieux ainsi.La seule façon de contourner cela est de commencer à mettre un fichier unique à travers de nombreux tessons
:\
.Remarque: plus qu'une chose à considérer est que par défaut, la taille moyenne d'un
chunks
"bloc" est de 256 KO, donc c'est beaucoup de documents pour un 600 go de fichiers. Ce paramètre est manipulable dans la plupart des pilotes.GridFS, n'étant qu'une spécification utilise les mêmes verrous qu'à toute autre collection, à la fois de lire et d'écrire des verrous sur un niveau de base de données (2.2+) ou au niveau global (pré-2.2). Les deux n'interfèrent les uns avec les autres, c'est à dire, comment pouvez-vous garantir la cohérence de la lecture d'un document écrit?
Cela étant dit, la possibilité de conflits existe en fonction de votre scénario de détails, trafic, le nombre de connexions simultanées écrit/lit et beaucoup d'autres choses que nous n'avons aucune idée à ce sujet.
Personnellement, je trouve que S3 (comme @mluggy dit) dans la réduction de la redondance format qui fonctionne le mieux stocker une simple partie de méta-données sur le fichier dans MongoDB, tout comme en utilisant GridFS mais sans les morceaux de la collection, laissez-S3 gérer la distribution, de sauvegarde et d'autres choses pour vous.
J'espère avoir été clair, j'espère que ça aide.
Edit: Contrairement à ce que j'ai accidentellement dit, MongoDB ne dispose pas d'un niveau de la collection de verrouillage, il est à un niveau de base de données de verrouillage.
Finally, MongoDB 2.6 lays the foundation for massive improvements to concurrency in MongoDB 2.8, including document-level locking.
Avez-vous pensé à sauver des méta-données sur MongoDB et l'écriture de fichiers sur Amazon S3? Les deux ont d'excellents pilotes et le dernier est très redondant, cloud/cdn-prêt de stockage de fichiers. Je donnerais un coup de feu.
Je vais commencer par répondre à la première de deux:
GridFS peut-être pas la meilleur solution pour votre problème. Des verrous en écriture peut devenir quelque chose d'une douleur lorsque vous avez affaire à ce type de situation, en particulier pour les gros fichiers. Il existe d'autres bases de données là-bas qui peut résoudre ce problème pour vous. HDFS est un bon choix, mais comme tu le dis, c'est très compliqué. Je recommande d'envisager un mécanisme de stockage comme Riak ou Amazon S3. Ils sont plus orienté en fonction de stockage pour les fichiers, et ne pas finir avec des inconvénients majeurs. S3 et Riak les deux ont une excellente admin installations, et peut gérer de gros fichiers. Mais avec Riak, le dernier que j'ai su, il y avait à faire certains de segmentation de fichier pour stocker des fichiers de plus de 100 mo. Malgré cela, il est généralement recommandé de faire un certain niveau de segmentation pour des tailles de fichier. Il y a beaucoup de mauvaises choses qui peuvent arriver lors du transfert de fichiers à DBs - à Partir du réseau des sorties de temps, à des dépassements de tampon, etc. De toute façon, votre solution va nécessiter une bonne quantité de réglage pour des tailles de fichier.