Пробуем кластерную файловую систему 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 для файлов.

Файлы

GridFS-fuse от Chris Healand

Ссылки

Описание команд mongofiles

https://github.com/cheald/gridfs-fuse

http://habrahabr.ru/blogs/hi/36609/




coded by nessus
Share










Смотрите также:

Спасибо!


Если вам помогла статья, или вы хотите поддержать мои исследования и блог - вот лучший способ сделать это:


20 Responses to “Пробуем кластерную файловую систему GridFS”

  1. unic:

    > решения задачи распределённого файлов картинок
    Поправьте :)

    Интересно было бы узнать, как это в итоге превращается в CDN.

    • google.com Андрей Токарчук:

      Поправил, спасибо :-) По поводу CDN’а: если у нас есть n узлов с контентом (то что решается в этой статье), то осталось только решить задачу выбора точки CDN для отдачи контента. Лучше всего выбирать по географическому признаку, что кстати тоже можно делать через MongoDB с помощью Geospatial Indexing.

  2. macint0sh:

    Полезная статья, очень, спасибо!
    Определенный плюс такой вот системы это масштабируемость… Но в контексте применения ее на одном сервере, очень хотелось бы сравнить performance показатели с уже существующими решениями типа ramfs&tmpfs… Было бы интересно

    • google.com Андрей Токарчук:

      Спасибо! Хорошая идея кстати, думаю бенчмарки производительности GridFS будут темой следующей статьи :-)

    • Ну по сравнению с ФС, располагаемыми в памяти gridFS однозначно проиграет (тут помимо проигрыша самого gridFS еще и fuse внесет свою лепту).

  3. Ну если замахиваться на CDN, то логичнее было бы использовать модуль для nginx-а, вместо fuse

    С этим модулем, правда, есть проблемы — у него память течет. Нам пришлось искать и затыкать эти дыры.

    В плюсы к модулю можно записать появившеюся недавно возможность отдавать ETag и Last-Modify, что помогает сильно снизить нагрузку.

    В минус этому модулю — тормозные контрибуторы, развивается проект крайне медленно. Пулреквесты могут месяцами висеть

    Возвращаясь к gridFS, основным достоинством, на мой взгляд, является расширяемость «из коробки», плюс надежность (за счет репликации).

  4. Кстати, монговцы советуют ставить монгу из их собственного репозитория, т.к. в каноникловском у консольного клиента проблемы с поддержкой utf8

  5. Fm55:

    Система конечно отличная но есть и недостатки, а так супер

  6. [...] Пробуем кластерную файловую систему GridFS (ту, которая на MongoDB) + бенчмарк [...]

  7. Владимир:

    Все-таки, хотелось бы видеть, каким образом имея, например, 2 диски по 1 ТБ на разных серверах слепить их с помощью GridFS в единое хранилище.

    • google.com Андрей Токарчук:

      Устанавливаете монгу на оба сервера, обединяете их в replica-set. Ну а дальше пишете в коллекцию files используя либо языковой драйвер(ruby, php, etc) либо через fuse, что будет медленее. Читать можно через Nginx.

      • Владимир:

        Андрей, спасибо за ответ! Объеденил два сервера через реплика-сет, добавил арбитра. В статусе rs.status(); все отлично. Но, как я понял, такой вариант даст одинаковый набор файлов на двух серверах, которые объединены в реплику. А можно ли сделать за счет добавления реплик увеличение пространства, на котором можно сохранять файлы. То есть на одном сервере, например, есть 5ТБ места на диске, добавляем в реплику еще один такой же сервер и получаем 10ТБ?

        • google.com Андрей Токарчук:

          Не уверен, но вроде можно. Ваша задача — иметь одну точку входа для двух stortage-серверов, так?
          По логике вещей для этого надо использовать разные коллекции на разных серверах, а рулить всем этим будет mongos на балансировщике. К сожалению, практически я это не реализовывал (у нас был один gridfs-сервер), так что точнее не подскажу.

          • Владимир:

            Да, все верно, одну точку входа на нескольких серверах. Спасибо за ваши ответы. Буду разбираться.

        • Используйте шардинг. Это именно то, что Вам нужно.

  8. google.com Андрей Токарчук:

    Пожалуйста, Владимир! Желаю удачи в воплощении!

  9. playnet:

    Для хранения файлов проекта (исходный код скриптов, CSS, HTML и другие файлы) применяется надстройка SCF (Source Code Filesystem),

    Гугл такого не знает. Можно этот момент подробнее?

Комментировать