GridFS е проста абстракция на файлова система върху MongoDB. Ако сте запознати с Amazon S3, GridFS е много подобна абстракция. Сега, защо ориентирана към документи база данни като MongoDB предоставя абстракция на файлов слой? Оказва се, че има няколко много добри причини:
-
Съхранение на генерирано от потребителя файлово съдържание
Голям брой уеб приложения позволяват на потребителите да качват файлове. Исторически, когато се работи с релационни бази данни, тези генерирани от потребители файлове се съхраняват във файловата система отделно от базата данни. Това създава редица проблеми. Как да репликирате файловете на всички необходими сървъри? Как да изтрия всички копия, когато файлът е изтрит? Как да архивирам файловете за безопасност и възстановяване след бедствие? GridFS решава тези проблеми за потребителя, като съхранява файловете заедно с базата данни и можете да използвате архивирането на вашата база данни, за да архивирате вашите файлове. Също така, поради репликацията на MongoDB, копие на вашите файлове се съхранява във всяка реплика. Изтриването на файла е толкова лесно, колкото изтриването на обект в базата данни.
-
Достъп до части от файловото съдържание
Когато файл се качи в GridFS, файлът се разделя на части от 256k и се съхранява отделно. Така че, когато трябва да прочетете само определен диапазон от байтове от файла, в паметта се въвеждат само тези парчета, а не целият файл. Това е изключително полезно, когато работите с голямо медийно съдържание, което трябва да бъде избирателно четено или редактирано.
-
Съхранение на документи, по-големи от 16MB в MongoDB
По подразбиране размерът на документа на MongoDB е ограничен до 16MB. Така че, ако имате документи, които са по-големи от 16MB, можете да ги съхранявате с помощта на GridFS.
-
Преодоляване на ограниченията на файловата система
Ако съхранявате голям брой файлове, ще трябва да вземете предвид ограниченията на файловата система, като максимален брой файлове/директория и т.н. С GridFS не няма нужда да се притеснявате за ограниченията на файловата система. Освен това, с GridFS и MongoDB разделяне, можете да разпространявате вашите файлове между различни сървъри, без да увеличавате значително оперативната сложност.
GridFS – Зад кулисите
GridFS използва две колекции за съхраняване на данните:
> показване на колекции;fs.chunksfs.filessystem.indexes>
Колекциите fs.files съдържат метаданни за файловете, а колекциите fs.chunks съхраняват действителните 256k парчета. Ако имате разчленена колекция, парчетата се разпределят между различни сървъри и може да получите по-добра производителност от файлова система!
> db.fs.files.findOne();{"_id" :ObjectId("530cf1bf96038f5cb6df5f39"),"filename" :"./conn.log","chunkSize" :262144,"uploadDate" :ISODate(0 -25T19:40:47.321Z"),"md5" :"6515e95f8bb161f6435b130a0e587ccd","length" :1644981}>
MongoDB също така създава комбиниран индекс на file_id и номера на парчето, за да помогне за бърз достъп до парчетата:
> db.fs.chunks.getIndexes();[{"v" :1,"key" :{"_id" :1},"ns" :"files.fs.chunks","name" :"_id_"} ,{"v" :1,"key" :{"files_id" :1,"n" :1},"ns" :"files.fs.chunks","name" :"files_id_1_n_1"}]>предварително>Примери за MongoDB GridFS
MongoDB има вградена помощна програма, наречена „mongofiles“, за да помогне за упражняването на сценариите на GridFS. Моля, вижте документацията на вашия драйвер за това как да използвате GridFS с вашия драйвер.
Put#mongofiles -h -u -p --db files put /conn.logconnected to:127.0.0.1добавен файл:{ _id:ObjectId('530cf1009710ca8fd47d7d5d'), име на файл:"./conn.log", chunkSize. :262144, дата на качване:нова дата (1393357057021), md5:"6515e95f8bb161f6435b130a0e587ccd", дължина:1644981 }готово! Get#mongofiles --db.log files to connect to /n.n. ./conn.logList# mongofiles -h -u -p списък, свързан към:127.0.0.1/conn.log 1644981Delete[root@ip-10-198-25-43 tmp]# mongofiles -h -u -p --db файлове изтрийте /conn.logconnected to:127.0.0.1done!GridFS модули
Ако искате да обслужвате файловите данни, съхранявани в MongoDB директно от вашия уеб сървър или файлова система, има няколко налични модула за приставки GridFS:
- GridFS-Fuse – добавете GridFS към файловата система
- GridFS-Nginx – плъгин към сървър на GridFS файлове директно от Nginx
Ограничения на GridFS
-
Работен комплект
Сервирането на файлове заедно със съдържанието на вашата база данни може значително да разбие работен набор от паметта ви. Ако не искате да смущавате работния си комплект, може би е най-добре да обслужвате вашите файлове от друг сървър на MongoDB.
-
Ефективност
Ефективността на обслужването на файлове ще бъде по-бавна от първоначалното обслужване на файла от вашия уеб сървър и файлова система. Въпреки това, добавените ползи за управлението може да си струват забавянето.
-
Атомна актуализация
GridFS не предоставя начин за извършване на атомна актуализация на файл. Ако този сценарий е необходим, ще трябва да поддържате няколко версии на вашите файлове и да изберете правилната версия.