Принцип работы хостинга картинок

PlayTime

Новичок
Здравствуйте,
Занимаюсь разработкой движка для хостинга изображений. Есть покупной движок, но исправляя тот код через несколько месяцев пришел к выводу что лучше написать свой чем подпирать костылями старый.
И вот при разработке новых функций я столкнулся проблемами и пока мне трудно их решить.
Предполагается что загрузка изображений будет происходить не на один сервер а на несколько (s1.example.com, s2.example.com) будет сервер с mysql базой.
И вот тут я задумался. Как правильно организовать загрузку на какой то один сервер из списка? сервера могут быть в разных странах.
Первой идеей было помещать в форме адрес обработчика, тогда просто файл будет сразу отправлен на нужный сервер. Запрос страницы с изображением будет иметь вид s1.example.com/date/imgname//
Второй идее было все отправлять на сервер загрузки а он уже чтобы распределял на какой сервер загрузить файл и ответственно сам производил обработку. Также при втором варианте предполагалось что ссылка для просмотра страницы с изображением будет всегда вести на один сервер и только ссылка на сам файл будет с другого сервера.
Преимуществом первого варианта я вижу независимость каждого сервера (почти независимость так как нужен сервер mysql) но при этом каждый сервер должен иметь установленный apache и nginx. И испытывать большую нагрузку. хотя проведя мониторинг того что сейчас есть (а это около 150 000 просмотров в сутки) я заметил что самым слабым местом есть mysql. По этому предполагается отдельный сервер который потом можно масштабировать.
Во втором варианте есть один сервер (точка входа) который сам генерирует страницу и подставляет только линки на изображения. На серверах с изображениями установлен только nginx и он не производит никакой обработки изображений (возможно и будет apache но только для выполнения административных скриптов).
Таки образом можно иметь сервера для хранения файлов которые имеют не большие вычислительные мощностя и несколько серверов которые предназначены для обработки изображений, показа, и работы с базой.
В данный момент все это можно организовать на одном сервере но при росте нагрузки разделить на разные сервера не составит никакой проблемы.
Также будет АПИ для использования форм загрузки на других сайтах.
Здесь тоже было несколько вариантов.
Просто давать код для встраивания форм и при этом тот кто встраивает может изменить код как ему угодно а запрос к серверу (нашему) будет происходить только при загрузке.
Или использовать CURL. Подразумевается что загрузка будет происходить через CURL и результат загрузки будет получен через него.
Еще был вариант использования AJAX но он мне не понравился.

И вот тут проявилось еще одно преимущество второго способа. Так как при встраивании форм никто даже не должен подозревать что используется сторонний сервис все ссылки должны быть заменены. и вот если будет несколько серверов то тот кто встраивает форму соответственно должен создать CNAME записи на каждый из них.

В общем вот что я задумал. Но стал вопрос. Каким способом передавать файл на другой сервер после обработки его сервером загрузки? Ведь нужно получить еще ответ был ли загружен файл удачно. Возможно нужно даже сверять будет хеш отправленного и полученного файла.

Или может есть какой то другой способ организации такого сервиса? Так как у меня опыта в мало. Использовать другие языки не могу.
 

hell0w0rd

Продвинутый новичок
Я думаю вам нужно погуглить по запросу "балансировка нагрузки". http://blogerator.ru/page/high-load-balansirovka-nagruzki-servera-po-metodu-sticky-load-balancing вот на пример
также вы не учли что нужно хранить по 3 копии изображения на разных серверах. Проще всего вам будет использовать готовые облачные файловые хостинги как amazon s3. При вашей задаче не думаю что хватит одного только php, без использования сторонних хранилищ
поищите по yandex.events видео, где-то разбиралось как инстаграму избавится от amazon s3 и чего это будет им стоить, лекция была в виде обсуждения, очень интересно)
А по поводу загрузки - у вас должно быть api, а не встраиваемая форма
 

Adelf

Administrator
Команда форума
Почитайте статьи, типа этой - http://habrahabr.ru/post/184652/
Если вдруг сервис будет быстро расти - придется делать сложные архитектуры, вроде описанной.
 

PlayTime

Новичок
hell0w0rd, Прочитал то что вы дали, почитал еще немного. Видимо нужно пересмотреть схему. Я не планировал загружать изображения на все сервера. планировалось анализируя загруженности серверов выбирать для загрузки самый не нагруженный и хранить соответственно в базе сервер на который загруженный этот файл. Есть слабые места - при выходе из строя сервера файлы будут не доступны. Но пока я не вижу перспективы того что не будет хватать одного сервера на PHP который будет генерировать страницы и сервера с MYSQL. Скорей всего нужно будет несколько серверов MYSQL чем PHP. Анализировал я существующие подобные сервисы. Описанные в статье методы предполагаю что все сервера имеют одинаковые данные и запросы равномерно распределяются между ними.
В общем в эти дни позанимаюсь проверкой того что я написал и того прочитал.
Оценю преимущества и недостатки хранения файлов на одном сервере и на разных(в смысли копий). думаю что файл можно хранить на нескольких серверах но не на всех.
 

PlayTime

Новичок
Почитайте статьи, типа этой - http://habrahabr.ru/post/184652/
Если вдруг сервис будет быстро расти - придется делать сложные архитектуры, вроде описанной.
Вот этот способ как раз то что я предположил в конце сообщения #5. Думаю это лучший вариант хранения данных. И сохранность гарантирована и скорость. А сервис возможно и будет быстро расти а то даже на том что сейчас (а это очень плохой движок, некоторые запросы занимали около секунды) посещаемость все время растет. А с добавлением возможности использования на других сайтах это еще увеличит популярность его. Так как и сейчас есть договоренности с владельцами сайтов но пока через родной загрузчик.
 
Сверху