GridFS to prosta abstrakcja systemu plików na bazie MongoDB. Jeśli znasz Amazon S3, GridFS jest bardzo podobną abstrakcją. Dlaczego zorientowana na dokumenty baza danych, taka jak MongoDB, zapewnia abstrakcję warstwy plików? Okazuje się, że jest kilka bardzo dobrych powodów:
-
Przechowywanie treści plików generowanych przez użytkowników
Duża liczba aplikacji internetowych umożliwia użytkownikom przesyłanie plików. Historycznie rzecz biorąc, podczas pracy z relacyjnymi bazami danych te pliki generowane przez użytkownika są przechowywane w systemie plików oddzielnie od bazy danych. Stwarza to szereg problemów. Jak zreplikować pliki na wszystkie potrzebne serwery? Jak usunąć wszystkie kopie po usunięciu pliku? Jak wykonać kopię zapasową plików w celu zapewnienia bezpieczeństwa i odzyskiwania po awarii? GridFS rozwiązuje te problemy dla użytkownika, przechowując pliki wraz z bazą danych, a kopię zapasową bazy danych można wykorzystać do tworzenia kopii zapasowych plików. Ponadto, dzięki replikacji MongoDB, kopia Twoich plików jest przechowywana w każdej replice. Usunięcie pliku jest tak proste, jak usunięcie obiektu w bazie danych.
-
Dostęp do części zawartości pliku
Gdy plik jest przesyłany do GridFS, plik jest dzielony na kawałki o wielkości 256 KB i przechowywany oddzielnie. Tak więc, gdy potrzebujesz odczytać tylko pewien zakres bajtów pliku, tylko te fragmenty są przenoszone do pamięci, a nie cały plik. Jest to niezwykle przydatne w przypadku dużych treści multimedialnych, które należy selektywnie czytać lub edytować.
-
Przechowywanie dokumentów większych niż 16 MB w MongoDB
Domyślnie rozmiar dokumentu MongoDB jest ograniczony do 16 MB. Tak więc, jeśli masz dokumenty, które są większe niż 16 MB, możesz je przechowywać za pomocą GridFS.
-
Przezwyciężanie ograniczeń systemu plików
Jeśli przechowujesz dużą liczbę plików, musisz wziąć pod uwagę ograniczenia systemu plików, takie jak maksymalna liczba plików/katalogów itp. W GridFS nie Nie trzeba się martwić o ograniczenia systemu plików. Ponadto dzięki shardingowi GridFS i MongoDB możesz dystrybuować swoje pliki na różnych serwerach bez znacznego zwiększania złożoności operacyjnej.
GridFS – Za kulisami
GridFS używa dwóch kolekcji do przechowywania danych:
> show collections; fs.chunks fs.files system.indexes >
Kolekcje fs.files zawierają metadane o plikach, a kolekcje fs.chunks przechowują rzeczywiste 256k fragmentów. Jeśli masz kolekcję podzieloną na fragmenty, porcje są rozmieszczone na różnych serwerach i możesz uzyskać lepszą wydajność niż system plików!
> 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 tworzy również indeks złożony na file_id i numer porcji, aby pomóc w szybkim dostępie do porcji:
> 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" } ] >
Przykłady MongoDB GridFS
MongoDB ma wbudowane narzędzie o nazwie „mongofiles”, które pomaga ćwiczyć scenariusze GridFS. Zapoznaj się z dokumentacją sterownika, aby dowiedzieć się, jak używać GridFS ze swoim sterownikiem.
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!
Moduły GridFS
Jeśli chcesz obsługiwać dane plików przechowywane w MongoDB bezpośrednio z serwera WWW lub systemu plików, dostępnych jest kilka modułów wtyczek GridFS:
- GridFS-Fuse – Podłącz GridFS do systemu plików
- GridFS-Nginx - Wtyczka do serwera plików GridFS bezpośrednio z Nginx
Ograniczenia GridFS
-
Zestaw roboczy
Obsługiwanie plików wraz z zawartością bazy danych może znacznie zmniejszyć zestaw roboczy pamięci. Jeśli nie chcesz zakłócać swojego zestawu roboczego, najlepiej będzie udostępniać pliki z innego serwera MongoDB.
-
Wydajność
Wydajność udostępniania plików będzie wolniejsza niż natywna obsługa pliku z serwera WWW i systemu plików. Jednak dodatkowe korzyści związane z zarządzaniem mogą być warte spowolnienia.
-
Aktualizacja atomowa
GridFS nie zapewnia sposobu na atomową aktualizację pliku. Jeśli ten scenariusz jest konieczny, musisz zachować wiele wersji plików i wybrać odpowiednią wersję.