sql >> Database teknologi >  >> NoSQL >> MongoDB

Hvornår skal man bruge GridFS på MongoDB?

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:

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

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

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

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


  1. Hvordan beregnes tidsstempelforskellen i mongodb (i timer)?

  2. Redis aktiv-aktiv replikation

  3. Pop flere værdier fra Redis datastruktur atomisk?

  4. Hvilken betydning har rækkefølgen af ​​sammensatte indekser i MongoDB præstationsmæssigt?