GridFS är en enkel abstraktion av filsystem ovanpå MongoDB. Om du är bekant med Amazon S3 är GridFS en mycket liknande abstraktion. Nu, varför tillhandahåller en dokumentorienterad databas som MongoDB en fillagerabstraktion? Det visar sig att det finns några mycket goda skäl:
-
Lagra användargenererat filinnehåll
Ett stort antal webbapplikationer tillåter användare att ladda upp filer. Historiskt sett, när man arbetar med relationsdatabaser, lagras dessa användargenererade filer i filsystemet separat från databasen. Detta skapar ett antal problem. Hur replikerar man filerna till alla nödvändiga servrar? Hur tar man bort alla kopior när filen är raderad? Hur säkerhetskopierar man filerna för säkerhet och katastrofåterställning? GridFS löser dessa problem för användaren genom att lagra filerna tillsammans med databasen, och du kan använda din databassäkerhetskopiering för att säkerhetskopiera dina filer. På grund av MongoDB-replikering lagras också en kopia av dina filer i varje replik. Att ta bort filen är lika enkelt som att ta bort ett objekt i databasen.
-
Åtkomst till delar av filinnehållet
När en fil laddas upp till GridFS delas filen upp i bitar på 256k och lagras separat. Så när du bara behöver läsa ett visst intervall av byte av filen, tas bara de bitarna in i minnet och inte hela filen. Detta är extremt användbart när det handlar om stort medieinnehåll som måste läsas eller redigeras selektivt.
-
Lagra dokument som är större än 16 MB i MongoDB
Som standard är MongoDB-dokumentstorleken begränsad till 16 MB. Så om du har dokument som är större än 16 MB kan du lagra dem med GridFS.
-
Övervinna filsystembegränsningar
Om du lagrar ett stort antal filer måste du överväga filsystembegränsningar som maximalt antal filer/kataloger etc. Med GridFS behöver du du behöver inte oroa dig för filsystemets begränsningar. Med GridFS och MongoDB-sharding kan du också distribuera dina filer över olika servrar utan att nämnvärt öka den operativa komplexiteten.
GridFS – Bakom kulisserna
GridFS använder två samlingar för att lagra data:
> show collections; fs.chunks fs.files system.indexes >
Fs.files-samlingarna innehåller metadata om filerna, och fs.chunks-samlingarna lagrar de faktiska 256k-bitarna. Om du har en fragmenterad samling distribueras bitarna över olika servrar och du kan få bättre prestanda än ett filsystem!
> db.fs.files.findOne(); { "_id" : ObjectId("530cf1bf96038f5cb6df5f39"), "filename" : "./conn.log", "chunkSize" : 262144, "uploadDate" : ISODate("2014-02-25T19:40:47.321Z"), "md5" : "6515e95f8bb161f6435b130a0e587ccd", "length" : 1644981 } >
MongoDB skapar också ett sammansatt index på files_id och chunknumret för att snabbt komma åt chunkarna:
> 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-exempel
MongoDB har ett inbyggt verktyg som heter "mongofiler" för att hjälpa till att träna GridFS-scenarierna. Se din drivrutinsdokumentation om hur du använder GridFS med din drivrutin.
Put #mongofiles -h -u -p --db files put /conn.log connected to: 127.0.0.1 added file: { _id: ObjectId('530cf1009710ca8fd47d7d5d'), filename: "./conn.log", chunkSize: 262144, uploadDate: new Date(1393357057021), md5: "6515e95f8bb161f6435b130a0e587ccd", length: 1644981 } done! Get #mongofiles -h -u -p --db files get /conn.log connected to: 127.0.0.1 done write to: ./conn.log List # mongofiles -h -u -p list connected to: 127.0.0.1 /conn.log 1644981 Delete [root@ip-10-198-25-43 tmp]# mongofiles -h -u -p --db files delete /conn.log connected to: 127.0.0.1 done!
GridFS-moduler
Om du vill visa fildata som lagras i MongoDB direkt från din webbserver eller filsystem, finns det flera GridFS-pluginmoduler tillgängliga:
- GridFS-Fuse – Plugga in GridFS i filsystemet
- GridFS-Nginx - Plugin till server GridFS-filer direkt från Nginx
GridFS-begränsningar
-
Arbetsuppsättning
Att visa filer tillsammans med ditt databasinnehåll kan avsevärt försämra ditt minnesarbetsset. Om du inte vill störa din arbetsuppsättning kan det vara bäst att servera dina filer från en annan MongoDB-server.
-
Prestanda
Filvisningsprestandan kommer att vara långsammare än att den inbyggda visningen av filen från din webbserver och ditt filsystem. Däremot kan de extra administrationsfördelarna vara värda nedgången.
-
Atomic-uppdatering
GridFS tillhandahåller inte ett sätt att göra en atomär uppdatering av en fil. Om det här scenariot är nödvändigt måste du underhålla flera versioner av dina filer och välja rätt version.