Модераторы: skyboy, MoLeX, Aliance, ksnk
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Загрузка файлов на отдельный сервер(а) 
:(
    Опции темы
Wowa
Дата 27.2.2009, 13:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
Group Icon


Профиль
Группа: Админ
Сообщений: 15017
Регистрация: 14.9.2000
Где: Винград

Репутация: нет
Всего: 290



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

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

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


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


Итак.. С пунктами 1,3 мне все более-менее понятно. Интересует второй пункт, а именно загрузка файла на нужные сервак. Быть может у кого-то есть идеи, как это наилучшим образом сделать?
PM WWW   Вверх
MoLeX
Дата 27.2.2009, 14:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Местный пингвин
****


Профиль
Группа: Модератор
Сообщений: 4076
Регистрация: 17.5.2007

Репутация: 0
Всего: 140



Wowa, я бы делал так:
1.
2.а
3

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

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


--------------------
Amazing  smile 
PM MAIL WWW ICQ   Вверх
IZ@TOP
Дата 27.2.2009, 15:48 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Панда-бир!
****


Профиль
Группа: Участник
Сообщений: 4795
Регистрация: 3.2.2003
Где: Бамбуковый лес

Репутация: 1
Всего: 73



Вова, существует множество способов. Все, разумеется, зависит от задачи.

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

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 серверов).


--------------------
Один из розовых плюшевых-всадников апокалипсиса... очень злой...

Семь кругов ада для новых элементов языка
Мои разрозненные мысли
PM MAIL WWW ICQ Skype GTalk   Вверх
Wowa
Дата 27.2.2009, 16:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
Group Icon


Профиль
Группа: Админ
Сообщений: 15017
Регистрация: 14.9.2000
Где: Винград

Репутация: нет
Всего: 290



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

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

Добавлено @ 16:27
Насчет твоего третьего варианта: я не понял его отличие от второго.
PM WWW   Вверх
Opik
Дата 15.3.2009, 23:46 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Vingrad developer
Сообщений: 1918
Регистрация: 6.10.2004
Где: Рига

Репутация: 3
Всего: 55



Посоветую только по поводу первого пункта. На всех серверах запустить демон, который к примеру раз в 5 - 15 минут записывает данные о нагруженности в базу. Далее уже что бы получить менее нагруженный сервер брать данные из базы. Плюс этого метода таков, что не нужно каждый раз делать обход всех серверов на нагруженность.
PM MAIL Skype   Вверх
Wowa
Дата 16.3.2009, 00:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
Group Icon


Профиль
Группа: Админ
Сообщений: 15017
Регистрация: 14.9.2000
Где: Винград

Репутация: нет
Всего: 290



Opik, идея интересна, но у меня есть мысль имхо еще интереснее:
на каждый из серверов положить пхп-скрипт, который текущую нагрузку выводить будет. Таким обрахом будет достаточно по http опросить сервера и получить нагрузку на текущий момент. Должно работать быстро и никакого коннекта к базе.. Быть может кто-то видит недостатки такого способа, тогда просьба сообщить.
PM WWW   Вверх
awers
Дата 16.3.2009, 09:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник
Сообщений: 1465
Регистрация: 22.3.2006
Где: Россия, Таганрог

Репутация: нет
Всего: 31



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

лично я бы предпочёл этот вариант. 
PM MAIL WWW ICQ Skype   Вверх
IZ@TOP
Дата 16.3.2009, 13:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Панда-бир!
****


Профиль
Группа: Участник
Сообщений: 4795
Регистрация: 3.2.2003
Где: Бамбуковый лес

Репутация: 1
Всего: 73



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


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

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

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

Это сообщение отредактировал(а) IZ@TOP - 16.3.2009, 13:46


--------------------
Один из розовых плюшевых-всадников апокалипсиса... очень злой...

Семь кругов ада для новых элементов языка
Мои разрозненные мысли
PM MAIL WWW ICQ Skype GTalk   Вверх
Opik
Дата 18.3.2009, 23:53 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Vingrad developer
Сообщений: 1918
Регистрация: 6.10.2004
Где: Рига

Репутация: 3
Всего: 55



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


Панда-бир!
****


Профиль
Группа: Участник
Сообщений: 4795
Регистрация: 3.2.2003
Где: Бамбуковый лес

Репутация: 1
Всего: 73



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

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

Это сообщение отредактировал(а) IZ@TOP - 19.3.2009, 13:24


--------------------
Один из розовых плюшевых-всадников апокалипсиса... очень злой...

Семь кругов ада для новых элементов языка
Мои разрозненные мысли
PM MAIL WWW ICQ Skype GTalk   Вверх
Boxa
Дата 21.3.2009, 01:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 12
Регистрация: 25.10.2006

Репутация: -2
Всего: -2



а какая система стоит? ставь nginx, там это уже реализованно до вас
PM MAIL   Вверх
Wowa
Дата 21.3.2009, 13:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
Group Icon


Профиль
Группа: Админ
Сообщений: 15017
Регистрация: 14.9.2000
Где: Винград

Репутация: нет
Всего: 290



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

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

А если ставить несколько upload-серваков с nginx, то опять проблема балансинга стоит, как в примере выше.
PM WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса

Внимание: данный раздел предназначен для решения сложных, нестандартных задач.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Для профи | Следующая тема »


 




[ Время генерации скрипта: 0.0884 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.