Пробуем кластерную файловую систему GridFS

Сейчас есть множество кластерных файловых систем, например 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)

2. Устанавливаем Mongodb. Нам нужна версия > 1.1.2

3. Скачиваем gridfs-fuse с помощью git (или вручную через github.com).
На самом деле авторским является вот этот репозиатрий, однако его исходники у меня не компилятся, а вот с репозитария chealand вполне.

4. Компилируем его с помощью scons

5. Монтируем GridFS
Теперь у нас скомпилился бинарник mount_gridfs, попробуем примонтировать его к нашей системе.

6. Проверяем работу GridFS, например попробуем скопировать файл utils.h в неё

А теперь попробуем прочитать его с помощью ls и mongofiles

Файл на месте, теперь для удобства можно перекинуть 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/

20 Comments

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

      1. это намек на hadoop? Там тоже читал. На хабре спросить не могу, акка нет.
        Гугл на
        “Source Code Filesystem” gridfs
        выдает только эту статью и хабр.

        1. Думаю имеется в виду возможность размещения Git/Svn репозитария в gridFS.

Leave a Comment