sql >> Databasteknik >  >> NoSQL >> MongoDB

När ska man använda GridFS på MongoDB?

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:

  1. 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.

  2. Å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.

  3. 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.

  4. Ö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.


  1. MongoDB - stängs av med kod:62

  2. lagra ip-serier i Redis

  3. Multi-samling, multi-dokument "transaktioner" i MongoDB

  4. MongoDB $toUpper