Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Для профи > Загрузка файлов на отдельный сервер(а)


Автор: Wowa 27.2.2009, 13:33
Когда проект большой, то используетеся несколько Application Server, что ведет к тому, что загружаемые юзером файлы должны на какой-то отдельный(-ые) файловый(-ые) сервак(-и) загружаться.
Реализация это задачи состоит из нескольких пунктов:

1. Определить сервак, куда файлы грузить. Это может делать самописная пхп-щная функция, которые анализирует севраки на их загруженность и предложит свободный сервак.

2. Собственно загрузить файл на нужный сервак.
Тут я вижу несколько вариантов реализации.
а) уже в форме задавать в action нужный сервак. Тогда файл  сразу же куда надо попадет.
б) загружать сначала на текущий application server, а с него на нужный сервак перегонять файл вследствии. 


3. Сохранить в БД данные о сервере содержащем файл(или содержащих файл, если для load balancing файл на нескольких серверах зеркалируется). Впрочем зерклалирование файла на другие сервера это отдельная процедура, которая должны выполняться уже после того, как файл хотя бы на один сервак загружен.


Итак.. С пунктами 1,3 мне все более-менее понятно. Интересует второй пункт, а именно загрузка файла на нужные сервак. Быть может у кого-то есть идеи, как это наилучшим образом сделать?

Автор: MoLeX 27.2.2009, 14:20
Wowa, я бы делал так:
1.
2.а
3

Добавлено через 1 минуту и 5 секунд
Цитата(Wowa @  27.2.2009,  13:33 Найти цитируемый пост)
загружать сначала на текущий application server, а с него на нужный сервак перегонять файл вследствии. 

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

Автор: IZ@TOP 27.2.2009, 15:48
Вова, существует множество способов. Все, разумеется, зависит от задачи.

Могу рассказать несколько.

1. Твой вариант "А". Думаю, мусолить его не имеет смысла, ввиду очевидности решения.
Резюме: минусов никаких не вижу как и плюсов.

2. Application Server (Upload Center, если угодно).
Итак, схема проста. Мы имеем клиентскую часть (форма), посредством которой происходит загрузка файла на Application Server (AS), которых может быть несколько - в зависимости от нагрузки и т.п.
AS вычисляет (скрипт, демон - не суть важно) какой из серверов файл-помоек достаточно подходит для хранения данных и загружает на него посредством WebDAV, например.

Резюме: из минусов - лишнее звено, с одной стороны. С другой стороны, повышается отказоустойчивость системы при использовании нескольких центров загрузки (или AS). Каким образом? 

Рассмотрим на примере варианта 1 и 2:

Представим ситуацию, когда у нас есть вебморда (FE, с пользовательским интерфейсом) и бэкенд часть, состоящая из AS и файл-помоек (FS), прикрытая балансером.

Один сервер FE - fe1; три сервера AS - as1, as2, as3; 10 серверов FS - fs1-fs10.

На основе предложения 1 при потере сервера fs3, если пользователю уже была сформирована форма на загрузку на 3-й сервер, он уходит в некуда.
На основе предложения 2 мы можем в реальном времени контролировать загрузку на FS. А поскольку AS у нас не один, то и отказоустойчивость данного звена повышена.

3. Предположим, загрузка идет по URL-у /upload/, балансер, при запросе данного URL-a, выбирает в качестве сервера самостоятельный FS из набора backend-ов и отправляет запрос ему. Думаю, дополнять не нужно, что сам сервер прописывает необходимые данные? В отличие от 2-го варианта, этот предполагает что-то большее, помимо легкого сервера для отдачи файлов, например Apache + PHP.

Это вкратце, что первое на ум приходит. Захочешь пообщаться на эту тему - стучи в асю. Все примеры рабочие, в продакшене (более 100 серверов).

Автор: Wowa 27.2.2009, 16:23
Цитата(IZ@TOP @  27.2.2009,  14:48 Найти цитируемый пост)
На основе предложения 2 мы можем в реальном времени контролировать загрузку на FS. А поскольку AS у нас не один, то и отказоустойчивость данного звена повышена.

Согласен это плюс в этом методе. Но минус - это дополнительный траф на AS и с него. А что если, перед непосредственной загрузкой файла посылать аякс-запрос на AS(или балансер) и определять наименее загруженный FileServer, туда и файл лить?

Добавлено @ 16:27
Насчет твоего третьего варианта: я не понял его отличие от второго.

Автор: Opik 15.3.2009, 23:46
Посоветую только по поводу первого пункта. На всех серверах запустить демон, который к примеру раз в 5 - 15 минут записывает данные о нагруженности в базу. Далее уже что бы получить менее нагруженный сервер брать данные из базы. Плюс этого метода таков, что не нужно каждый раз делать обход всех серверов на нагруженность.

