GridFS er en simpel filsystemabstraktion oven på MongoDB. Hvis du er bekendt med Amazon S3, er GridFS en meget lignende abstraktion. Nu, hvorfor giver en dokumentorienteret database som MongoDB en fillagsabstraktion? Det viser sig, at der er nogle meget gode grunde:
-
Lagring af brugergenereret filindhold
Et stort antal webapplikationer tillader brugere at uploade filer. Historisk set, når man arbejder med relationelle databaser, bliver disse brugergenererede filer gemt på filsystemet adskilt fra databasen. Dette skaber en række problemer. Hvordan replikeres filerne til alle de nødvendige servere? Hvordan sletter man alle kopierne, når filen er slettet? Hvordan sikkerhedskopieres filerne for sikkerhed og katastrofegendannelse? GridFS løser disse problemer for brugeren ved at gemme filerne sammen med databasen, og du kan udnytte din database backup til at sikkerhedskopiere dine filer. På grund af MongoDB-replikering gemmes en kopi af dine filer i hver replika. Det er lige så nemt at slette filen som at slette et objekt i databasen.
-
Adgang til dele af filindholdet
Når en fil uploades til GridFS, opdeles filen i bidder af 256k og gemmes separat. Så når du kun skal læse et bestemt udvalg af bytes af filen, er det kun disse bidder, der bringes ind i hukommelsen og ikke hele filen. Dette er yderst nyttigt, når der er tale om stort medieindhold, der skal læses eller redigeres selektivt.
-
Lagring af dokumenter på mere end 16 MB i MongoDB
Som standard er MongoDB-dokumentstørrelsen begrænset til 16 MB. Så hvis du har dokumenter, der er større end 16 MB, kan du gemme dem ved hjælp af GridFS.
-
Overvindelse af filsystembegrænsninger
Hvis du gemmer et stort antal filer, skal du overveje filsystembegrænsninger som det maksimale antal filer/mappe osv. Med GridFS skal du du behøver ikke bekymre dig om filsystemgrænserne. Med GridFS og MongoDB sharding kan du også distribuere dine filer på tværs af forskellige servere uden at øge den operationelle kompleksitet væsentligt.
GridFS – Bag kulisserne
GridFS bruger to samlinger til at gemme dataene:
> show collections; fs.chunks fs.files system.indexes >
fs.files-samlingerne indeholder metadata om filerne, og fs.chunks-samlingerne gemmer de faktiske 256k bidder. Hvis du har en opdelt samling, er bidderne fordelt på tværs af forskellige servere, og du får muligvis bedre ydeevne end et 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 opretter også et sammensat indeks på files_id og chunk-nummeret for at hjælpe med hurtig adgang til chunks:
> 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-eksempler
MongoDB har et indbygget hjælpeprogram kaldet "mongofiler" til at hjælpe med at udøve GridFS-scenarie. Se venligst din driverdokumentation om, hvordan du bruger GridFS med din driver.
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
Hvis du gerne vil betjene fildataene, der er gemt i MongoDB direkte fra din webserver eller filsystem, er der flere tilgængelige GridFS plugin-moduler:
- GridFS-Fuse – Plugin GridFS ind i filsystemet
- GridFS-Nginx - Plugin til server GridFS-filer direkte fra Nginx
GridFS-begrænsninger
-
Arbejdssæt
Hvis du viser filer sammen med dit databaseindhold, kan det øge dit hukommelsesarbejdssæt betydeligt. Hvis du ikke vil forstyrre dit arbejdssæt, kan det være bedst at servere dine filer fra en anden MongoDB-server.
-
Ydeevne
Filvisningsydelsen vil være langsommere end den oprindelige visning af filen fra din webserver og dit filsystem. De ekstra administrationsfordele kan dog være opbremsningen værd.
-
Atomic opdatering
GridFS giver ikke mulighed for at lave en atomisk opdatering af en fil. Hvis dette scenarie er nødvendigt, skal du vedligeholde flere versioner af dine filer og vælge den rigtige version.