Ist GridFS schnell und zuverlässig genug für die Produktion?

85

Ich entwickle eine neue Website und möchte GridFS als Speicher für alle Benutzer-Uploads verwenden, da es im Vergleich zu einem normalen Dateisystemspeicher viele Vorteile bietet.

Benchmarks mit GridFS, die von Nginx bereitgestellt werden, zeigen, dass es nicht so schnell ist wie ein normales Dateisystem, das von Nginx bereitgestellt wird.

Benchmark mit Nginx

Gibt es jemanden da draußen, der GridFS bereits in einer Produktionsumgebung verwendet oder es für ein neues Projekt verwenden würde?

Railsmechanic
quelle
1
Ein Blog-Beitrag zum Speichern von Bildern in Mongodb für zukünftige Suchende, die eine ähnliche Absicht wie ich hatten: menge.io/2015/03/24/storing-small-images-in-mongodb (vergleicht GridFS damit, es einfach als Binärdatei in das Dokument zu werfen Daten)
Bei der Entscheidung, ob Sie Binärdaten in MongoDB speichern möchten, sind viele Kompromisse zu berücksichtigen - siehe: alexmarquardt.com/2017/03/02/…
Alexander Marquardt

Antworten:

117

Ich verwende Gridfs bei der Arbeit auf einem unserer Server, der Teil einer preisvergleichenden Website mit ehrenwerten Verkehrsstatistiken ist (ca. 25.000 Besucher pro Tag). Der Server hat nicht viel RAM, 2 GB und selbst die CPU ist nicht sehr schnell (Core 2 Duo 1,8 GHz), aber der Server hat viel Speicherplatz: 10 TB (Sata) in der RAID 0-Konfiguration. Die Arbeit des Servers ist sehr einfach:

Jedes Produkt in unserem Preisvergleich hat ein Bild (es gibt ungefähr 10 Millionen Produkte gemäß unserer Produktdatenbank). Die Aufgabe des Servers besteht darin, das Bild herunterzuladen, seine Größe zu ändern, es in Grids zu speichern und es an den Besucherbrowser zu liefern. .. wenn es nicht im Raster vorhanden ist ... oder ... es an den Besucherbrowser senden, wenn es bereits im Raster gespeichert ist. Dies könnte also als "traditionelles CDN-Schema" bezeichnet werden.

Wir haben 4 Millionen Bilder auf diesem Server gespeichert und verarbeitet, seit er läuft. Die Größenänderung und Speicherung erfolgt über ein einfaches PHP-Skript ... aber sicher könnte ein Python-Skript oder so etwas wie Java schneller sein.

Aktuelle Datengröße: 11,23 g

Aktuelle Speichergröße: 12,5 g

Indizes: 5

Indexgröße: 849,65 m

Über die Zuverlässigkeit: Dies ist sehr zuverlässig. Der Server wird nicht geladen, die Indexgröße ist in Ordnung, Abfragen sind schnell

Über die Geschwindigkeit: Sicher ist es nicht schnell wie lokaler Dateispeicher, vielleicht 10% langsamer, aber schnell genug, um in Echtzeit verwendet zu werden, selbst wenn das Bild verarbeitet werden muss, was in unserem Fall sehr PHP-abhängig ist. Die Wartungs- und Entwicklungszeiten wurden ebenfalls verkürzt: Es wurde so einfach, ein oder mehrere Bilder zu löschen: Fragen Sie einfach die Datenbank mit einem einfachen Löschbefehl ab. Eine weitere interessante Sache: Wenn wir unseren alten Server mit lokalem Dateispeicher neu starten (also Millionen von Dateien in Tausenden von Ordnern), bleibt er manchmal stundenlang hängen, weil das System eine Dateiintegritätsprüfung durchführte (dies dauerte wirklich Stunden ...). Wir haben dieses Problem nicht mehr mit gridfs, unsere Bilder werden jetzt in großen Mongodb-Blöcken (2 GB-Dateien) gespeichert.

Also ... in meinen Gedanken ... Ja, Gridfs ist schnell und zuverlässig genug, um für die Produktion verwendet zu werden.

