MongoDB
 sql >> Datenbank >  >> NoSQL >> MongoDB

Wann sollte GridFS auf MongoDB verwendet werden?

GridFS ist eine einfache Dateisystemabstraktion auf MongoDB. Wenn Sie mit Amazon S3 vertraut sind, ist GridFS eine sehr ähnliche Abstraktion. Warum bietet nun eine dokumentenorientierte Datenbank wie MongoDB eine Abstraktion der Dateiebene? Es stellt sich heraus, dass es dafür einige sehr gute Gründe gibt:

  1. Speichern von nutzergenerierten Dateiinhalten

    Eine große Anzahl von Webanwendungen ermöglicht Benutzern das Hochladen von Dateien. In der Vergangenheit wurden diese benutzergenerierten Dateien bei der Arbeit mit relationalen Datenbanken getrennt von der Datenbank im Dateisystem gespeichert. Dies schafft eine Reihe von Problemen. Wie werden die Dateien auf alle benötigten Server repliziert? Wie lösche ich alle Kopien, wenn die Datei gelöscht wird? Wie werden die Dateien für die Sicherheit und die Notfallwiederherstellung gesichert? GridFS löst diese Probleme für den Benutzer, indem es die Dateien zusammen mit der Datenbank speichert, und Sie können Ihre Datenbanksicherung nutzen, um Ihre Dateien zu sichern. Außerdem wird aufgrund der MongoDB-Replikation eine Kopie Ihrer Dateien in jedem Replikat gespeichert. Das Löschen der Datei ist so einfach wie das Löschen eines Objekts in der Datenbank.

  2. Zugriff auf Teile des Dateiinhalts

    Wenn eine Datei auf GridFS hochgeladen wird, wird die Datei in Blöcke von 256 KB aufgeteilt und separat gespeichert. Wenn Sie also nur einen bestimmten Bereich von Bytes der Datei lesen müssen, werden nur diese Teile in den Speicher gebracht und nicht die gesamte Datei. Dies ist äußerst nützlich, wenn es um große Medieninhalte geht, die selektiv gelesen oder bearbeitet werden müssen.

  3. Speichern von Dokumenten mit mehr als 16 MB in MongoDB

    Standardmäßig ist die Dokumentgröße von MongoDB auf 16 MB begrenzt. Wenn Sie also Dokumente haben, die größer als 16 MB sind, können Sie sie mit GridFS speichern.

  4. Beschränkungen des Dateisystems überwinden

    Wenn Sie eine große Anzahl von Dateien speichern, müssen Sie Dateisystembeschränkungen wie die maximale Anzahl von Dateien/Verzeichnissen usw. berücksichtigen. Mit GridFS müssen Sie Sie müssen sich keine Gedanken über die Dateisystemgrenzen machen. Außerdem können Sie mit GridFS und MongoDB Sharding Ihre Dateien auf verschiedene Server verteilen, ohne die Betriebskomplexität wesentlich zu erhöhen.

GridFS – Hinter den Kulissen

GridFS verwendet zwei Sammlungen zum Speichern der Daten:

> show collections;
fs.chunks
fs.files
system.indexes
>

Die fs.files-Sammlungen enthalten Metadaten zu den Dateien, und die fs.chunks-Sammlungen speichern die eigentlichen 256.000 Chunks. Wenn Sie eine fragmentierte Sammlung haben, werden die Chunks auf verschiedene Server verteilt und Sie erhalten möglicherweise eine bessere Leistung als ein Dateisystem!

> 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 erstellt auch einen zusammengesetzten Index für files_id und die Chunk-Nummer, um den schnellen Zugriff auf die Chunks zu erleichtern:

> 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"
}
]
>

Beispiele für MongoDB GridFS

MongoDB verfügt über ein integriertes Dienstprogramm namens „mongofiles“, das beim Ausführen der GridFS-Szenarien hilft. Informationen zur Verwendung von GridFS mit Ihrem Treiber finden Sie in Ihrer Treiberdokumentation.

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-Module

Wenn Sie die in MongoDB gespeicherten Dateidaten direkt von Ihrem Webserver oder Dateisystem bereitstellen möchten, stehen mehrere GridFS-Plugin-Module zur Verfügung:

  • GridFS-Fuse – Plugin GridFS in das Dateisystem
  • GridFS-Nginx – Plugin zum Servern von GridFS-Dateien direkt von Nginx

GridFS-Einschränkungen

  • Arbeitssatz

    Das Bereitstellen von Dateien zusammen mit Ihren Datenbankinhalten kann Ihr Arbeitsspeicher-Arbeitsset erheblich verändern. Wenn Sie Ihren Arbeitssatz nicht stören möchten, ist es möglicherweise am besten, Ihre Dateien von einem anderen MongoDB-Server bereitzustellen.

  • Leistung

    Die Dateibereitstellungsleistung ist langsamer als die native Bereitstellung der Datei von Ihrem Webserver und Dateisystem. Die zusätzlichen Verwaltungsvorteile könnten die Verlangsamung jedoch wert sein.

  • Atomisches Update

    GridFS bietet keine Möglichkeit, eine Datei atomar zu aktualisieren. Wenn dieses Szenario erforderlich ist, müssen Sie mehrere Versionen Ihrer Dateien verwalten und die richtige Version auswählen.