MongoDB, хранение файлов в базе
13 февраля, 2012
В интернетах бытует мнение, что хранить файлы в БД — школоло. Разрушаем стереотип с Mongo GridFS.
Введение:
MongoDB предоставляет возможность хранить файлы любого размера в Mongo GridFS
Для драйвера PHP — это обычная коллекция, в которой есть поле для хранения бинарных данных.
Бинарные данные в свою очередь разбиваются на чунки(небольшие куски).
Бинарные данные можно извлечь как целиком, так и почунково(это экономит память).
Плюсы хранения данных в БД MongoDB:
MongoDB может хранить миллионы файлов в БД, хранение такого объёма данных в файловой системе может вызвать проблемы(начиная с IO проблем, заканчивая проблемами доступа к данным из разных серверов).
MongoDB реплицирует данные на все сервера, что упрощает доступ к данным на отдельно взятом сервере.
Нет проблем с бекапами и целостностью данных на разных серверах. надёжность обеспечивается MongoDB.
К загруженному файлу можно прикрепить метаданные (описание, комментарии, лайки, и.т.д.)
Т.к. файлы хранятся в чунках — можно работать с любой частью файла.
Минусы:
Быстродействие ниже, чем nginx + файловая истема. Сравним:
nginx + файловая система, получаем 6559.31 операций в секунду
apache + файловая система: получаем 2625.37 операций в секунду
nginx + модуль nginx-gridfs, получаем 1083.88 операций в секунду
Вывод: nginx + fs на высоте, но это решение не даёт масштабируемости и гибкости.
nginx + nginx-gridfs даёт приличные результаты, которые существенно возрастут, при использовании нескольких серверов MongoDB.
Благодарность, http://tokarchuk.ru за тесты.
«, которые существенно возрастут, при использовании нескольких серверов MongoDB.» такое вот надо подтверждать фактами и цифрами %)
Ранее я писал о особенностях работы find() в MongoDB. Вкратце — запрос будет выполнен не на основной ноде, а на слейве с лучшим пингом.
Из этого следует, что запросы на получение данных(файлов) будет размазаны по нодам MongoDB. Используя балансировку нагрузки nginx’а мы может балансировать загрузку нод.
Как настроить балансирование нагрузки с помощью nginx, я писал тут.
спасибо за статью.
Вот, спасибо. На #PHP в IRC руснете меня чуть не забанили за неё, за инакомыслие =)