Автор: Wowa 16.3.2009, 00:13
Opik, идея интересна, но у меня есть мысль имхо еще интереснее:
на каждый из серверов положить пхп-скрипт, который текущую нагрузку выводить будет. Таким обрахом будет достаточно по http опросить сервера и получить нагрузку на текущий момент. Должно работать быстро и никакого коннекта к базе.. Быть может кто-то видит недостатки такого способа, тогда просьба сообщить.

Автор: awers 16.3.2009, 09:17
Цитата(IZ@TOP @  27.2.2009,  16:48 Найти цитируемый пост)
3. Предположим, загрузка идет по URL-у /upload/, балансер, при запросе данного URL-a, выбирает в качестве сервера самостоятельный FS из набора backend-ов и отправляет запрос ему. Думаю, дополнять не нужно, что сам сервер прописывает необходимые данные? В отличие от 2-го варианта, этот предполагает что-то большее, помимо легкого сервера для отдачи файлов, например Apache + PHP.

лично я бы предпочёл этот вариант. 

Автор: IZ@TOP 16.3.2009, 13:44
Цитата(Wowa @  16.3.2009,  01:13 Найти цитируемый пост)
на каждый из серверов положить пхп-скрипт, который текущую нагрузку выводить будет. Таким обрахом будет достаточно по http опросить сервера и получить нагрузку на текущий момент. Должно работать быстро и никакого коннекта к базе.. Быть может кто-то видит недостатки такого способа, тогда просьба сообщить. 


На мой взгляд, если серверов предвидится достаточно большое количество, лучше собирать статистику на каждом сервере раз в определенный промежуток времени и накапливать эти данные в базе. С такими данными удобно работать. Опрашивать же сервера, лишние телодвижения. Хотя в нагрузку к статичным данным, можно еще тест сервера сделать, аля-балансер:-ты_здесь?серверN:-ага_я_тут. Я тебе кажется присылал даже схемку, которая на основе этих данных генерится. 
На основе этих же данных можно и определять сервера для регистрации. Естественно, нужно не забыть флажки offline (сервер сгорел или на ремонте, например) и disabled (запрещена регистрация, сервер не участвует в автоматических процессах и т.п.).

Цитата(awers @  16.3.2009,  10:17 Найти цитируемый пост)
лично я бы предпочёл этот вариант.  

Опять же, все зависит от ситуации.

Автор: Opik 18.3.2009, 23:53
Wowa, 
IZ@TOP, 
Вариант с опросом серверов вживую - обдумывал, но если серверов допустим 10, к каждому открыть свой сокет, считать... это намного дольше, чем просто  достать уже список из базы. а на каждом сервере раз в 5-15 минут записывать данные. от одного такого запроса имхо не убудет.  Пытаться грузить на него, сервер в оффе - ставим отметку что сервер упал и про него забываем, идем к след серверу. Но на том сервере все ещё висит скрипт, который если сервер все таки проснулся - отмечает и загрузку сервера в базу и снимает флаг оффа.

Автор: IZ@TOP 19.3.2009, 13:23
Цитата(Opik @  19.3.2009,  00:53 Найти цитируемый пост)
Вариант с опросом серверов вживую - обдумывал, но если серверов допустим 10, к каждому открыть свой сокет, считать... это намного дольше, чем просто  достать уже список из базы. а на каждом сервере раз в 5-15 минут записывать данные. от одного такого запроса имхо не убудет.  Пытаться грузить на него, сервер в оффе - ставим отметку что сервер упал и про него забываем, идем к след серверу. Но на том сервере все ещё висит скрипт, который если сервер все таки проснулся - отмечает и загрузку сервера в базу и снимает флаг оффа. 

По-моему я об этом уже написал  smile И мало того, у нас такая система на 90+ серверах функционирует.

Автор: Boxa 21.3.2009, 01:34
а какая система стоит? ставь nginx, там это уже реализованно до вас

Автор: Wowa 21.3.2009, 13:35
Цитата(Boxa @  21.3.2009,  00:34 Найти цитируемый пост)
а какая система стоит? ставь nginx, там это уже реализованно до вас 

Nginx upload module имеешь ввиду? Он ведь сохраняет файлы локально и на бэкэнд(который может быть отдельным сервером) передает местонахождение файла. Т.е. все равно пропускает весь трафик через себя, а канал ведь не резиновый.

А если ставить несколько upload-серваков с nginx, то опять проблема балансинга стоит, как в примере выше.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)