воскресенье, 10 февраля 2013 г.

GlusterFS

     Не так давно я открыл для себя GlusterFS. Если бы я сделал это на пару месяцев раньше - я бы съэкономил себе туеву кучу времени и нервов. Возможно мои записки помогут кому-то избежать этой ошибки. 
     Дело в том что в жизни каждого успешного проекта наступает момент когда он ну никак уже не умещается на одном фронте - поставить второй сервер и раскатать на него исходники - не большая проблема. Но как быть с загружаемым контентом ? Ведь почти в каждом приложении пользователям нужно заливать какие-нибуть файлики - которые должны быть доступны на всех фронтах. Как с ними быть ?
     1. Можно закинуть rsync(или другой его клон) в крон, и синхронизировать  таким образом загружаемый контент. Но это накладывает кучу ограничений - чтобы загрузка контента все время шла на один сервер,  нужно довольно большое  время на синхронизацию файлом между серверами, и чем больше размер загружаемого контента - тем больше времени будет требоватся rsync. В общем костыль он и есть костыль.
     2. Можно обрабатывать 404 запросы, и в случае отсутсвия какого-то файла - загружать его с главного сервера и скармливать nginx-у через X-Accel-Redirect
     3. Можно положить все файлы на nfs раздел - как-то худо бедно оно будет работать. До поры до времени так сказать. Медленность nfs помоему всем известна.
     4. Можно настроить GlusterFS. Не знаю как в режиме распределенного хранилища - но в режиме репликации чтение с GlusterFS должно быть таким же быстрым как и с локальной файловой системы. 
     Если немного подробнее - то GlusterFS может работаь в нескольких режимах. 
1. Распределенный режим - когда один файл записывается на первую ноду, второй на вторую, третий на третью и так далее.
2. Режим репликации - когда каждая нода хранит весь набор файлов. В этом режиме файловая система становится немного медленней на запись - за то скорость на чтение не отличается от чтения с локальной FS (оно так и происходит по факту), плюс вы получаете отказоустойчивать в подарок.  
  3. Также возможны промежуточные варианты - но об этом читайте подробнее в документации :-)