хранение файлов + разрешения: подход mongodb против файловой системы - PullRequest
4 голосов
/ 06 декабря 2011

Веб-приложение Java, которое я разрабатываю, позволяет пользователям загружать файлы (изображения и документы) в свои профили и определять правила доступа к этим файлам (определить, кто из других пользователей может просматривать / загружать файл). Система контроля доступа / разрешения сделана на заказ, а правила хранятся в mongoDB вместе с профилем пользователя и фактической записью файла.

Зная, что мне нужно, чтобы приложение и хранилище были распределенными и отказоустойчивыми, я должен выяснить, какая стратегия лучше всего подходит для хранения файлов.

Стоит ли хранить файлы внутри mongoDB в коллекции файлов, в которой находится документ с описанием и правилами доступа?

Или я должен хранить файлы в файловой системе сервера и сохранять путь в документе mongoDB? С подходом файловой системы я все еще буду в состоянии обеспечить определенные пользователем права доступа и как? Наконец, в подходе файловой системы, как я могу распространять файлы по серверам? Должен ли я использовать выделенные серверы для этого или я могу хранить файлы на серверах веб-приложений или серверах mongodb?

Большое спасибо за ваши идеи! Любая помощь или отзывы приветствуются.

Alex

1 Ответ

7 голосов
/ 06 декабря 2011

Есть несколько альтернатив:

  • помещать файлы в службу хранения (например, S3): легко и много места, но плохо работает
  • помещает файлы в локальную файловую систему: быстро, но не масштабируется
  • поместите файлы в документы mongodb: легко, мощно и масштабируемо, но ограничено 16 МБ
  • использовать GridFS-слой mongodb. Функциональные возможности ограничены, но это сделано для масштабируемости (благодаря шардингу) и также довольно быстро. Обратите внимание, что вы можете поместить информацию о файле (разрешение и т. Д.) Прямо в объект метаданных файла.

В вашем случае кажется, что последний вариант может быть лучшим, есть довольно много пользователей, которые переключились с FS на gridFS, и он работал очень хорошо для них. Что нужно иметь в виду:

  • gridfs sharding работает, но не совершенен: обычно отбрасываются только данные, а не метаданные. Ничего страшного, но осколок с метаданными должен быть очень безопасным.
  • может быть полезно использовать gridfs в отдельном кластере mongodb из ваших основных данных, так как требования (хранилище, резервное копирование и т. Д.) Обычно отличаются.
...