GridFS is een eenvoudige bestandssysteemabstractie bovenop MongoDB. Als u bekend bent met Amazon S3, is GridFS een zeer vergelijkbare abstractie. Waarom biedt een documentgeoriënteerde database zoals MongoDB een abstractie van bestandslagen? Blijkt dat er een aantal zeer goede redenen zijn:
-
Door gebruikers gegenereerde bestandsinhoud opslaan
Een groot aantal webapplicaties stelt gebruikers in staat om bestanden te uploaden. Historisch gezien worden deze door gebruikers gegenereerde bestanden bij het werken met relationele databases apart van de database op het bestandssysteem opgeslagen. Dit zorgt voor een aantal problemen. Hoe de bestanden te repliceren naar alle benodigde servers? Hoe verwijder ik alle kopieën wanneer het bestand is verwijderd? Hoe maak je een back-up van de bestanden voor veiligheid en noodherstel? GridFS lost deze problemen voor de gebruiker op door de bestanden samen met de database op te slaan, en u kunt uw databaseback-up gebruiken om een back-up van uw bestanden te maken. Dankzij MongoDB-replicatie wordt er ook een kopie van uw bestanden in elke replica opgeslagen. Het verwijderen van het bestand is net zo eenvoudig als het verwijderen van een object in de database.
-
Toegang tot delen van bestandsinhoud
Wanneer een bestand wordt geüpload naar GridFS, wordt het bestand opgesplitst in blokken van 256k en apart opgeslagen. Dus als u slechts een bepaald bereik van bytes van het bestand hoeft te lezen, worden alleen die chunks in het geheugen geplaatst en niet het hele bestand. Dit is uitermate handig bij het omgaan met grote media-inhoud die selectief moet worden gelezen of bewerkt.
-
Documenten groter dan 16 MB opslaan in MongoDB
Standaard is de MongoDB-documentgrootte beperkt tot 16 MB. Dus als u documenten heeft die groter zijn dan 16 MB, kunt u deze opslaan met GridFS.
-
Beperkingen van het bestandssysteem overwinnen
Als u een groot aantal bestanden opslaat, moet u rekening houden met beperkingen van het bestandssysteem, zoals het maximale aantal bestanden/directory, enz. Met GridFS hoeft u dat niet te doen. U hoeft zich geen zorgen te maken over de limieten van het bestandssysteem. Met GridFS en MongoDB sharding kunt u uw bestanden over verschillende servers distribueren zonder de operationele complexiteit aanzienlijk te vergroten.
GridFS – Achter de schermen
GridFS gebruikt twee verzamelingen om de gegevens op te slaan:
> show collections; fs.chunks fs.files system.indexes >
De fs.files collecties bevatten metadata over de bestanden, en de fs.chunks collecties slaan de daadwerkelijke 256k chunks op. Als je een shard-verzameling hebt, worden de chunks verdeeld over verschillende servers en krijg je mogelijk betere prestaties dan een bestandssysteem!
> 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 maakt ook een samengestelde index op files_id en het chunknummer om snel toegang te krijgen tot de 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-voorbeelden
MongoDB heeft een ingebouwd hulpprogramma genaamd "mongofiles" om te helpen bij het uitvoeren van de GridFS-scenario's. Raadpleeg de documentatie bij uw stuurprogramma voor informatie over het gebruik van GridFS met uw stuurprogramma.
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-modules
Als u de bestandsgegevens die zijn opgeslagen in MongoDB rechtstreeks vanaf uw webserver of bestandssysteem wilt aanbieden, zijn er verschillende GridFS-plug-inmodules beschikbaar:
- GridFS-Fuse – Plug-in GridFS in het bestandssysteem
- GridFS-Nginx - Plug-in voor server GridFS-bestanden rechtstreeks vanuit Nginx
GridFS-beperkingen
-
Werkset
Als u bestanden samen met uw database-inhoud presenteert, kan uw geheugenwerkset aanzienlijk worden omgegooid. Als u uw werkset niet wilt verstoren, kunt u het beste uw bestanden vanaf een andere MongoDB-server aanbieden.
-
Prestaties
De prestaties van de bestandsweergave zullen langzamer zijn dan de native weergave van het bestand vanaf je webserver en bestandssysteem. De extra beheervoordelen kunnen de vertraging echter waard zijn.
-
Atoomupdate
GridFS biedt geen manier om een atomaire update van een bestand uit te voeren. Als dit scenario nodig is, moet je meerdere versies van je bestanden onderhouden en de juiste versie kiezen.