Пробуем кластерную файловую систему GridFS
// Сентябрь 21st, 2011 // NoSQL, Веб-разработка, Виртуализация
Сейчас есть множество кластерных файловых систем, например DRBD, GlusterFS и другие. В этой заметке я хочу рассказать о файловой системе GridFS, от разработчиков MongoDB стартапа 10gen. Интерес к кластерным ФС возник у меня не случайно, а в следствии поиска решения задачи распределённого хранения картинок пользователей (ака CDN).
10gen stack
Вообще 10gen предлагают свой стек технологий на подобии LAMP.
Файловая система в нём представлена несколькими системами, главной из которых является масштабируемая универсальная система GridFS, которая является и хранилищем данных для документо-ориентированной базы данных MongoDB. Для хранения файлов проекта (исходный код скриптов, CSS, HTML и другие файлы) применяется надстройка SCF (Source Code Filesystem), которая работает и управляется поверх системы контроля версий Git (заметьте, в подобных проектах очень удобно совмещать систему контроля версий и непосредственно каталог проекта, который доступный через веб-сервер, поэтому и в Aptana Cloud применяется такой подход, правда через более привычный SVN).
GridFS
Основная прелесть GridFS заключается в том, что распределение файлов она берет полностью на себя. Думаю вам стоит посмотреть короткую презентацию про эту ФС.
Установка и настройка GridFS в Ubuntu
1. Подготовка системы (установка пакетов в т.ч. библиотек Boost и Fuse)
sudo aptitude install build-essential libcurl4-openssl-dev libxml2-dev libfuse-dev comerr-dev libfuse2 libidn11-dev libkrb5-dev libldap2-dev libselinux1-dev libsepol1-dev pkg-config fuse-utils sshfs libboost-all-dev libattr1 libattr1-dev scons
2. Устанавливаем Mongodb. Нам нужна версия > 1.1.2
sudo aptitude install mongodb
3. Скачиваем gridfs-fuse с помощью git (или вручную через github.com).
На самом деле авторским является вот этот репозиатрий, однако его исходники у меня не компилятся, а вот с репозитария chealand вполне.
cd ~ git clone https://github.com/cheald/gridfs-fuse.git
4. Компилируем его с помощью scons
cd ./gridfs-fuse/ scons
5. Монтируем GridFS
Теперь у нас скомпилился бинарник mount_gridfs, попробуем примонтировать его к нашей системе.
sudo mkdir /media/gridfs sudo ./mount_gridfs --db=test --host=localhost /media/gridfs
6. Проверяем работу GridFS, например попробуем скопировать файл utils.h в неё
sudo ls /media/gridfs sudo cp utils.h /media/gridfs/utils.h
А теперь попробуем прочитать его с помощью ls и mongofiles
andrey@vbox:~/gridfs-fuse$ sudo ls /media/gridfs utils.h andrey@vbox:~/gridfs-fuse$ mongofiles list connected to: 127.0.0.1 utils.h 1911
Файл на месте, теперь для удобства можно перекинуть mount_gridfs в /usr/bin и прописать монтирование в стартовые скрипты.
Недостатки GridFS и перспективы
Т.к. сейчас GridFS-fuse это экспериментальный проект, то в примонтированном диске нельзя создавать папки. Хотя никто не запрещает монтировать разные базы в разные каталоги, что может частично устранить эту проблему.
Однако если учесть, что небезызвестная Sequoia Capital только что инвестировала в 10gen 20 миллионов долларов (а ещё 10 миллионов у них уже было), похоже что у проекта GridFS есть хорошие перспективы среди кластерных файловых систем.
Mongofiles
В поставке mongodb есть замечательная утилиат mongofiles, которая позволяет закачивать/выкачивать и просматривать файлы в GridFS. Она поддерживает команды list, put, get для файлов.
Файлы
Ссылки
https://github.com/cheald/gridfs-fuse
http://habrahabr.ru/blogs/hi/36609/
Related posts
- MySQLFS. Хранение чего угодно в MySQL
- Производительность GridFS
- Eventr.com как смесь веб-технологий
- Уральский вебдев. Конференция Dump в Екатеринбурге. Фотоотчёт.
- Баг в igbinary 1.1.1 при сериализации сессий в MongoDB Session Handler








> решения задачи распределённого файлов картинок
Поправьте
Интересно было бы узнать, как это в итоге превращается в CDN.
Поправил, спасибо
По поводу CDN’а: если у нас есть n узлов с контентом (то что решается в этой статье), то осталось только решить задачу выбора точки CDN для отдачи контента. Лучше всего выбирать по географическому признаку, что кстати тоже можно делать через MongoDB с помощью Geospatial Indexing.
Полезная статья, очень, спасибо!
Определенный плюс такой вот системы это масштабируемость… Но в контексте применения ее на одном сервере, очень хотелось бы сравнить performance показатели с уже существующими решениями типа ramfs&tmpfs… Было бы интересно
Спасибо! Хорошая идея кстати, думаю бенчмарки производительности GridFS будут темой следующей статьи
Ну по сравнению с ФС, располагаемыми в памяти gridFS однозначно проиграет (тут помимо проигрыша самого gridFS еще и fuse внесет свою лепту).
Ну если замахиваться на CDN, то логичнее было бы использовать модуль для nginx-а, вместо fuse
С этим модулем, правда, есть проблемы — у него память течет. Нам пришлось искать и затыкать эти дыры.
В плюсы к модулю можно записать появившеюся недавно возможность отдавать ETag и Last-Modify, что помогает сильно снизить нагрузку.
В минус этому модулю — тормозные контрибуторы, развивается проект крайне медленно. Пулреквесты могут месяцами висеть
Возвращаясь к gridFS, основным достоинством, на мой взгляд, является расширяемость «из коробки», плюс надежность (за счет репликации).
Кстати, монговцы советуют ставить монгу из их собственного репозитория, т.к. в каноникловском у консольного клиента проблемы с поддержкой utf8
Система конечно отличная но есть и недостатки, а так супер
[...] Пробуем кластерную файловую систему GridFS (ту, которая на MongoDB) + бенчмарк [...]