2009-07-03

Как работает MogileFS


  • Установка.

  • Настройка.

  • Основные понятия Хост/Устройство Домен/Класс. Как хранятся данные и каким образом отдаются.

  • Внутреннее устройство.

  • Выводы.


Установка


Весь процесс установки для Ubuntu можно прочесть тут: http://code.google.com/p/mogilefs/wiki/InstallOnUbuntu

Настройка


И привожу примеры своих рабочих конфигов (хранятся по-умолчанию в /etc/mogilefs).

---mogilefsd.conf ---
#daemonize = 1
db_dsn = DBI:mysql:mogilefs:host=127.0.0.1
db_user = root
#db_pass =
listen = 127.0.0.1:7001
conf_port = 7001
listener_jobs = 10
delete_jobs = 1
replicate_jobs = 5
mog_root = /mnt/mogilefs
reaper_jobs = 1

---mogstored.conf ---
maxconns = 10000
httplisten = 0.0.0.0:7500
mgmtlisten = 0.0.0.0:7501
docroot = /var/mogdata

Установить mogadm для администрования сервера MogileFS
Документация, исходные тексты и инструкция по инсталляции тут: http://search.cpan.org/~dormando/MogileFS-Utils/mogadm

Модуль для php: http://pecl.php.net/package/mogilefs/
Установка: http://projects.usrportage.de/index.fcgi/php-mogilefs/wiki/installation

Также по требуется nginx собранный с модулем mogilefs
Установка, конфигурация, исходники: http://grid.net.ru/nginx/mogilefs.ru.html
Стоит учесть, что порт трекера по-умолчанию 7001, в случае другого порта требуется указать его в настройках nginx

Основные понятия Хост/Устройство Домен/Класс. Как хранятся данные и каким образом отдаются.


domain> - глобальный неймспейс для трекера.
class - уникальный относительно домена идентификатор класса объекта, для которого могут быть настроены кастомные политики репликации. Обычно соответствует определенному типу файлов, скажем mp3, картинки.

host - физический сервер (коннектор трекера)
device - устройство для хранения данных при надлежащее некоторому хосту. На физическом уровне соответствует под папке в папке docroot(/var/mogdata) с соответствущим идентификатору названию + префикс dev (пример: dev1).

Для начала создадим хост:

# mogadm host add 127.0.0.1 --status=alive
# mogadm host list
127.0.0.1 [1]: alive
IP: 127.0.0.1:7500

Теперь добавим устройства с уникальным идентификатором "1" и "2" на сервере 127.0.0.1:

# mogadm device add 1 127.0.0.1 --status=alive
# mogadm device add 2 127.0.0.1 --status=alive
# mkdir /var/mogdata/dev1
# mkdir /var/mogdata/dev2
# chmod -R 700 /var/mogdata
# chown -R mogstored:nobody /var/mogdata
# cat /var/mogdata/dev1/usage
available: 13116348
device: /dev/sda6
disk: /var/mogdata/dev1
time: 1246615145
total: 21568432
use: 36%
used: 7356456

# mogadm device list
127.0.0.1 [1]: alive
used(G) free(G) total(G)
dev1: alive 7.016 13.553 20.568
dev2: alive 7.016 13.553 20.568

Все на этом законфилось конфигурирование физической части , теперь перейдем к добавлению домена (test) и класса(default1) с минимальным кочичеством копий данных на разных устройствах равным = 2

# mogadm domain add test
# mogadm class test default1 --mindevcount=2
# mogadm domain list
domain class mindevcount
-------------------- -------------------- -------------
test default1 2

Собственно все. На текущий момент у Вас работающая копия MogileFS с одним трекером 1 стораджем и 2 девайсами :)

Теперь напишем простой сркипт который положит себя в сторадж и достанет:

connect('127.0.0.1', 7001, 'test');
$client->put(__FILE__, 'self', 'default1');
$metadata = $client->get('self');
var_dump($metadata);
$client->close();
/*
array(3) {
["path2"]=>
string(51) "http://127.0.0.1:7500/dev2/0/000/000/0000000004.fid"
["path1"]=>
string(51) "http://127.0.0.1:7500/dev1/0/000/000/0000000004.fid"
["paths"]=>
string(1) "2"
}
*/

Тоесть видно что файлы хратся сразу на 2х устройствах, что соотвествует конфигурации, и их можно получить через веб напрямую с 7500 порта. Физически файлы также расположены оп приведенным путям. Балансирование через nginx позволяет стрыть реальные пути, и организовать контроль отдачи файлов, для защиты от скачивания или предоставления платного контента.

Внутреннее устройство





Рис. 1 Внутрее устройство MogileFS

Суть работы следующая существет множество трекеров и множество стораджей и всего одна база данных которая говрит, что и где сосбтвенно лежит.

Структура БД mogileFS

mysql> show tables;
+----------------------+
| Tables_in_mogilefs |
+----------------------+
| class | список классов
| device | список устройств
| domain | список доменов
| file | список файлов с уникальными ключами
| file_on | связка файл - устройство
| file_on_corrupt | связка файл -устройство
| file_to_delete | файлы для удаления
| file_to_delete_later | файлы для отложенного удаления
| file_to_replicate | файлы требующие репликации
| fsck_log | лог fsck
| host | список хостов
| server_settings | версия схемы данных
| tempfile | временные файлы
| unreachable_fids | битые файлы
+----------------------+


Put file:

  1. Файл загружается в трекер.

  2. Трекер создает запись в таблице file и загружает в сторадж после этого id файла помещается в таблицу file_to_replicate для репликации с другими серверами.

  3. Каждая реплика вычитает 1 из записи в таблице file_to_replicate. Производя копирование файла тебе отмечает в таблице file_on места хранения файла.

  4. Так продолжатся до тех пока запись в таблице file_to_replicate не достигнет 0, после чего запись удаляется и процесс реплицирования прекращается.



Get get:

  1. Идет подключение к одному из трекеров.

  2. Если файл не менялся данные берутся из кеша, если менялся трекер лезет в БД и смотрит где лежат файлы.

  3. После чего проверяется статус устройств alive/down

  4. Для живых устройств достаются сервера

  5. Трекер запрашивает сторадж для того, чтоб узнать жив он или нет.

  6. Найденные пути отдаются клиенту.


Выводы


Плюсы:

  • простота установки и поддержки

  • настройка параметров репликации

  • API библиотеки для всех популярных языков программирования


Минусы:

  • Как видно из архитектуры сервер БД - единая точка отказа. При выходе его из строя падает все.

  • Производительность решения ограничена производительностью сервера БД.

  • Не нативный интерфейс для загрузки и получения файлов.

Немає коментарів: