Nesvet
@Nesvet
Разработчик

Хранение изображений в MongoDB — стоит ли?

Добрый день.


Нужно авторитетное мнение по данному вопросу. Была задача разобраться с GridFS, записывать и читать оттуда файлы. Всё получилось, но встал вопрос: есть ли какой-то смысл хранить там, например, изображения (фотографии)? Получается ли такое решение более производительным (или наоборот)? Если да, то как (по логике) оптимальнее это реализовать?


Как это происходит сейчас:
На GET-запрос /specialists/:login/photos/:photo (где :login — логин специалиста, :photo — уникальный идентификатор фотографии) происходит запрос в GridFS, откуда по идетификатору достаётся фотография специалиста и отдаётся браузеру.

Соответственно, на странице фотография прописывается, как
<img src="/specialists/:login/photos/:photo" alt="" />
, а их может быть и штук 20, что будет означать 20 запросов в базу.
  • Вопрос задан
  • 21840 просмотров
Пригласить эксперта
Ответы на вопрос 4
taliban
@taliban
php программист
Совершенно не стоит. Зачем вам вообще лишние запросы к базе? Тем более такие обьемные? Люди наоборот все кешируют и на винт складывают, чтоб доступ быстрей был, а вы наоборот думаете как бы кеш (изображения) убрать из под руки и засунуть в базу.
Ответ написан
Stdit
@Stdit
Производительным не получится, если нет большого кластера, который компенсирует сниженную скорость доступа за счёт распараллеливания. Я предпочитаю хранить картинки на отдельном сервере, а в базе ссылки на них. Вот небольшое исследование этого вопроса, правда двухлетней давности: www.coffeepowered.net/2010/02/17/serving-files-out-of-gridfs/
Ответ написан
Комментировать
@MadJeck
Смотрите в сторону gridFS (часть mongo) и модуля nginx ( github.com/mdirolf/nginx-gridfs ) если память не изменяет то теряете 50% в производительности, но получаете все плюшки облачного хранения файлов.
Ответ написан
Aco
@Aco
Заклинатель кода
Если стоит вопрос хранения файлов в GridFS, значит есть потребность в облачном хранении и своевременном изменении файла/файлов в облаке, а так же контролируемая файловое хранилище (например вести счетчик использования файла в самом документе в gridfs и удалять при его обнулении). Только в этом случае имеет смысл задуматься о gridfs. Конечно, если использовать в лоб GridFS то потери производительности будут, и чем больше запросов и больше файлов тем больше просадка по производительности. Есть несколько вариантов более-менее производительные решения, но их вся суть сводиться: GridFS — (gridfs-fuse) --> disk0 — (rsync) --> disk1 — (rsync) --> disk2 — … (возможны параллельнык rsync) или GridFS — (gridfs-fuse) --> disk0 — (drbd) --> disk1, disk2,… или их комбинации.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы