Ich kann hier nur für MongoDB antworten, ich werde nicht so tun, als wüsste ich viel über HDFS und andere derartige Technologien.
Die GridFs-Implementierung ist vollständig clientseitig innerhalb des Treibers selbst. Dies bedeutet, dass es kein spezielles Laden oder Verständnis des Kontexts der Dateibereitstellung in MongoDB selbst gibt, effektiv versteht MongoDB selbst nicht einmal, dass es sich um Dateien handelt ( http://docs.mongodb.org/manual/applications/gridfs/ ).
Das bedeutet, dass nach irgendeinem Teil der files
gefragt wird oder chunks
Sammlung führt zum gleichen Prozess wie bei jeder anderen Abfrage, wobei die benötigten Daten in Ihr Arbeitsset ( http://en.wikipedia.org/wiki/Working_set ) geladen werden, das einen Satz von Daten (oder alle geladene Daten zu diesem Zeitpunkt), die von MongoDB innerhalb eines bestimmten Zeitrahmens benötigt werden, um eine optimale Leistung aufrechtzuerhalten. Es tut dies, indem es es in den RAM auslagert (technisch gesehen tut es das Betriebssystem).
Ein weiterer zu berücksichtigender Punkt ist, dass dies treiberimplementiert ist. Dies bedeutet, dass die Spezifikation variieren kann, aber ich glaube nicht, dass dies der Fall ist. Alle Treiber ermöglichen es Ihnen, eine Reihe von Dokumenten aus den files
abzufragen Sammlung, die nur die Metadaten der Datei enthält, sodass Sie später die Datei selbst aus den chunks
bereitstellen können Sammlung mit einer einzigen Abfrage.
Das ist jedoch nicht das Wichtigste, Sie möchten die Datei selbst einschließlich ihrer Daten bereitstellen. das bedeutet, dass Sie die files
laden werden -Sammlung und ihre nachfolgenden chunks
Sammlung in Ihren Arbeitssatz.
In diesem Sinne haben wir bereits den ersten Haken getroffen:
Werden Dateien aus Gridfs im RAM zwischengespeichert und wie wirkt sich dies auf die Lese-/Schreibleistung aus?
Die Leseleistung von kleinen Dateien könnte großartig sein, direkt aus dem RAM; die Schreibvorgänge wären genauso gut.
Bei größeren Dateien nicht so. Die meisten Computer verfügen nicht über 600 GB RAM und es ist wahrscheinlich, ganz normal, dass eine 600-GB-Partition einer einzelnen Datei auf einem einzigen mongod
untergebracht wird Beispiel. Dies schafft ein Problem, da diese Datei, um bedient zu werden, in Ihren Arbeitssatz passen muss, aber unmöglich größer als Ihr Arbeitsspeicher ist; An diesem Punkt könnten Sie Seiten-Thrashing haben ( http://en.wikipedia.org/wiki/Thrashing_%28computer_science%29 ), wodurch der Server rund um die Uhr versucht, die Datei zu laden. Die Schreibvorgänge hier sind auch nicht besser.
Der einzige Weg, dies zu umgehen, besteht darin, eine einzelne Datei auf viele Shards zu legen :\
.
Hinweis:Eine weitere zu berücksichtigende Sache ist, dass die standardmäßige durchschnittliche Größe eines chunks
"Chunk" ist 256 KB groß, das sind also viele Dokumente für eine 600-GB-Datei. Diese Einstellung ist in den meisten Treibern manipulierbar.
Was passiert mit gridfs, wenn ich versuche, einige Dateien gleichzeitig zu schreiben. Wird es eine Sperre für Lese-/Schreibvorgänge geben? (Ich werde es nur als Dateispeicher verwenden)
GridFS, das nur eine Spezifikation ist, verwendet die gleichen Sperren wie jede andere Sammlung, sowohl Lese- als auch Schreibsperren auf Datenbankebene (2.2+) oder auf globaler Ebene (vor 2.2). Die beiden stören sich auch gegenseitig, d. h. wie können Sie sicherstellen, dass ein Dokument, in das geschrieben wird, konsistent gelesen wird?
Abgesehen davon besteht die Möglichkeit von Konflikten basierend auf Ihren Szenario-Besonderheiten, dem Datenverkehr, der Anzahl gleichzeitiger Schreib-/Lesevorgänge und vielen anderen Dingen, von denen wir keine Ahnung haben.
Vielleicht gibt es andere Lösungen, die mein Problem effizienter lösen können?
Ich persönlich habe festgestellt, dass S3 (wie @mluggy sagte) im Format mit reduzierter Redundanz am besten funktioniert, wenn nur ein Teil der Metadaten über die Datei in MongoDB gespeichert wird, ähnlich wie bei der Verwendung von GridFS, aber ohne die Chunks-Sammlung, lassen Sie S3 all diese Verteilung, Sicherung und andere Sachen für dich.
Hoffentlich habe ich mich klar ausgedrückt, hoffe es hilft.
Bearbeiten:Im Gegensatz zu dem, was ich versehentlich gesagt habe, hat MongoDB keine Sperre auf Sammlungsebene, sondern eine Sperre auf Datenbankebene.