MongoDB как файловое хранилище

Я пытаюсь найти лучшее решение для создания масштабируемого хранилища для больших файлов. Размер файла может варьироваться от 1-2 МБ и до 500-600 гигабайт.

Я нашел некоторую информацию о Hadoop, и это HDFS, но это выглядит немного сложно, потому что мне не нужны никакие карты/уменьшить задания и многие другие функции. Теперь я думаю использовать MongoDB, и это GridFS в качестве решения для хранения файлов.

а теперь вопросы:

  1. что будет с gridfs, когда я пытаюсь написать несколько файлов одновременно. Будет ли блокировка операций чтения/записи? (Я буду использовать его только как файловое хранилище)
  2. будут ли файлы из gridfs кэшироваться в ОЗУ и как это повлияет на производительность чтения и записи?
  3. может быть, есть некоторые другие решения, которые могут решить мою проблему более эффективно?

спасибо.

3 ответов


Я могу ответить только за MongoDB здесь, я не буду притворяться, что знаю много о HDFS и других подобных технологиях.

реализация GridFs полностью клиентская сторона внутри самого драйвера. Это означает, что нет специальной загрузки или понимания контекста обслуживания файлов в самом MongoDB, фактически MongoDB даже не понимает, что они являются файлами (http://docs.mongodb.org/manual/applications/gridfs/).

это означает, что запрос для любой части files или chunks коллекция приведет в так же, как и для любого другого запроса, который загружает данные в свой рабочий набор ( http://en.wikipedia.org/wiki/Working_set ), который представляет собой набор данных (или всех загруженных данных в то время), необходимых MongoDB в течение определенного периода времени для поддержания оптимальной производительности. Он делает это, подкачивая его в ОЗУ (ну технически ОС делает).

еще один момент, чтобы взять с учетом того, что это драйвер реализован. Это означает, что спецификация может отличаться, однако я не думаю, что это так. Все драйверы позволят вам запросить набор документов из files коллекция, в которой хранятся только метаданные файлов, позволяющие позже обслуживать сам файл из chunks коллекция с одним запросом.

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

имея это в виду, мы уже попали в первую загвоздку:

будут ли файлы из gridfs кэшироваться в ОЗУ и как это повлияет на производительность чтения и записи?

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

для больших файлов, не так. На большинстве компьютеров не будет 600 ГБ ОЗУ и, вероятно, вполне нормально на самом деле, разместить раздел 600 GB одного файла на одном mongod экземпляра. Это создает проблему, так как этот файл, чтобы быть обслуживаемым, должен вписываться в ваш рабочий набор, однако он невозможно больше, чем ваша ОЗУ; на данный момент Вы можете иметь битье страницы (http://en.wikipedia.org/wiki/Thrashing_%28computer_science%29), в котором сервер просто страница сбоя 24/7 пытается загрузить файл. Здесь пишут не лучше. также.

единственный способ обойти это, чтобы начать положить один файл через много осколков :\.

Примечание: еще одна вещь, чтобы рассмотреть, что средний по умолчанию размере chunks "chunk" - 256KB, так что это много документов для файла 600GB. Этот параметр можно использовать в большинстве драйверов.

что произойдет с gridfs, когда я попытаюсь написать несколько файлов одновременно. Будет ли блокировка операций чтения/записи? (Я буду использовать его только как файловое хранилище)

GridFS, будучи только спецификацией, использует те же блокировки, что и в любой другой коллекции, блокировки чтения и записи на уровне базы данных (2.2+) или на глобальном уровне (pre-2.2). Они также мешают друг другу, то есть как вы можете обеспечить последовательное чтение документа, в который записывается?

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

может быть, есть некоторые другие решения, которые могут решить мою проблему более эффективно?

Я лично обнаружил, что S3 (как сказал @mluggy) в уменьшенном формате избыточности лучше всего хранит простую часть метаданных о файле в MongoDB, так же, как с помощью GridFS, но без коллекции chunks, пусть S3 обрабатывает все это распределение, резервное копирование и другие вещи для вас.

надеюсь у меня было ясно, надеюсь, это поможет.

Edit: в отличие от того, что я случайно сказал, MongoDB не имеет блокировки уровня коллекции, это блокировка уровня базы данных.


вы рассматривали сохранение метаданных в MongoDB и запись фактических файлов в Amazon S3? Оба имеют отличные драйверы, а последний является очень избыточным, облачным/cdn-готовым хранилищем файлов. Я бы попробовал.


Я начну с ответа на первые два:

  1. существует блокировка записи при записи в GridFS, да. Нет замка для чтения.
  2. файлы не будут кэшироваться в памяти при запросе, но их метаданные будут.

GridFS не может быть лучшим решением для вашей проблемы. Блокировка записи может стать чем-то вроде боли, когда вы имеете дело с этим типом ситуации, особенно для больших файлов. Есть другие базы данных, которые могут решить эта проблема для тебя. HDFS-это хороший выбор, но как вы говорите, это очень сложно. Я бы рекомендовал рассмотреть механизм хранения, такой как Riak или S3 Amazon. Они больше ориентированы на хранение файлов и не имеют серьезных недостатков. S3 и Riak имеют отличные возможности администратора и могут обрабатывать огромные файлы. Хотя с Riak, последнее, что я знал, вам нужно было сделать некоторые файлы, чтобы хранить файлы более 100 МБ. Несмотря на это, как правило, лучше всего делать некоторый уровень chunking для огромных размеров файлов. Есть много плохих вещей,которые могут произойти при передаче файлов в DBs - от тайм-аутов сети, переполнения буфера и т. д. В любом случае, ваше решение потребует значительной настройки для массивных размеров файлов.