Manu Eidenberger
quelle
9
Ich bin schockiert, dass jemand RAID 0 als primären Speicher auf einer Produktionswebsite verwenden würde. Selbst bei guten Backups ist die Erhöhung der Wahrscheinlichkeit eines Speicherausfalls ein ziemlich hoher Preis für eine verbesserte Leistung.
Mikerobi
67
Wir verwenden RAID 0, da in unserem speziellen Fall Bilddaten flüchtig sein können. Es spielt keine Rolle, ob das Bild verloren geht, da wir es erneut von der Händler-Website herunterladen werden. Pragmatisch könnten wir annehmen, dass unser Server ein einfacher Image-Cache-Server ist.
Manu Eidenberger
Sie erhöhen jedoch aktiv die Ausfallwahrscheinlichkeit (anfänglicher Antriebsausfallfaktor multipliziert mit der Anzahl der Spindeln). Raid 10 ist ideal, wenn Sie mehr Schreibvorgänge als Lesevorgänge benötigen, oder Raid 5/6, wenn Sie mehr Lesevorgänge als Schreibvorgänge benötigen.
NeuroScr
9
@ManuEidenberger Warum verwenden Sie GridFS zum Speichern von Bildern, die lieber in einem MongoDB-Dokument gespeichert werden sollen? Ich denke, Sie haben die maximale Größe von 16 MB nicht erreicht. Das Speichern des Bildes als BLOB in einem MongoDB-Dokument wäre effizienter, da Sie die GridFS-Ebene nicht über MongoDB-Dokumenten benötigen.
Arnaud Bouchez
1
Ich bin auch neugierig auf die Frage von @ ArnaudBouchez. Gab es einen Vorteil, der Sie dazu veranlasste, GridFS zu wählen, anstatt es einfach als Binärdaten in einem Dokument zu speichern, Manu? Vielen Dank!
12

Wie bereits erwähnt, ist es vielleicht nicht so schnell wie ein gewöhnliches Dateisystem, aber dann bietet es Ihnen Vorteile für den Menschen gegenüber gewöhnlichen Dateisystemen, für die es sich meiner Meinung nach lohnt, auf etwas Geschwindigkeit zu verzichten.

Letztendlich können Sie mit Sharding jedoch einen Punkt erreichen, an dem der GridFS-Speicher im Gegensatz zu einem normalen Dateisystem und einem einzelnen Knoten tatsächlich zur schnelleren Option wird.

Tom
quelle
6

Heads-up bei Reparaturen für größere DBs - ein neues System, das wir entwickeln, Mongo wurde nicht sauber beendet, und die Reparatur des 7-TB-GridFS scheint 130 Stunden zu dauern.

Aus diesem Grund denke ich, dass ich auf OpenStack Swift oder Ceph umsteigen werde. Trotzdem war es bis dahin gut. Und das nginx-gridfs-Modul ist süß.

Nick
quelle
Wie bist du gegangen?
Mukus
5

Das nginx-gridfs-Modul von mdirolf ist großartig und ziemlich einfach einzurichten. Wir verwenden es in der Produktion bei paint.ly , um alle Bilder zu bedienen, und es gab bisher keine Probleme.

schallis
quelle
3
paint.ly ist anscheinend nicht mehr verfügbar. :(
Marian
2

Ich empfehle nicht, gridfs zu verwenden, es sei denn, Sie wissen, was Sie tun. GridFS ist nur eine Abstraktionsschicht, die Dateien für Chunks aufteilt und die Dateien in zwei Sammlungen speichert. Mehr Dateien - mehr Overhead. Wenn Sie erwarten, dass Dateien ziemlich gleich groß sind und 32 MB oder mehr nicht überschreiten, sind Sie auf dem richtigen Weg. Versuchen Sie nicht, große Dateien in gridfs zu speichern. Warum?

  1. Treiber in verschiedenen Sprachen können beim Lesen des kleinen Teils der Datei die gesamte Datei (z. B. Chunks) lesen.
  2. Das Ändern der Datei kann sich auf alle Chunks auswirken und die Datenbanklast erhöhen. Wenn Ihr Dateisystem aufwächst, müssen Sie sich entscheiden, die Gridfs zu sharden. Achtung! Die Konsistenz ist beim Initialisieren des Shards nicht garantiert!

Wenn Sie über ein gelesenes geladenes Projekt nachdenken, sollten Sie die Dateien direkt in Dokumente laden (bei einer Größe von 16 MB oder weniger) oder ein anderes Cluster-Format auswählen und Dateinamen / Inode mit Ihrer Logik verknüpfen.

Hoffe das hilft.

Vitaly Greck
quelle
4
Ich bin ziemlich neu in GridFS, obwohl GridFS meines Wissens mehr als nur eine Abstraktionsschicht ist, die die Anzahl der Dateien verdoppelt. GridFS bietet eine einfache Möglichkeit, die Replikations- und Sharding-Funktionen von MongoDB zu nutzen. Ich glaube, andere haben auch erwähnt, dass Dateien in 2-GB-Blöcken gespeichert sind, was meiner Meinung nach die Gesamtzahl der Dateien verringern würde, insbesondere wenn jemand eine sehr große Anzahl kleiner Bilder hat.
+1 Du hast recht. Selbst kleinere Dateien würden nicht von GridFS gespeichert. Wenn Ihre Datei in einem MongoDB-Dokument gespeichert werden könnte (dh <der Größenbeschränkung von 16 MB), würden Sie die Datei lieber als BLOB in einem MongoDB-Dokument speichern. Der Overhead der Verwendung von GridFS über dem MongoDB-Speicher wird umgangen. Siehe compose.io/articles/gridfs-and-mongodb-pros-and-cons
Arnaud Bouchez